我有以下课程。
class User extends GenericObject {
private $table='users';
private $primary_key='id';
}
class Animal extends GenericObject {
private $table='animals';
private $primary_key='id';
}
class GenericObject {
public static function create_from_db($params) {
$self = new self();
//Build PDO query here
//These echo statemtns fail
echo $self->table;
echo $self->primary_key;
return $self;
}
}
在我想要做的与这些类接口的代码中:
$animal=Animal::create_from_db($params);
$user=User::create_from_db($other_params);
我使用超类的意义是,我不必一遍又一遍地复制create_from_db函数。
我尝试覆盖父类并调用它,但我不确定实现我想要完成的“正确”方法。
任何提示
答案 0 :(得分:1)
要访问这些变量,您应该修复两件事。使属性"受保护"而不是私有,以便可以从父类访问它们并更改新语句以使用" new static()"因为那将实例化Animal或User类而不是" new self()"因为它实例化了GenericObject类。
class User extends GenericObject {
protected $table='users';
protected $primary_key='id';
}
class Animal extends GenericObject {
protected $table='animals';
protected $primary_key='id';
}
class GenericObject {
public static function create_from_db($params=[]) {
$self = new static();
//Build PDO query here
//These echo statements will not fail
echo $self->table . PHP_EOL;
echo $self->primary_key . PHP_EOL;
return $self;
}
}
答案 1 :(得分:-3)
“我使用超类的意义是,我不必一遍又一遍地复制create_from_db函数。”这是错误的,使用一个特征。在traits中定义的代码可以访问导入它们的类的私有字段。