PHP创建子类,它是父类的实际实例

时间:2016-02-19 05:32:50

标签: php oop

好的 - 我正在尝试做的事情有点令人费解,我不确定它是否可能或者是否有其他“正确”的方法来做到这一点但是这里简单来说:

class foo {

    var $testvar = "foo";

    function doTest() {

        echo $this->testvar . "\n";

        $t = new bar;
        $t->updateParent();

        echo $this->testvar;

    }

}

class bar extends foo {

    function updateParent() {
        $this->testvar = "bar";
    }

}

/*
What I get:
foo
foo

What I want:
foo
bar
*/

我这样做的原因是我正在设计一个模板引擎,基本上我的目的是foo类是拥有大量应用程序代码的主类。系统的设计使用户可以创建自己的模板php文件,这些文件由应用程序在foo方法的上下文中加载。我想将foo的所有属性和方法设置为私有保存,以保存某些将被保护并因此可以访问的条件。关键是我希望用户模板php代码在我包含他们的代码时只能访问父类的有限数量的函数。

更好的例子是:

class foo { 
    protected $db;
    private $settings;

    function SomeAction() {

        // some code that results in a template needing to be loaded
        // code that determines the template file

        $template = new bar;
        $template->loadTemplate($file);
    }
}

class bar extends foo {

    function loadTemplate($file) {

        //if file exists
        require($file);
        // has access $db driver class (without creating a new instance of it)
        // does not have access to the $settings property

    }

}

任何想法?

4 个答案:

答案 0 :(得分:1)

我觉得你扩展foo课只是为了提供$db的访问权限可能会有更多属性。但这对我没有意义。您应该将依赖项传递给这两个类。

class foo { 
    protected $db;
    private $settings;

    function SomeAction(bar $bar) {

        // some code that results in a template needing to be loaded
        // code that determines the template file
        $bar->loadTemplate($file);
    }
}

class bar {

    function loadTemplate($file, Gateway $db) {
        // use $db here
        //if file exists
        require($file);        

    }

}

答案 1 :(得分:0)

我相信你正在寻找parent

尝试一下:

    class foo {

    var $testvar = "foo";

    function doTest() {

        echo $this->testvar . "\n";

        $t = new bar;
        $t->updateParent();

        echo $this->testvar;

    }

}

class bar extends foo {

    function updateParent() {
        parent::testvar = "bar";
    }

}

/*
What I get:
foo
foo

What I want:
foo
bar
*/

答案 2 :(得分:0)

试试这个

 <?php
class foo {

    var $testvar = "foo";

    function doTest() {

        echo $this->testvar . "\n";


        $R =$this->updateParent();

        echo $R;

    }

}

class bar extends foo {

    function __construct()
    {
         parent:: doTest();
    }
    function updateParent() {
         $testvar = "bar";

         return $testvar;

    }

}
 $t = new bar;

您应该使用特殊名称parent,而不是在代码中使用基类的文字名称,它指的是类的扩展声明中给出的基类名称

答案 3 :(得分:0)

每个对象实例也是它的父实例。 您在父级中将所有属性设为私有,并通过公共方法提供安全访问。所有公共方法都可以用于子类,就像它们自己的一样,无法访问私有属性。

class foo {

    private $db;

    public function dbSelect() {

        return $this->db->select();// Example

    }

}


class bar extends foo {

    public function loadTemplate($file) {

        require($file);

        $selected = $this->dbSelect();

    }

}