Php继承

问题描述:

我使用PHP 5.3稳定版本,有时会遇到非常不一致的行为。据我所知,在继承中,超类中的所有属性和方法(private,public和protected)都被传递给子类。Php继承

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 

但是当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 
+1

不。那些规则与Java和C++中完全相同,PHP的对象模型取自于此。 – troelskn 2010-01-11 15:21:02

+3

由于getBar()是在父类中定义的,因此它可以访问私有成员变量。 – 2010-01-19 01:07:41

+0

return $ this-> bar;这里$是指Bar对象,Bar类没有$ bar变量。怎么会这样? – jsonx 2010-01-19 02:37:25

PHP Manual

的属性或方法 的可见性可以通过用关键字publicprotectedprivate前缀的 声明来定义。可以在任何地方访问 声明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 
} 

也没有,这是不是从实现相同关键字的其他语言的不同。

关于你提到的第二个编辑和代码片段:

不,这不应该放弃,因为getBar()FooFoo继承出错有能见度$bar。如果getBar()被定义或在Bar中超载,它将不起作用。请参阅http://codepad.org/rlSWx7SQ

+0

+1实际显示的解释 – NateDSaint 2010-01-11 15:22:03

您的假设不正确。受保护的和公共成员被“传递”。私人成员不是。据我所知,这是许多OOP语言的典型代表。

私有方法和变量不能被子类或外部访问 - 只能由类本身访问。 使用受保护如果您希望孩子可以访问该变量但外部类别无法访问该变量。