在php中的子类和父类之间共享的属性

时间:2013-07-25 15:45:32

标签: php constructor inheritance

class parents{
    public $a;
    function __construct(){
        echo $this->a;
    }
}
class child extends parents{
   function __construct(){
        $this->a = 1;
        parent::__construct();
    }
}
$new = new child();//print 1

以上代码打印1,这意味着每当我们创建子类的实例,并为从其父类继承的属性赋值时,其父类中的属性也已被赋值。但下面的代码显示不同: / p>

class parents{
    public $a;
    function test(){
        $child = new child();
        echo $this->a;
    }
}

class child extends parents{
    function __construct(){
        $this->a = 1;
    }
}
$new = new parents();
$new->test();//print nothing

在哪里我为其子类赋值,而父级显然没有为子类赋值,为什么?

谢谢!

5 个答案:

答案 0 :(得分:0)

这是因为在第一个例子中你实例化了孩子

$new = new child();//print 1

并在第二个实例化父母

$new = new parents();

第二个使用$ new = new child();

与第一个相同

如果你想通过实例化child()来访问$ a,你需要这样做:

class parents{
    public $a;
    function test(){
        $child = new child(); //CHANGE HERE
        echo $child->a;
    }
}

class child extends parents{
    function __construct(){
        $this->a = 1;
    }
}
$new = new parents();
$new->test();

答案 1 :(得分:0)

当您实例化parent时,创建的child实例会将parent类扩展为test()函数。但是,这不会改变$a的价值。

答案 2 :(得分:0)

这种情况发生了,因为你有两个不同的实例,它们没有任何共同之处(除了继承......) 您可以使用内部类生成您的行为 - php不支持。

如果你想在每个实例上共享一个var accros,你必须使它成为静态

class parents{
    public static $a;
    function test(){
        $child = new child();
        echo self::$a;
    }
}

class child extends parents{
    function __construct(){
        self::$a = 1;
    }
}
$new = new parents();
$new->test();

这可能不是你想要的。或者你准确地说,你想要改变你的var

class parents{
    public $a;
    function test(){
        $child = new child();
        echo $child->a;
    }
}

class child extends parents{
    function __construct(){
        $this->a = 1;
    }
}
$new = new parents();
$new->test();

答案 3 :(得分:0)

在上面的示例中,由于构造函数是从子类调用的,因此它将正在使用的对象视为只是在父类中使用函数的子对象,就好像它是它自己的一样。

在底部示例中,您有两个独立的对象。父对象有$ a,孩子也是如此,但它们不是相同的$ a,因为它们包含在单独的对象中。因此,当您在父类中打印$ this-> a时,它指的是父类的$ a实例,而如果您在子类中设置$ this-> a = 1后回显$ a,它将显示该子类的$ a的实例。

希望这能为你清除一些东西。

答案 4 :(得分:0)

您正在混合对象组合和类继承。

继承(通过extends关键字实现)定义了is a关系。

组合定义has a关系。

为了说明这个概念,我们将从继承开始。

class Person {
    public $name;
    public function talk(){};
    public function poop(){};
}

class Parent extends Person {
    public function __construct($name) {
        $this->name = $name;
    }
}

class Child extends Person {
    public function __construct($name){
        $this->name = $name;
    }
}

在这个例子中,我们定义了一个名为People的class个东西。根据该定义,我们得出了人,父和子两种不同的子类型。当我们对一个类进行子类型化时,子类型获得它自己的所有属性的副本,并且可以访问基类型中定义的所有方法,因此在没有定义它的情况下,Child和Parent有一个名称,并且可以通过美德进行交谈和大便也是一个人。

例如:

$parent = new Parent("Homer");
$child = new Child("Bart");
$parent->talk();
$child->poop();

当您想要实现具有关系的船时,使用组合。让我们修改Parent的类型定义。

class Parent extends Person {
    public $children = array();

    public function __construct($name) {
        $this->name = $name;
    }
    public function addChild(Child $child){
        $this->children[] = $child;
    }
}

我们现在允许父母为have a孩子。

$parent = new Parent("Homer");
$child = new Child("Bart");
$parent->addChild($child);
// now I can access homers first child
echo $parent->children[0]->name;