【问题标题】:Access child property with conflicting name from parent class in PHP从 PHP 中的父类访问名称冲突的子属性
【发布时间】:2011-07-29 17:08:15
【问题描述】:

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

考虑以下示例:

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,因为它返回自己私有的$n 的值。

是否可以从父级获取子级 protected $n 的值?

【问题讨论】:

    标签: php oop class inheritance


    【解决方案1】:

    通常情况下,你不能。您必须声明 A::$n protectedpublic,因为私有成员始终具有优先权。如果您将A::$n 声明为公开,那么B::$n 也需要公开,因为您不能覆盖可见性低于其父级的属性。您只能使用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
    

    【讨论】:

    • 谢谢,这非常适合我想做的事情,因为反射已经在该课程上用于其他目的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 2014-01-30
    • 1970-01-01
    • 2017-05-31
    • 2015-08-07
    相关资源
    最近更新 更多