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>
答案 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);