我对PHP中的OO visibilty的这一段感到有些困惑。如果有人能向我解释,我很好奇。例子很棒!我的大脑没有想清楚。
http://www.php.net/manual/en/language.oop5.visibility.php
第一段读取
属性或方法的可见性 可以通过加前缀来定义 关键字public的声明, 受保护或私人。班级成员 声明公开可以访问 到处。 会员宣布受保护 只能在课堂上访问 本身以及继承和父母 类即可。成员宣布为私人 只能由那个班级访问 定义成员。
父类如何访问子类成员?
答案 0 :(得分:5)
就是这样:
class A {
public function test() {
$b = new B;
echo $b->foo;
}
}
class B extends A {
protected $foo = 'bar';
}
$a = new A;
$a->test();
答案 1 :(得分:1)
PHP是一种解释型语言。属性在运行时解析,而不是在编译阶段解析。只有在访问属性时才会检查访问修饰符。
如果您临时注入一个新的(未声明的)属性以使其成为公共属性,或者如果您在继承的类中声明受保护的属性,则没有任何区别。
private
实际上只会影响外部的可访问性。无论如何,->name
在运行时解析都有效。如果为当前对象实例类创建了属性声明,那么PHP运行时就不会成功。 (与私人声明不同。)
答案 2 :(得分:1)
公共范围:可以从任何文件中的任何类访问属性(方法,变量等)。
class Example {
public $foo;
}
$example = new Example;
$example->foo = 3; // everything OK
私有范围:属性只能由同一个类访问。
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)
答案 3 :(得分:0)
受保护的是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中使用的东西。