2015-09-25 63 views
-2

我在PHP中遇到类错误。我有这样的代码(扔什么是必要的,有助于我 - 我只给了代码的相关行):将变量保存在父类中PHP

abstract class Controller { 

    protected $czyZalogowany; 

    public function __construct($czyZalogowany) { 

     $this->czyZalogowany = $czyZalogowany; 

     echo 'Controller (__construct): ' . $czyZalogowany . '<br><br>'; 

    } 

    public function pobierzStatusUzytkownika() { 

     echo 'Controller: ' . $this->czyZalogowany . '<br><br>'; 
     return $this->czyZalogowany; 

    } 

} 

class HomeController extends Controller { 

    public function __construct() { 

     echo 'HomeController: ' . $this->pobierzStatusUzytkownika() . '<br><br>'; 

    } 

} 

我得到这样的事情:

Controller (__construct): 1 

Controller: 

HomeController: 

我的意思是,救母分类价值。在派生类中,我使用了一个类似的方法来分配值,它工作。

我将快速帮助表示感谢;)

+1

我已将代码添加到您的问题中。除非是数百行代码,否则最好直接将其添加到问题中,以阻止用户点击链接等。:)欢迎来到SO! – Fluffeh

+2

简短的回答:你没有调用父类的构造函数,也不接受你孩子的构造函数中的任何参数。长的回答:那根本不是继承的工作方式。通过扩展一个类,你继承了它的***结构,而不是它的数据***。 – deceze

回答

0

我必须说,它实际上是很难告诉你在你的问题问。以下是您的术语中的一些PHP类系统示例。

此处我们声明所有子类将拥有名为userStatus的属性 ,只有他们和他们的子女 (没有外部访问)可以访问。所有的孩子班级将能够输出他们的状态。

abstract class BaseController 
{ 
    protected $userStatus; 

    public function __construct($status) 
    { 
     $this->userStatus = $status; 
    } 

    public function showStatus() 
    { 
     echo $this->userStatus; 
    } 
} 

这个声明意味着所有控制器都在创建接受一些$status,这给状态将被输出时showStatus()将运行。

在这里我们宣布BaseController的第一个孩子,UserController。它覆盖父构造函数,始终将$this->userStatus设置为2

class UserController extends BaseController 
{ 
    public function __construct() 
    { 
     $this->userStatus = 2; 
    } 
} 

该类完全忽略实例化时传递给它的内容。 假设我们把两种定义在“inheritance.php”,让我们来测试它在控制台:

php -r 'require("inheritance.php"); 
$controller = new UserController("5"); 
$controller->showStatus();' 

输出是2;

让我们添加第二个孩子:

class HomeController extends BaseController 
{ 

} 

它不会覆盖任何东西。它不是抽象的,所以我们能够实例化它。

测试:

php -r 'require("inheritance.php"); 
$controller = new HomeController("5"); 
$controller->showStatus();' 

输出是5