向某些类公开受保护/私有属性
Posted
技术标签:
【中文标题】向某些类公开受保护/私有属性【英文标题】:Expose protected/private attributes to certain classes 【发布时间】:2013-10-10 16:21:30 【问题描述】:我想让B
类能够访问A
类的protected
属性x
。
需要注意的是,我不想创建 x
或 public
,也不想通过 getter
函数公开其内容。
应该有权访问A->x
的唯一类是A
和B
。
<?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
可以扩展类rectangle
。 square
类将具有 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();
【讨论】:
A
和 B
不得相互扩展。否则我会那样做。
@StefanKass:我认为你需要反思。请参阅我编辑的答案。
@StefanKass:我刚刚阅读了您的评论。你似乎想要一个设计模式。没有这样的设计模式。因为您似乎试图打破封装,这是 OOP 的基本部分。【参考方案2】:
声明为受保护的成员只能在类本身内以及被继承类和父类访问
【讨论】:
【参考方案3】:用 B 类扩展 A 类。
如果您不想用 B 类扩展 A 类,另一种方法是使用 Reflection。
【讨论】:
反射方法听起来不错。但我必须将可见性切换为公开才能实现这一点,这是一个相当大的开销。不过还是谢谢。以上是关于向某些类公开受保护/私有属性的主要内容,如果未能解决你的问题,请参考以下文章