PHP面向对象可见性

5

我对 PHP 中关于面向对象可见性的这一段有些困惑。希望有人能给我解释一下,最好附上示例!我的大脑现在不太清晰。

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

第一段的内容:

通过在声明前使用关键字public、protected或private,可以定义属性或方法的可见性。声明为public的类成员可以在任何地方访问。声明为protected的成员只能在类本身以及继承和父类中访问。声明为private的成员只能被定义该成员的类访问。

一个父类如何访问子类的成员?

4个回答

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
@Phil 是的,无论这种模式是否推荐都是另外一回事...;-) - deceze
1
当从静态函数中访问属性时也适用。 - Jacob

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

受保护的作用域:属性只能被同一类访问或继承它的其他类访问。

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)

1

PHP是一种解释性语言。属性在运行时解析,而不是在编译阶段解析。访问修饰符只有在访问属性时才会被检查。

如果您临时注入一个新的(未声明的)属性使其变为公共属性,或者在继承类中声明受保护的属性,这并没有什么区别。

private实际上只影响外部的可访问性。无论如何,在运行时解析->name都可以工作。而且PHP运行时只会检查属性声明是否是当前对象实例类的声明。(与私有声明不同。)


0

Protected是一种可见性类型,它使得在声明该类时声明为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是在继承中使用的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接