Php继承

jso*_*onx 6 php oop inheritance

我正在使用PHP 5.3稳定版本,有时我会遇到非常不一致的行为.据我所知,在继承中,超类中的所有属性和方法(私有,公共和受保护)都是传递子类.

class Foo
{
    private $_name = "foo";
}
class Bar extends Foo
{
    public function getName()
    {
        return $this->_name;
    }
}
$o = new Bar();
echo $o->getName();

//Notice: Undefined property: Bar::$_name in ...\test.php on line 11
Run Code Online (Sandbox Code Playgroud)

但是当Foo :: $ _ name属性定义为"public"时,它不会给出错误.PHP有自己的OO规则???

谢谢

编辑:现在一切都很清楚了.实际上我在思考"继承"时创建了一个新类,并且继承了独立于其祖先的所有成员.我不知道"访问"规则和继承规则是一样的.

编辑 根据您的评论,此代码段应该给出错误.但它正在发挥作用.

class Foo
{
    private $bar = "baz";

    public function getBar()
    {
        return $this->bar;
    }
}

class Bar extends Foo
{}

$o = new Bar;
echo $o->getBar();      //baz
Run Code Online (Sandbox Code Playgroud)

Gor*_*don 12

来自PHP手册:

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

class A
{
    public $prop1;     // accessible from everywhere
    protected $prop2;  // accessible in this and child class
    private $prop3;    // accessible only in this class
}
Run Code Online (Sandbox Code Playgroud)

不,这与实施相同关键字的其他语言没有什么不同.

关于您的第二个编辑和代码段:

不,这不应该给出错误,因为它getBar()是继承的,Foo并且Foo具有可见性$bar.如果getBar()已定义或超载,Bar则无效.见http://codepad.org/rlSWx7SQ