0
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,这意味着每当我们创建一个子类的实例,并为从其父类继承的属性赋值时,其父类中的属性也已被赋值。但下面的代码显示不同:

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

在我为其子类分配值的地方,父类显然没有分配给其子类的值,为什么?

谢谢!

4

5 回答 5

1

在上面的例子中,由于构造函数是从子类调用的,所以它把正在使用的对象当作只是使用父类中的函数的子对象,就好像它是自己的一样。

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

希望这为您解决了一些问题。

于 2013-07-25T16:06:19.737 回答
1

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

继承(通过 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;
    }
}

在这个例子中,我们定义了一个class叫做 People 的事物。根据该定义,我们派生出两种不同的人子类型,即父母和子女。当我们对一个类进行子类型化时,子类型会获得它自己的所有属性的副本,并且可以访问基类型中定义的所有方法,因此如果没有定义它,子类型和父类型就有名称,并且可以说话和拉屎也是一个人。

例如:

$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;
于 2013-07-25T16:28:35.127 回答
0

这是因为在第一个示例中,您实例化了 child

$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();
于 2013-07-25T16:04:38.757 回答
0

当您实例化parent时, created 的实例将使用 to函数child扩展类。但是,这不会改变.parenttest()$a

于 2013-07-25T16:04:53.337 回答
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();
于 2013-07-25T16:05:26.067 回答