扩展类实例无法访问父项的注入属性

时间:2015-11-30 17:09:28

标签: php

class dog {

    public $id = 0;
    public function __construct($attributes = array()) {

        foreach($attributes as $field=>$value){
          $this->$field = $value;
        }

    }
}

$data = array('id' => 123);
$dog = new dog($data);

class poodle extends dog {

}

$poodle = new poodle();

var_dump($poodle->id);

var_dump给出0而不是123.这是玩具代码而不是真实代码,因此可能存在一些语法错误,但应该说明我的问题。

作为旁注,我保持公开而不是保护以便于直接访问而不必设置50多个getter,并且因为不需要对属性进行验证,并且一旦设置它们就不会更改其他代码。< / p>

3 个答案:

答案 0 :(得分:1)

我认为你误解了对象是如何工作的。

class dog {

    public $id = 0;
    public function __construct($attributes = array()) {

        foreach($attributes as $field=>$value){
          $this->$field = $value;
        }

    }
}

class poodle extends dog {
}

当我在dog类上调用构造时,我得到一个dog对象;这是一个独立的变量,本身就是完整的。如果我然后创建一个poodle对象,那就是一个新的独立对象。该类基本上是一个蓝图,用于显示对象在创建时的外观 - 当您更改对象的值时,您无法更改类本身。

对于你想要做的事情,你必须以不同的方式接近它 - 你不能在一个对象中设置一个值,然后能够在另一个对象中访问它。相反,像:

class DB {
    public function __construct($attributes) {
        // set up database connection here
    }
}

class User {
    public $DB;

    public function __construct ($DB) {
        $this->DB = $DB;
    }
}

$myDB = new DB();
$myUser = new User($DB);

这可以让你设置一个数据库类,你可以传递给第二个对象;数据库对象中所做的更改将过滤到您的用户

答案 1 :(得分:0)

您需要将父项的构造添加到扩展类中。

 class poodle extends dog {

    public function __construct(){
        parent::__construct();
    }

}

答案 2 :(得分:0)

  

狮子狗从狗延伸,然后狮子狗也是狗。 $ poodle = new poodle()是创建新对象,然后它总是为id属性返回Zero,因为它是新对象。

尝试:

$data = array('id' => 123);
$dog = new dog($data);
var_dump($poodle->id);

$poodle = new poodle($data);
var_dump($poodle->id);