0

我有一个类库,它有一个名为 load 的属性,它是类加载的对象。加载类有一个名为 view 的函数,其中包含页面。现在我需要打电话,

这类似于 CodeIgniter 的 $this->load->view("test.php");

负载等级

class Load {
    public function view($page){
        //this function loads views to display
        include($page);
    }
    public function model($class){
        //loads model classes
    }
    public function library($class){
        //loads libraries
    }
}

基类

class Base {
    function __construct(){
        $this->load = new Load();
    }
}

索引页面

$base = new Base();
$base->load->view("test1.php");

this1.php

echo "testing1\n";

$this->load->view("test2.php");

test2.php

echo "testing2";

输出应该是

testing1
testing2
4

2 回答 2

1

我认为您真正想要的是遵循工厂模式。(至少,如果您希望$view变量实际包含Load该类的实例,这就是您的意思)

使构造函数受保护,以便只有该类可以创建新实例,然后在基类中添加一个静态方法,例如“工厂”,它返回所需类的实例。

然后你的代码看起来像

$view=Base::factory();
$view->view("test1.php");
于 2013-07-24T07:04:58.727 回答
0

注意:此答案是在对问题进行任何编辑之前做出的。请相应评价

您需要将函数标记为public允许从定义类外部调用它们(这当然是简化的)

尝试以下操作:

class Load{
    public function view($page){
       include($page);
    }
}

class Base{
    public $load;
    function __construct(){
        $this->load = new Load();
    }
}

(大写的类名是我自己的偏好)

这应该可行,但从干净的 OOP 角度来看,这不是一个好的设计,因为Base该类的用户需要知道Load该类是如何工作的。这称为“紧耦合”,应尽可能避免。

我建议考虑以下替代方案:

class Load{
    public function view($page){
       include($page);
    }
}

class Base{
    private $load; //note the private modifier
    function __construct(){
        $this->load = new Load();
    }

    public function view($page){
        $this->load->view($page);
    }
}

这样我只需要知道它Base有一个方法view($page),我根本不需要知道什么Load

如果将来您想更改 Load 类,您可以在后台进行,而Base用户不会注意到它,如果您做对了:

假设你定义了一个类:

class BetterLoad {
    private function foo(){
         //do something awesome
    }

    private function advancedView($page){
         include($page);
         $this->foo();
    }
}

并且您想将其合并到内部Base而不是旧的加载。

class Base{
    private $adv_load; //note the private modifier
    function __construct(){
        $this->adv_load = new BetterLoad();
    }

    public function view($page){
        $this->adv_load->advancedView($page);
    }
}

而已。您无需更改代码中的任何其他内容。继续使用旧的$base_obj->view($page)就可以了,甚至没有注意到变化。

于 2013-07-24T07:02:27.127 回答