向某些类公开受保护/私有属性

Posted

技术标签:

【中文标题】向某些类公开受保护/私有属性【英文标题】: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 类 【参考方案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。

【讨论】:

反射方法听起来不错。但我必须将可见性切换为公开才能实现这一点,这是一个相当大的开销。不过还是谢谢。

以上是关于向某些类公开受保护/私有属性的主要内容,如果未能解决你的问题,请参考以下文章

Python - 访问类的受保护成员_

将受保护的 Objective-C 实例变量公开给子类

php面向对象Object

我可以在 Java 中公开受保护的成员吗?我想从子类访问它

c++ public,protected,private

使用私有构造方法(公开成员属性或者公开静态工厂方法)或者枚举类实现singleton