php面向对象的可见性

问题描述 投票:5回答:4

关于PHP中OO可见性的这一段,我有点困惑。如果有人能向我解释,我很好奇。例子很棒!我的大脑没有想清楚。

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

第一段读到

可以通过在声明前加上关键字public,protected或private来定义属性或方法的可见性。声明为public的类成员可以随处访问。声明受保护的成员只能在类本身以及继承和父类中访问。声明为private的成员只能由定义该成员的类访问。

父类如何访问子类成员?

php oop programming-languages
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是一种解释型语言。属性在运行时解析,而不是在编译阶段解析。访问属性时只检查访问修饰符。

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

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

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)


0
投票

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的东西。

© www.soinside.com 2019 - 2024. All rights reserved.