我实例化类时调用自身

时间:2016-07-16 18:58:18

标签: php model-view-controller

我有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();
   }
}

这是我的主要Controller类:

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;
    }
}

我的主要Model类:

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();
    }

}

1 个答案:

答案 0 :(得分: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开始,与命名空间类名称的最后一个元素同名的方法将不再被视为构造函数。” - so这也将消除这个问题。 http://php.net/manual/en/language.namespaces.rationale.php