如何从PHP中的继承父类方法引用子类变量?

时间:2016-05-17 20:48:34

标签: php class oop inheritance methods

说我有两个班级:

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

3 个答案:

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