2011-03-07 125 views
1

我不確定此問題的標題是否準確,請耐心等待。PHP中的繼承類型

我正在創建一個輕量級的MVC框架。它的工作原理有點像這樣:
Main.php(主類)調用

  • 控制器擴展主($這個 - >控制器)和
  • 模型擴展的主要($這個 - >模型)

現在模型和控制器類將根據URI調用控制器和模型(例如,Blog.php [extends Controller])。 (所以對於回顧:Main.php調用$ this-> model和$ this-> controller.Controller類調用Blog extends Controller)。

從Blog.php中,我如何訪問Controller中的函數以及Main中的函數?

我問這是因爲在控制器中我需要訪問我的URI類中的函數,但我不能這樣做,因爲PHP告訴我當$ this-> uri時對象不存在。

類做$ this-> controller,$ this-> model和$ this-> uri似乎是不好的做法。

我的一位朋友建議我使用名爲__get()的Magic Method。這看起來正確嗎?

class Main 
{ 
    function __construct() { 
     loadClasses(); 
     loadUri(); 
    } 

    function loadClasses() { 
     $this->controller = new Controller(); 
     $this->uri = new Uri(); 
     $this->load = new Load(); 
    } 

    function loadUri() { 
     //Using the uri, determine what Controller to load. 
    } 
} 

class Controller 
{ 
    ... 
} 

class Blog extends Controller 
{ 
    $this->load->view(); //Should access the view function in the load class 
} 
+2

要麼你濫用術語「擴展」,要麼你認真濫用OOP。 – zzzzBov 2011-03-07 20:39:20

+0

_From Blog.php,我如何訪問控制器中的函數,以及Main中的函數?_ - 使用父類引用父類中的方法parent :: method_from_Controller();' – criticus 2011-03-07 20:42:38

回答

0

這裏有幾件事。 First Main.php應該「調用」控制器的一個實例而不是模型。連接模型和視圖是控制器的工作。

現在通常所有的控制器都會派生出一些BaseController。正如Criticus在評論中指出的那樣,您可以隨時通過使用parent ::訪問父級的任何受保護或公共方法。 BaseController應該包含所有控制器中常見的所有內容。

至於如何使用您的URI類。通常在這之前,main.php使用某種路由類來確定要使用哪個控制器。任何URI工作都應該在這裏完成並且URI。這也會減少你對魔法的依賴。

如果您有興趣,請與我聯繫,我很樂意與您分享我爲PHP項目開發的簡單mvc框架。

+0

,所以如果有函數控制器類叫做load_view(),爲了讓我在Blog類中加載視圖,我需要做parent :: load_view()? – 2011-03-07 21:08:02