扩展类中的实例化

时间:2012-03-22 14:11:14

标签: oop php-5.3 php

我正在开发一个自定义框架,并且通过子类有几个关于父类实例化的问题。

我会粘贴一些代码段,然后进入问题

class CFrameWork {

    private $applicationName = "Application Name";

    function __construct($instance = "development") {
        echo "Hello, I am the Parent and I have been constructed<BR />";
    }

    public
    function startApplication() {
        $this->checkMaintenanceMode();
        if (!isset($_GET['query'])) {
            $this->intialize();
        } else {
            // Call the appropriate controller
            // Method and function are pulled from the query
            // Code not displayed
            // EDITS BELOW

            if (method_exists($method, $function)) {
                try {
                    call_user_func(array(new $method, $function), $this);
                } catch (CFException $exp) {
                    $this->show404();
                    exit;
                }
            } else {
                $this->show404();
                exit;
            }
        }
    }

}

接下来我们有一个控制器类

class childController extends CFrameWork {

    function index() {
        echo "Index Controller";
    }

    function register() {
        echo "Registration Controller";
    }
}

现在在index.php中,我有

$application = new CFrameWork();
$application->startApplication();

此框架解释查询的方式:

  

localhost / childController / index - 在类childController中调用index()函数   localhost / childController / register - 在类childController

中调用register()函数

依旧......

所以这是我的担忧。每次调用控制器方法时,此框架中的父类都会实例化两次。一旦通过index.php(创建初始应用程序),然后由控制器进行扩展。换句话说,每次到达控制器方法时,都会再次创建CFrameWork :: __ construct()。

我的问题:

  

1)这有害吗?

     

2)可以避免这种情况吗?

     

3)有关如何以不同方式做到这一点的任何建议吗?

2 个答案:

答案 0 :(得分:1)

PHP应用程序仅存在很短的时间:

  1. 您转到网页。
  2. 解释脚本并生成输出。
  3. 脚本退出。
  4. 这是大多数脚本语言(如PHP)的预期和推荐的工作流程。这意味着每次访问页面时,都必须创建一个新类,因此每次都会调用构造函数。所以回答你的问题:

    1. 这会产生任何有害影响吗?
      一般来说,没有。这是应该如何工作的。它是否会对您的应用程序产生有害影响取决于您在构造函数中正在做什么。

    2. 可以避免这种情况吗?
      使用缓存或序列化以及保存类实例可以避免这种情况,但我终生无法想出为什么要这样做的充分理由。

    3. 有关如何以不同方式执行此操作的任何建议?
      我不会这样做。这是Model-View-Controller pattern应该如何工作的方式。看看像Yii,CodeIgniter,CakePHP这样的流行框架 - 它们都像你一样。

答案 1 :(得分:0)

这在几个层面都很糟糕:

    • 正如Jon已经指出的那样,你的对象继承没有意义。
    • childController类现在有两组职责:采取行动并执行路由,这就是打破SRP。它们应该是两个完全独立的类。
  1. 创建专门处理路由的类。它将是处理$_GET['query']的那个。为该类提供方法getControllerName() ..或其他内容getControllerMethod()。你怎么称呼它们并不重要。重要的是你用index.php创建新Controller实例的方法的结果,并在该控制器上执行操作。

  2. 除了2.中的内容,您应该了解什么是SOLID原则,Demeter的法则是什么,依赖注入是什么。然后才尝试重新制作MVC框架。