【问题标题】:Expose protected/private attributes to certain classes向某些类公开受保护/私有属性
【发布时间】:2013-10-10 16:21:30
【问题描述】:

我想让B 类能够访问A 类的protected 属性x。 需要注意的是,我不想创建 xpublic,也不想通过 getter 函数公开其内容。 应该有权访问A->x 的唯一类是AB

<?php
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();

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

【问题讨论】:

  • B 类扩展 A 类

标签: php class scope protected


【解决方案1】:

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

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

您正在通过将A 类传入B 类来实现composition。组合使用一个类使用另一个类。例如,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();

【讨论】:

  • AB 不得相互扩展。否则我会那样做。
  • @StefanKass:我认为你需要反思。请参阅我编辑的答案。
  • @StefanKass:我刚刚阅读了您的评论。你似乎想要一个设计模式。没有这样的设计模式。因为您似乎试图打破封装,这是 OOP 的基本部分。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    用 B 类扩展 A 类。

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

    【讨论】:

    • 反射方法听起来不错。但我必须将可见性切换为公开才能实现这一点,这是一个相当大的开销。不过还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2023-04-08
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 2012-12-05
    相关资源
    最近更新 更多