关于PHP中OO可见性的这一段,我有点困惑。如果有人能向我解释,我很好奇。例子很棒!我的大脑没有想清楚。
http://www.php.net/manual/en/language.oop5.visibility.php
第一段读到
可以通过在声明前加上关键字public,protected或private来定义属性或方法的可见性。声明为public的类成员可以随处访问。声明受保护的成员只能在类本身以及继承和父类中访问。声明为private的成员只能由定义该成员的类访问。
父类如何访问子类成员?
这就是如何:
class A {
public function test() {
$b = new B;
echo $b->foo;
}
}
class B extends A {
protected $foo = 'bar';
}
$a = new A;
$a->test();
PHP是一种解释型语言。属性在运行时解析,而不是在编译阶段解析。访问属性时只检查访问修饰符。
如果您临时注入一个新的(未声明的)属性以使其变为公共属性,或者在继承的类中声明受保护的属性,则没有任何区别。
private
实际上只影响外部的可访问性。无论如何,->name
在运行时解析都可以工作。如果为当前对象实例类创建了属性声明,那么PHP运行时就不会成功。 (与私人声明不同。)
公共范围:可以从任何文件中的任何类访问属性(方法,变量等)。
class Example {
public $foo;
}
$example = new Example;
$example->foo = 3; // everything OK
private scope:property只能由同一个类访问。
class Example {
private $foo;
}
class Child_Class extends Example {
public function some_method()
{
parent::foo = 3; // raises error
}
}
protected scope:property只能由同一个类或其他扩展它的类访问。
class Example {
protected $foo;
}
class Child_Class extends Example {
public function some_method()
{
parent::foo = 3; // this is OK
}
}
这一切都与名为封装的技术有关,在这种技术中,您不能允许在类外部更改类成员的状态或行为。 http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)
Protected是一种visibility,它使声明的protected
属性和方法在声明的类的子类中可用。
class Parent {
public $name = 'MyName';
protected $age = 20;
private $school = 'MySchool';
}
class Child extends Parent {
public function __construct() {
echo $this -> name; // valid as public
echo $this -> age; // valid as protected
echo $this -> school; // invalid as private
}
}
在那里你了解protected
是用于inheritance的东西。