2011-03-07 101 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