2011-05-25 171 views
2

我有脑膜炎,我怀疑这个很简单。 考虑以下代码,有两个类:为什么我的PHP子类没有从父类获得公共和受保护的变量?

<?php  
class myparentclass { 
    protected $vara; 
    private $varb; 
    public $varc; 
    public $_childclass; 

    function __construct() { 
     $this->vara = "foo"; 
     $this->varb = "bar"; 
     $this->varc = ":("; 
     $this->_childclass = new mychildclass;  
    } 
} 

class mychildclass extends myparentclass { 
    function __construct() { 
     print_r ($this); 
    } 
} 

print "<pre>"; 
$foo = new myparentclass(); 

输出是:

mychildclass Object 
(
    [vara:protected] => 
    [varb:private] => 
    [varc] => 
    [_childclass] => 
) 

我知道$ varb不应设置,但对于其他人呢?

+0

告诉你这很简单! +1全部,谢谢。 – 2011-05-25 13:23:56

回答

4

如果在子类中定义一个新__construct()因为你对我所做的打印瓦尔出来,你需要显式调用父类的构造了。如果你没有在子类中定义任何__construct(),它将直接继承父类,并且所有这些属性都将被设置。

class mychildclass extends myparentclass { 
    function __construct() { 
    // The parent constructor 
    parent::__construct(); 
    print_r ($this); 
    } 
} 
2

你必须调用子类构造函数内的父类构造函数。

function __construct() { 
     parent::__construct(); 
     print_r ($this); 
    } 
1

如果子类有它自己的构造函数,你必须显式调用从内它的父类的构造(如果你想叫):

parent::__construct(); 
2

如果在重新定义构造您子类,你必须调用父构造函数。

class mychildclass extends myparentclass { 
function __construct() { 
    parent::__construct(); 
    print_r ($this); 
} 
} 

应该正常工作。

1

您的父构造函数永远不会被孩子执行。像这样修改mychildclass:

function __construct() { 
    parent::__construct(); 
    print_r ($this); 
} 
1

您正在用父类中的构造函数重写父类的构造方法。您可以使用parent :: __ construct()从父类的构造函数中调用父类的构造函数。

然而,myparentclass的构造函数的最后一行调用mychildclass的构造函数,后者又调用父构造函数等等。你的意思是达到这个目的吗?

<?php  
class myparentclass { 
    protected $vara; 
    private $varb; 
    public $varc; 

    function __construct() { 
     $this->vara = "foo"; 
     $this->varb = "bar"; 
     $this->varc = ":("; 
    } 
} 

class mychildclass extends myparentclass { 
    function __construct() { 
     parent::__construct(); 
     print_r ($this); 
    } 
} 

print "<pre>"; 
$foo = new mychildclass(); 
相关问题