php - 从 PHP 中的父类访问具有冲突名称的子属性

标签 php oop class inheritance

当父类和子类共享相同的属性名称但具有不同的可见性时,是否可以从父类访问子属性?

考虑以下示例:

abstract class A {
    private $n = 1;

    public function getN() {
        return $this->n;
    }
}

class B extends A {
    protected $n = 2;
}

$b = new B;
echo $b->getN(); // returns 1

getN()返回1,因为它返回的是自己私有(private)的$n的值。

是否有可能从父代获取子代 protected $n 的值?

最佳答案

通常情况下,您不能。您必须声明 A::$n protectedpublic,因为私有(private)成员始终具有优先权。如果您将 A::$n 声明为 public,则 B::$n 也需要是 public,因为您无法覆盖可见性低于其父级的属性。您只能使用 Reflection API 来做到这一点:

abstract class A {
    private $n = 1;

    public function getN() {
        $ref = new ReflectionProperty($this, 'n');
        $ref->setAccessible(true);
        echo $ref->getValue($this);
    }
}

class B extends A {
    protected $n = 2;
}

$b = new B;
echo $b->getN(); // 2

关于php - 从 PHP 中的父类访问具有冲突名称的子属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6876590/

相关文章:

javascript - 在输入 html 表单上从 java 脚本传递参数

php - 在一个查询中插入多行求和

php - 如果没有结果,MySQL 回退查询

java - 覆盖字段初始化

c++ - 奇怪的这个->行为

php - 清除 PHP Cookies 数组

c++ - 复制赋值函数如何访问另一个对象的私有(private)成员(Stroustrup 原则与实践书)?

java - 访问类字节?

java不支持的操作异常

oop - 抽象和封装有什么区别?