php面向对象的可见性

时间:2011-04-08 01:56:27

标签: php oop programming-languages

我对PHP中的OO visibilty的这一段感到有些困惑。如果有人能向我解释,我很好奇。例子很棒!我的大脑没有想清楚。

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

第一段读取

  

属性或方法的可见性   可以通过加前缀来定义   关键字public的声明,   受保护或私人。班级成员   声明公开可以访问   到处。 会员宣布受保护   只能在课堂上访问   本身以及继承和父母   类即可。成员宣布为私人   只能由那个班级访问   定义成员。

父类如何访问子类成员?

4 个答案:

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

您了解protectedinheritance中使用的东西。