PHP 中的 MVC 模式

迷途d书童 发布于 2012/09/21 16:40
阅读 5K+
收藏 7

我不是一个PHP粉,但我喜欢把PHP变成面向对象的语言。要让PHP完全OOL化,还要做许多事情,也有很多开发企业级应用程序使用了PHP的支持。通过接口和类对象的使用,让PHP开发人员开发可重复使用的模块化解决方案。在这篇文章中我将概述在如何在PHP中实现MVC。

什么是MVC?

MVC是一种设计模式,它可以降低对象之间的耦合度,分离出业务对象(Model模型),用户界面(View视图)和业务逻辑(Controller控制器)。请记住,MVC并不是针对某一种特定的语言,它可以在不同的语言中实现,而支持面向对象的语言更容易实现MVC。



MVC的Action

我们来使用MVC模式在页面上显示来自YouTube的视频。当然,你可以只用一点PHP文件和一些代码就可以实现。但是,随着你的应用程序的发展,保持这样的应用,后期维护将是一场噩梦。如果你分开业务逻辑和用户界面,你就可以轻松的维护和测试它们。通过使用依赖注入你可以摆脱紧密耦合(DI通过接口和构造函数)。

控制器的构造函数接收三个参数:模型,视图和URL。由于PHP中变量类型是弱类型,我们可以传入任何类型的变量。只有某些类型的变量可以执行通过,在一定程度上说,你需要使用注释和文档。

    /**
     * Initializes new instance of YoutubeVideoController
     *
     * @param IVideo $model A Model
     * @param IVideoView $view A view
     * @return  void
     *
     */
    public function __construct($model, $view, $feedUrl) {
        $this->model = $model;
        $this->view = $view;
        $this->feedUrl = $feedUrl;
    }

请注意:这里我使用了XPath来访问节点,并创建视频对象。

模型接口

在我们的应用程序中,我们有两种类型的业务对象: IVideoIVideoCollectionIVideoCollectionIVideo的集合。为什么要使用接口?因为不同类型的视频可以能有不同的操作和属性(例如YouTube或MetaCafe)。我们的模型接口包含了每一个具体类型应该有的基本操作。

<?php
namespace FeedReader\Model;

/**
 * interface IVideoCollection
 *
 * Provides and interface for video collection model
 *
 * @author : Pradip Shrestha
*/
interface IVideoCollection  {

	/**
	 * Gets the property value if exists
	 * 
	 * @param mixed $key Property name
	 * @return  mixed value of Propery
	 */
	public function __get($key);
	
	/**
	 * Sets the property value if exists
	 *
	 * @param mixed $key Property key
	 * @param mixed $value Property value
	 * @return  mixed value of Property
	 *
	 */	
	public function __set($key, $value);
	
	/**
	 * Adds a video to the collection
	 *
	 * @param IVideo $property video
	 *
	 */	
	public function addVideo($video);
	
	/**
	 * Gets all videos
	 *
	 * @return  IVideo collection
	 *
	 */	
	public function getVideos();
	
	/**
	 * Gets a video with given index
	 *
	 * @param integer $index an index
	 * @return  IVideo a video with specified index
	 *
	 */	
	public function getVideo($index);
}

?>


另外请注意:这里我已经使用了PHP中的命名空间。虽说PHP支持命名空间,但还是远不及C#和Java的(包)。可能在未来PHP会让它更加完善。

视图类

现在,让我们来看看视图类。我们的视图类实现了 IVideoView接口。从它的名字你就可以看出它显示哪个模型。它只是调用了另一个包含HTML的文件。

<?php
namespace FeedReader\View;
/**
 * YoutubeView class to display youtube videos
 *
 */
class YoutubeView implements IVideoView {
	/**
	 * Displays the data
	 *
	 * @param 
	 */
	public function Display($fileName, $model) {
		include __SITE_PATH . '/View' . '/' . $fileName;			
	}
}

其他类

index.php创建一个新的控制器实例,并调用它的invoke方法(是不是很简单?)。这里没有任何多余的代码在index.php。若要启用自动加载类,我们需要通过 Loader类使用sp_auto_register函数。 XmlParser是用来解析URL的,需要很大的改进。

总结

在PHP中使用MVC框架,这是很简单的例子,可能需要很大的改进。PHP已经开始支持面向对象编程,它变得更容易在PHP企业级应用程序的开发和维护。

如果你熟悉ASP.NET MVC框架,你可知道如何使用不同的URL调用相同控制器的不同函数。有一个叫 Symfony的框架,它与.NET的MVC框架非常相似,它也是完全面向对象的框架。

未来的Drupal(版本8)也将使用Symfony框架。

 

【源码】请点击这里

英文原文 , OSChina.NET翻译


加载中
0
亓斌哥哥
亓斌哥哥
http://qibin.web-82.com/loadphp用自己框架开发的网站
0
大王叫我来卖萌
大王叫我来卖萌

不喜欢PHP的OO

想OO可以JAVA或.NET啊

返回顶部
顶部