所以,我遇到了一些php OO的问题。我认为代码会解释得最好:
class foo {
$someprop;
public function __construct($id){
$this->populate($id);
}
private function populate($id){
global $db;
// obviously not the call, but to illustrate the point:
$items = $db->get_from_var1_by_var2(get_class($this),$id);
while(list($k,$v) = each($items)){
$this->setVar($k,$v);
}
}
private function setVar($k,$v){
// filter stuff, like convert JSON to arrays and such.
$this->$k = $v;
}
}
class bar extends foo {
$otherprop;
public function __construct($id){
parent::__construct($id);
}
private function setVar($k,$v){
// different filters than parent.
$this->$k = $v;
}
}
现在,假设我的foo表中有一些proppen,而我的bar表中有其他的prop,那么当我传入一个ID时,应该在我的对象上设置vars。
但是,出于某种原因,foo工作得很好,但是bar没有设置任何东西。
我的假设是它在$ this-> setVar()调用上分崩离析,并且调用了错误的setVar,但是如果get_class($ this)正在工作(它是),那么这不应该是$ bar,并通过关联,setVar()是$ bar方法?
任何人都会看到我遗失/做错的事情?
答案 0 :(得分:3)
您不能覆盖子类中的私有方法。实现类只知道私有方法,甚至不是子类。
你可以这样做:
class foo {
$someprop;
public function __construct($id){
$this->populate($id);
}
private function populate($id){
global $db;
// obviously not the call, but to illustrate the point:
$items = $db->get_from_var1_by_var2(get_class($this),$id);
while(list($k,$v) = each($items)){
$this->setVar($k,$v);
}
}
protected function setVar($k,$v){
// filter stuff, like convert JSON to arrays and such.
$this->$k = $v;
}
}
class bar extends foo {
$otherprop;
public function __construct($id){
parent::__construct($id);
}
protected function setVar($k,$v){
// different filters than parent.
$this->$k = $v;
}
}