【问题标题】:method calls itself when I instantiate the class当我实例化类时方法调用自身
【发布时间】:2016-07-16 18:58:17
【问题描述】:

我有 OOP 编程的基本技能,我正在尝试创建一个非常简单的 MVC 框架。奇怪的是,当我实例化应用程序时 index 方法会调用自己并且无法找出原因。

我的索引文件有这个:$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();
    }

}

【问题讨论】:

  • 在 PHP 4 中,与类同名的方法用作构造函数 - 它仍然用作兼容性回退。 (这里在某些方面不区分大小写。)
  • 那么你的意思是如果类和它的方法有相同的名字,当我实例化这个类时方法会被调用?

标签: php model-view-controller


【解决方案1】:
class Index extends Controller {

    public function index() {

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

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

"为了向后兼容 PHP 3 和 4,如果 PHP 找不到给定类的 __construct() 函数,并且该类没有从父类继承,它将搜索旧式构造函数,由类的名称。”

(PHP 在某些方面不区分大小写在这里是最重要的。)

[来自 cmets] 那么你的意思是如果类及其方法具有相同的名称,那么当我实例化该类时将调用该方法?

是的。

您要么必须重命名该方法,要么通过类本身或其扩展的类中名为 __construct 的方法提供构造函数。


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

【讨论】:

  • 但是我的本地服务器上运行的是 PHP 5.6.10 版?
  • 是的,这就是重点。这是一个向后兼容的“功能”
  • 正如我所说,这是一种兼容性回退 - PHP 5 模仿旧行为,因此在 PHP 4 或 3 下编写的脚本仍然可以在这方面不加修改地运行。
  • 我明白了。太感谢了! :)
  • 命名空间类自 PHP 5.3.3 起就没有这个问题,所以你可能想研究一下(见编辑)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 2012-01-31
相关资源
最近更新 更多