将PHP对象实例更改为父对象


Change PHP Object Instance to a Parent

我有一个基类,它有一个名为load的属性,它是类load的对象。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

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

使构造函数受到保护,这样只有类才能创建新实例,然后在基类中添加一个静态方法,例如"factory",该方法返回所需类的实例。

然后你的代码看起来像

$view=Base::factory();
$view->view("test1.php");

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

您需要将函数标记为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中,而不是旧的Load中。

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),你就可以继续使用,甚至不会注意到变化。