2013-03-13 41 views
-1

我想發明一個私人框架來構建未來的PHP應用程序。我的示例代碼是:如何從父類調用子類功能PHP

class system { 
    const token = "1234"; 
} 

class data extends system { 
    public $driver = "mysql"; 

    function get_name() { 
     if (parent::token == "1234") { 
      return "John"; 
     } 
    } 
} 

class about extends system { 
    public $version = "10.1"; 
    function get_build() { 
     if (parent::token == "1234") { 
      return "920"; 
     } 
    } 
} 

我的問題是我可以調用包含類結構的子函數。我不知道這是什麼名字。我想像這樣。

$system = new system(); 

echo $system->data->driver; // Output "mysql" 
echo $system->data->get_name(); // Output "John" 
echo $system->about->version; // Output "10.1" 

在LUA的代碼是這樣的:

system = {}; 

system.token = "1234"; 
system.data.driver = "mysql"; 

function system.data.get_name() 
    if (system.token == "1234") then 
     return "John"; 
    end 
end 

system.about.version = "10.1"; 

function system.about.get_build() 
    if (system.token == "1234") then 
     return "920"; 
    end 
end 

用法:

name = system.data.get_name() -- variable "name" value will be "John" 

感謝。

編輯:

該代碼只是爲了展示一下我想要實現的,因爲我剛開始在PHP中的工作樣本。 Usualy我正在使用LUA。我的計劃是構建易於使用且易於理解的框架。所以人們將可以輕鬆地構建應用程序,並且可以輕鬆記住函數引用。例如:

$tbl_result = $system->data->select("name", "table", "id='10'");

該代碼而無需查詢用於容易選擇數據從數據庫。返回值是數組列表。此功能也會自動從配置中檢測數據庫驅動程序。所以用戶不需要在特定的驅動程序中知道SQL查詢。但是調用函數的方法應該是結構化的。爲什麼我必須使用system-> data->函數?因爲我將以root身份擁有系統,組件和模塊。那麼每個根都會有很多孩子。例如,系統將具有核心,數據,模型等。也許在每個根中將具有相同的子名稱。所以這就是爲什麼我必須建立這個結構。

回答

0

這不完全如何OOP在PHP中工作,並不是一般OOP。

如果要訪問所有的子類的子功能,你不希望實例要實例化一個關於對象的系統對象:

$system = new about(); 
echo $system->driver; // Output "mysql" 
echo $system->get_name(); // Output "John" 
echo $system->version; // Output "10.1" 

我會做PHP OOP一些閱讀雖然。

+0

是的,我知道這一點。這就是我通常所做的。但我想我的代碼結構很容易理解。如果我使用'$ system-> driver',那麼如果有人讀過這個代碼,他們會認爲「驅動程序」是系統驅動程序,而不是數據驅動程序。但是如果我可以使用像LUA('system.data.driver')這樣的結構,那麼讀取該代碼的人會認爲「驅動程序」是數據的孩子,而不是系統的孩子。如果在PHP中不可行,那麼我將使用一般方法。 :) – 2013-03-13 02:05:34

1

我沒有看到任何理由,數據類和關於類應該從系統類擴展。您可以改爲執行以下操作。

class data { 
    public $driver = 'mysql'; 
    public $token; 
    function __construct($token) 
    { 
     $this->token = $token; 
    } 
    function get_name() { 
     if ($this->token == "1234") { 
      return "John"; 
     } 
    } 
} 

class about { 
    public $version = "10.1"; 
    public $token; 
    function __construct($token) 
    { 
     $this->token = $token; 
    } 
    function get_build() { 
     if ($this->token == "1234") { 
      return "920"; 
     } 
    } 
} 

class system { 
    public $token; 
    public $about; 
    public $data; 

    function __construct($token) 
    { 
     $this->token = $token; 
     $this->about = new about($this->token); 
     $this->data = new data($this->token); 
    } 
} 

然後你可以做這樣的事情。

$system = new system('1234'); 
echo $system->data->driver; // Output "mysql" 
echo $system->data->get_name(); // Output "John" 
echo $system->about->version; // Output "10.1" 

我只是表明這是做你想達到的一種方式。然而,在做任何事情之前,我會重新考慮你的框架的設計和結構。

+0

是的,這對我很有幫助。謝謝。 – 2013-03-13 02:18:36

+0

通過這種方式,你會得到多個'$ token'變量,這意味着使用更多的內存。我瞭解@NanangElSutra,使用繼承將防止創建新的變量,對象。爲了解決這個問題,你可以爲你希望從子類的父類訪問的方法設置'static'。你可以像訪問它們:'data :: get_name()' – TomSawyer 2016-11-03 09:33:03