我对以下陈述感到困惑......
声明受保护的成员只能在类中访问 本身以及继承和父类。成员宣布为 private只能由定义成员的类访问。
这是在运行时访问其他对象成员的实例化对象的问题,还是在管理覆盖子级中父类成员时允许的内容?
如果它是前者,这是否意味着如果两个对象属于同一类型,则可以访问“受保护”的每个其他成员。如果是这样,他们将如何做到这一点?
答案 0 :(得分:2)
class Foo {
protected function protector() {
$this->privateEye(); // works
}
private function privateEye() {
...
}
}
class Bar extends Foo {
public function baz() {
$this->protector(); // works
$this->privateEye(); // fails
$obj = new self;
$obj->protector(); // works
$obj->privateEye(); // predictably fails as well
}
}
同一层次结构中的任何类都可以访问protected
方法
只有声明类本身才能访问private
方法
两者都不限于$this
,它适用于类的上下文中的任何对象。
这里要记住的理性是一个类应该知道它自己的实现,因此可以信任适当地调用它自己的方法/适当地访问它自己的属性。没关系如果类只在自身或相同类型的其他对象上执行此操作。这个想法是你希望保持复杂的功能或半生不熟的代码在整个地方使用。通过设置protected
,您至少可以确保只有密切相关的代码可以调用它,而private
可以使调用更加本地化。您只应将尽可能多的代码暴露给“更广泛的受众”,以使该类有用。将所有其他内容封装在课堂中,以确保您将来可以灵活地使用它。
答案 1 :(得分:1)
从低到高的顺序可见性:
像这样:
class Parent {
public function publicMethod(){ echo "Base:publicMethod"; }
protected function protectedMethod(){ echo "Base:protectedMethod"; }
private function privateMethod(){ echo "Base:privateMethod"; }
}
class Child extends Parent {
function Test()
{
// This will work.
$this->publicMethod();
// This will work. Child can call protected method of parent.
$this->protectedMethod();
// This will fail. It won't work for privates.
$this->privateMethod();
}
}
$p = new Parent();
$c = new Child();
// The next two lines will succeed. You can call the public method, even
// if it is declared in a parent class of the one you are calling:
$p->publicMethod();
$c->publicMethod();
// The next lines will fail. You call private or protected methods outside of
// the class even though $p and $c point to instances of those classes.
$p->protectedMethod();
$c->protectedMethod();
$p->privateMethod();
$c->privateMethod();
答案 2 :(得分:1)
class foo{
public foo;
protected bar;
private baz;
function __construct(){
$this->foo=1;
$this->bar=2;
$this->baz=3;
}
}
class bar extends foo{
}
$foo = new foo();
$bar = new bar();
echo $foo->foo; //ok
echo $foo->bar; //ok
echo $foo->baz; //ok
echo $bar->foo; // ok
echo $bar->bar; // ok
echo $bar->baz; //not ok
答案 3 :(得分:0)
答案 4 :(得分:0)
如果我对你的问题的理解是好的,答案是肯定的。访问权限取决于类,而不是实例。
文档(http://php.net/manual/en/language.oop5.visibility.php)说:
相同类型的对象可以访问彼此私有和受保护的成员,即使它们不是同一个实例。这是因为在这些对象内部已经知道实现特定的细节。
这意味着这将起作用并打印"它有效!" :
class Baz {
private $foo;
protected $bar;
public function __construct($foo, $bar) {
$this->foo = $foo;
$this->bar = $bar;
}
public function isFooEqual(Baz $b) {
return ($this->foo == $b->foo);
}
public function isBarEqual(Baz $b) {
return ($this->bar == $b->bar);
}
}
$x = new Baz("Hello", "World");
$y = new Baz("Hello", "World");
if($x->isFooEqual($y) && $x->isBarEqual($y)) {
echo "It works !";
} else {
echo "Fail";
}