说我有两个班级:
class ParentClass
{
public function getSomething()
{
return $this->variable_name;
}
}
class ChildClass extends ParentClass
{
private $variable_name = 'something specific to child class';
...
}
然后我调用代码来实例化ChildClass
并调用继承的getSomething()
方法:
$object = new ChildClass();
$value = $object->getSomething();
当我拨打最后一行时,它会给我一个错误,因为$variable_name
中不存在ParentClass
。我希望ChildClass
继承方法getSomething()
,但我理解,因为它未在ChildClass
中明确覆盖,所以它在运行时使用父级的范围该方法的父版本。
如何最有效地让ChildClass
继承方法和让它能够在调用所述方法时读取子类$variable_name
?
答案 0 :(得分:3)
经验法则:如果您的父类需要了解有关子类的任何信息,那么您就会做错事。
在设计类或接口时,首先应考虑它们可以执行的actions
(方法)。不要考虑他们的internal state
(变量)。
要解决您的特定问题,您应首先决定是否需要具有不同的对象状态或不同的操作。
对于不同的州,你可以实现类似的东西:
class ParentClass {
private $variable;
function __construct($var) {
$this->variable = $var;
}
function getSomething() {
return $this->variable;
}
}
class ChildClass extends ParentClass {
function __construct() {
parent::__construct('something specific to child class');
}
}
因此,变量是Parent的状态的一部分,而子对象必须初始化它。
另一种方法是签订合同:
abstract class ParentClass {
function getSomething() {
return $this->internalGetSomething();
}
abstract function internalGetSomething();
}
class ChildClass extends ParentClass {
function internalGetSomething() {
return 'something specific to child class';
}
}
所以,internalGetSomething是父母和孩子之间的契约
答案 1 :(得分:0)
简短回答:你不能。
答案很长:那不是OO的工作方式。家长班并不了解你的孩子。 你可以做的就是使用Reflection,但这不是你想要的方法,你需要重新考虑你的项目。
class Parent {
public function getSomething(Child $child) {
$reflection = new ReflectionObject($child);
$variable_name = $r->getProperty('variable_name');
$variable_name->setAccessible(true);
return $variable_name->getValue($child);
}
}
答案 2 :(得分:0)
就像你说的那样,ChildClass继承自ParentClass,而不是相反。对于ParentClass,$this->variable_name
是一个未知变量。我建议的一个简单方法是稍微更改ParentClass方法并在ChildClass中覆盖它:
class ParentClass
{
public function getSomething($param)
{
return $param;
}
}
class ChildClass extends ParentClass
{
private $variable_name = 'something specific to child class';
public function getSomething($param = "")
{
return parent::getSomething($param = $this->variable_name);
}
}
$object = new ChildClass();
$value = $object->getSomething();
echo $value;