我希望课程B
能够访问课程protected
的{{1}}属性x
。
重要的是要注意,我不想让A
x
,也不想通过public
函数公开其内容。
唯一应该有getter
访问权限的类是A->x
和A
。
B
我正在寻找实现这一目标的解决方案。
答案 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。