所以我有一个班级Son
的对象:
class Son extends Father {
$_modelName = 'House';
}
另一个班级Daughter
:
class Daughter extends Father {
$_modelName = 'Museum';
}
我希望他们的父类Father
能够在各自的对象上调用静态方法。
class Father {
public function foo() {
$className = $this->_modelName;
return $className::bar();
}
}
编辑:基本上,我希望能够调用foo()
方法,并从相应的模型类调用bar()
方法,避免使用额外的变量({{ 1}})?我试了$className
没有成功。
答案 0 :(得分:2)
我认为从模型名称作为字符串很难实现,但也许你可以考虑的事情有点不同?
从php 5开始,我们可以将对象分配给变量without moving the entire object around
这意味着当您将modelName
分配到Son
或Daughter
课程时,您可以轻松指定它...
......全班!
想象一下:
class Father {
private $model;
public function __construct($model) {
$this->model = $model;
}
public function foo() {
return $this->model->bar();
}
}
class Son extends Father {
}
class Daughter extends Father {
}
这假定您使用此模型对象构造Son
和Daughter
类。该函数不是静态的,因为我们需要一个构造函数来将模型分配给一个属性。
public function foo($model) {
return $model->bar();
}
关于dependency injection原则,允许您非常轻松地实现foo()
函数,并且取决于继承等有些复杂的设计问题,这要好得多。
它释放你从这个函数的依赖,因为你可以将任何$model
对象传递给foo方法。
答案 1 :(得分:0)
或者你可以这样做:
<?php
class Son extends Father {
protected $_modelName = 'House';
}
class Daughter extends Father {
protected $_modelName = 'Museum';
}
class Father {
protected $_modelName = 'Father';
public function getModelName() {
return $this->_modelName;
}
}
$father = new Father();
$son = new Son;
$daughter = new Daughter();
echo $father->getModelName();
echo $son->getModelName();
echo $daughter->getModelName();
?>