2011-04-08 126 views
5

我对这段关于PHP中的OO可见性有点困惑。我很好奇,如果有人能够向我解释。例子会很棒!我的大脑思维不清晰。php面向对象的可见性

http://www.php.net/manual/en/language.oop5.visibility.php

第一款读取

的属性或方法 的知名度可以通过在前面的 声明与公众的关键字, 保护或私有定义。随处可见 宣布公开的类成员 。 委员声称:保护 只能在类 本身和继承和父 类访问。声明为私人的成员 只能由 定义成员的类访问。

怎一个父类访问孩子的类成员?

回答

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

看起来真的错了。怪不得PHP总是用丑陋的棍子涂上;-) – Phil 2011-04-08 02:11:06

+0

@Phil是的,这种模式是否被推荐是另一回事...... ;-) – deceze 2011-04-08 02:16:33

+0

这真棒!哈哈 – Sufendy 2011-04-08 03:13:41

1

PHP是一种解释型语言。属性在运行时解决,而不是在编译阶段。访问修饰符仅在访问属性时进行检查。

这没有什么区别,如果你的ad-hoc所以它成为公共注入新的(未申报)的财产,或者如果你在继承的类声明的保护特性。

private真的只影响来自外部的可访问性。无论如何,在运行时解析的->name工作。如果对当前对象实例类进行了属性声明,PHP运行时不会推进。 (不同于用于私人声明。)

1

公共范围:属性(方法,变量等)可以从任何文件中的任何类访问。

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 
    } 
} 

受保护的范围:属性只能由相同的类或其它扩展它的类来访问。

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)