2016-07-16 33 views
2

我有OOP编程的基本技能,我想创建一个非常简单的MVC框架。奇怪的是,索引方法在我实例化应用程序时调用自身,但无法找出原因。方法调用自己,当我实例化类

我的索引文件有这样的:$ app = new App();

我举看起来是这样的:

class App { 

    private $_controller = null; 

    public function __construct() { 
     $default_controller = 'controller/index.php'; 
     require $default_controller; 
     $this->_controller = new Index(); 
    } 
} 

这里是我的主控制器类:

class Controller { 

    public function loadModel($name) { 
     require('models/'. strtolower($name) .'.php'); 

     $model = new $name; 
     return $model; 
    } 

    public function loadView($name) { 
     $view = new View($name); 
     return $view; 
    } 
} 

我的主模型类:

class Model { 

    public function __construct() { 
     $this->db = new DB(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT); 
    } 

} 

这里是我的索引类:

class Index extends Controller { 

    public function index() { 
     $example = $this->loadModel('Index_Model'); 
     $something = $example->content('test'); 

     $view = $this->loadView('index'); 
     $view->set('content', $something); 
     $view->render(); 
    } 

} 
+0

在PHP 4中,与作为构造函数的类相同名称的方法 - 它仍被用作兼容性回退。 (某些方面的不区分大小写在这里最重要。) – CBroe

+0

所以,如果类和它的方法具有相同的名称,那么当我实例化类时方法将被调用? – Dejavu

回答

5
class Index extends Controller { 

    public function index() { 

在PHP 4中,与作为构造函数的类同名的方法 - 它仍用作兼容性回退。

http://php.net/manual/en/language.oop5.decon.php

“对于PHP 3和4的向后兼容性,如果PHP不能找到一个给定类__construct()函数,类没有继承一个从父类,它会按类的名称搜索旧式构造函数。“

(PHP在某些方面不区分大小写亮起顶部在这里。)

[自评]所以你的意思是,如果类及其方法具有相同名称的方法将被调用时,我实例化类?

是的。

您将不得不重新命名该方法,或者通过名称为__construct的方法在类本身或其扩展的方法中提供构造方法。


编辑:
当你潜入MVC如你所说,你可能要考虑的命名空间。正如我链接到的手册页所述,“从PHP 5.3.3开始,具有与名称空间类名的最后一个元素相同名称的方法将不再被视为构造函数。” - 这样可以消除问题。 http://php.net/manual/en/language.namespaces.rationale.php

+2

我很高兴地说我不认为我会知道... – Jonathan

+0

但我在本地服务器上运行PHP 5.6.10版本? – Dejavu

+0

是的,这是关键。这是一个向后兼容的“功能” – Jonathan

相关问题