2011-08-18 99 views
1

我尝试从它类似于下面的概念扩展孩子访问父母的财产访问父母的财产,OOP:问题从扩展子

class Base 
{ 
    protected static $me; 
    protected static $var_parent_1; 
    protected static $var_parent_2; 

    public function __construct ($var_parent_1 = null) 
    { 
     $this->var_parent_1 = $var_parent_1; 
     $this->me = 'the base'; 
    } 

    public function who() { 
     echo $this->me; 
    } 

    public function parent_1() { 
     echo $this->var_parent_1; 
    } 
} 

class Child extends Base 
{ 
    protected static $me; 
    protected static $var_child_1; 
    protected static $var_child_2; 

    public function __construct ($var_child_1 = null) 
    { 
     parent::__construct(); 
     $this->var_child_1 = $var_child_1; 
     $this->me = 'the child extends '.parent::$me; 
    } 

    // until PHP 5.3, will need to redeclare this 
    public function who() { 
     echo $this->me; 
    } 

    public function child_1() { 
     echo $this->var_child_1; 
    } 
} 

$objA = new Base($var_parent_1 = 'parent var 1'); 
$objA->parent_1(); // "parent var 1" 
$objA->who(); // "the base" 

$objB = new Child($var_child_1 = 'child var 1'); 
$objB->child_1(); // "child var 1" 
$objB->who(); // should get "the child extends the base" 

但我得到“孩子伸出”的代替“孩子继承基础”如果我使用$this->

如果我改变似乎OK所有$this->self::

为什么?

是唯一正确的方式来访问父母的属性,这是改变所有$this->self::

编辑:

我删除了所有static关键字,

class Base 
{ 
    protected $me; 
    protected $var_parent_1; 
    protected $var_parent_2; 

    public function __construct ($var_parent_1 = null) 
    { 
     $this->var_parent_1 = $var_parent_1; 
     $this->me = 'the base'; 
    } 

    public function who() { 
     echo $this->me; 
    } 

    public function parent_1() { 
     echo $this->var_parent_1; 
    } 
} 

class Child extends Base 
{ 
    protected $me; 
    protected $var_child_1; 
    protected $var_child_2; 

    public function __construct ($var_child_1 = null) 
    { 
     parent::__construct(); 
     $this->var_child_1 = $var_child_1; 
     $this->me = 'the child extends '.parent::$me; 
    } 

    // until PHP 5.3, will need to redeclare this 
    public function who() { 
     echo $this->me; 
    } 

    public function child_1() { 
     echo $this->var_child_1; 
    } 
} 

$objA = new Base($var_parent_1 = 'parent var 1'); 
//$objA->parent_1(); // "parent var 1" 
//$objA->who(); // "the base" 

$objB = new Child($var_child_1 = 'child var 1'); 
$objB->child_1(); // "child var 1" 
$objB->who(); // "the child extends the base" 

然后我得到这个错误Fatal error: Access to undeclared static property: Base::$me in C:\wamp\www\test\2011\php\inheritence.php on line 109是指这条线,

$this->me = 'the child extends '.parent::$me; 
+0

您确定要将这些设置为“静态”吗? – jtbandes

+0

不确定...我实际上复制并修改了这个http://stackoverflow.com/questions/831555/php-child-class-accessing-parent-variable-problem – laukok

回答

0

静态属性的属性类,而不是你用它们创建的对象。一个静态属性被该类的所有对象共享,并且使用self访问::

如果你删除静态它应该按照你想要的方式工作,并且你会像现在一样使用$ this->。

+0

的答案示例谢谢。是的,删除了所有的静态关键字,但然后我得到一个错误。请参阅我上面的编辑。谢谢。 – laukok

+0

所以你现在已经让我成为一个非静态的,它应该是。但是询问哪个对象是你的对象的父对象是没有意义的?你的对象有一个父类,而不是父对象。这就是你所看到的新错误的原因。记住静态是指类,实例变量是指对象。 – Jonah

0

请请参考此answer来解释使用self和this之间的区别。

1

(简化的答案,我不知道如何解释这个,不写20页,对不起)。

在执行时,您的基类和子类会合并到一个对象中。在这种情况下,你的实例变量也会被合并。所以,你不能调用parent :: $ avar,你可以调用$ this-> var(因为所有变量都成为当前实例的元素)

方法的行为完全不同:因为子类是应该是基类的专业化,写在基类中的代码不一定需要完全重写:您可以调用它并执行其他操作,而不必重写子类中的原始代码。