将protected / private属性公开给某些类

时间:2013-10-03 20:00:02

标签: php class scope protected

我希望课程B能够访问课程protected的{​​{1}}属性x。 重要的是要注意,我不想让A x,也不想通过public函数公开其内容。 唯一应该有getter访问权限的类是A->xA

B

我正在寻找实现这一目标的解决方案。

3 个答案:

答案 0 :(得分:2)

如果类B扩展了类A,则类B将可以访问受A个成员保护的成员。 子类可以访问父类的受保护成员。子类也可以覆盖父类的方法。

当一个类扩展另一个类的功能时,您使用继承(父/子关系)。例如,类square可以扩展类rectangle。类square将具有类rectangle的所有属性和功能以及它自己的属性和功能,使其与rectangle不同。

您正在通过将班级A传入班级B来实施撰写。组合使用一个类使用另一个类。例如,user类可以使用database类。

    class A
    {
        protected $x = 'some content';
    }

    class B
    {
        protected $a;

        public function __construct(A $a)
        {
            $this->a = $a;
        }

        public function print_x()
        {
            print '???';
        }
    }

    $b = new B(new A());
    $b->print_x();

推荐读物: http://www.adobe.com/devnet/actionscript/learning/oop-concepts/inheritance.html

http://en.wikipedia.org/wiki/Inheritance_%28object-oriented_programming%29

http://eflorenzano.com/blog/2008/05/04/inheritance-vs-composition/

如果你必须使用反射,那么你可以试试这个:

class A
{
    protected $x = 'some content';
}

class B 
{
    protected $a;

    public function __construct(A $a)
    {
        $this->a = $a;
    }

    public function print_x()
    {
        $reflect = new ReflectionClass($this->a);
        $reflectionProperty = $reflect->getProperty('x');

        $reflectionProperty->setAccessible(true);

        print $reflectionProperty->getValue($this->a);

    }
}

$b = new B(new A());
$b->print_x();

答案 1 :(得分:1)

声明受保护的成员只能在类本身以及继承和父类

中访问

答案 2 :(得分:1)

用B类扩展A类。

如果您不想使用B类扩展A类,则另一种方法是使用Reflection