php面向对象可见性

php面向对象可见性,php,oop,programming-languages,Php,Oop,Programming Languages,我对这一段关于PHP中OO可视性的内容有点困惑。我很好奇是否有人能给我解释一下。例子将是伟大的!我的大脑思维不清晰 第一段内容如下: 属性或方法的可见性 可以通过在 以公众为关键词的宣言, 受保护的或私人的。班级成员 可以访问声明的public 到处都是声明受保护的成员 只能在类内访问 自身和由继承和父代继承 类。宣布为非公开的成员 只能由以下类访问: 定义成员 父类如何访问childs类成员?就是这样: class A { public function test() {

我对这一段关于PHP中OO可视性的内容有点困惑。我很好奇是否有人能给我解释一下。例子将是伟大的!我的大脑思维不清晰

第一段内容如下:

属性或方法的可见性 可以通过在 以公众为关键词的宣言, 受保护的或私人的。班级成员 可以访问声明的public 到处都是声明受保护的成员 只能在类内访问 自身和由继承和父代继承 类。宣布为非公开的成员 只能由以下类访问: 定义成员

父类如何访问childs类成员?

就是这样:

class A {
    public function test() {
        $b = new B;
        echo $b->foo;
    }
}

class B extends A {
    protected $foo = 'bar';
}

$a = new A;
$a->test();

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

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

private
实际上只影响外部的可访问性。无论如何,运行时解析的
->name
都可以工作。如果属性声明是为当前对象实例类进行的,那么PHP运行时就不会执行。(与私有声明不同。)

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

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
    }
}
这一切都与名为封装的技术有关,在该技术中,您不能允许在类之外更改类成员的状态或行为

Protected是一种类型,它使声明的
Protected
属性和方法在声明的类的子类中可用

类父类{
public$name='MyName';
受保护$age=20;
私立$school='MySchool';
}
类子级扩展父级{
公共函数构造(){
echo$this->name;//作为公共有效
echo$this->age;//受保护有效
echo$this->school;//作为私有无效
}
}

在这里,您可以理解
受保护的
是在中使用的东西。

看起来非常错误。怪不得PHP总是用丑陋的棍子作画;-)@菲尔:是的,不管这种模式是否被推荐,都是另一回事……;-)这也适用于从静态函数访问属性时。