2015-09-25 104 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