本文章来给大家介绍php 5中的一个新东西,就是工厂模式了,这里是我常用工厂模式的一些学习笔记,下面与大家一同分享有需要了解的朋友可参考。
在大型系统中,许多代码依赖于少数几个关键类。需要更改这些类时,可能会出现困难。例如,假设您有一个从文件读取的 user 类。您希望将其更改为从数据库读取的其他类,但是,所有的代码都引用从文件读取的原始类。这时候,使用工厂模式会很方便。
工厂模式是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。
示例1:显示工厂类的一个示列。
等式的服务器端包括两个部分:数据库和一组 PHP 页面,这些页面允许您添加反馈、请求反馈列表并获取与特定反馈相关的文章代码如下复制代码interface IUser{function getName();}class User implements IUser{public function __construct( $id ) { }public function getName(){return "Jack";}}class UserFactory{public static function Create( $id ){return new User( $id );}}$uo = UserFactory::Create( 1 );echo( $uo->getName()."n" );?>IUser接口定义用户对象应执行什么操作。IUser 的实现称为 User,UserFactory 工厂类则创建 IUser 对象。此关系可以用图1中的UML 表示。
立即学习“PHP免费学习笔记(深入)
”;
图 1. 工厂类及其相关 IUser 接口和用户类如果您使用 php 解释器在命令行上运行此代码,将得到如下结果:% php factory1.php Jack%测试代码会向工厂请求 User 对象,并输出 getName 方法的结果。
有 一种工厂模式的变体使用工厂方法。类中的这些公共静态方法构造该类型的对象。如果创建此类型的对象非常重要,此方法非常有用。例如,假设您需要先创建对 象,然后设置许多属性。此版本的工厂模式会将该进程封装在单个位置中,这样,不用复制复杂的初始化代码,也不必将复制好的代码在在代码库中到处粘贴。
示例2 显示使用工厂方法的一个示例。
代码如下复制代码interface IUser{function getName();}class User implements IUser{public static function Load( $id ){return new User( $id );}public static function Create( ){return new User( null );}public function __construct( $id ) { }public function getName(){return "Jack";}}$uo = User::Load( 1 );echo( $uo->getName()."n" );?>好了上面讲了很多了, 下面我来来看个实例PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载我们建立以下四个文件index.php代码如下复制代码include_once("f.inc.php");$f=new factory;$t1=&$f->create('T1');echo $t1->getName();echo $config;?>f.inc.php代码如下复制代码class factory{function factory(){$this->mClasses=array('T1'=>'t1.inc.php','T2'=>'t2.inc.php');}function &create($class){if (!class_exists($class)){require_once($this->mClasses[$class]);}return new $class;}}?>t1.inc.php代码如下复制代码global $config;$config='surfchen';class T1{var $mName='name::T1';function getName(){return $this->mName;}}?>t2.inc.php代码如下复制代码class T2{function T2(){echo 't2 is ok';}}?>在index.php里,我们通过一个factory类来创建其他的类实例。
在factory里,保存有一个数组$this->mClasses,格式为array(“类名”=>”类文件路径”).
我们通过factory::create()来创建一个类实例的时候,在create()里,会首先检测类是否存在,如果不存在,就根据$this->mClasses把类对应的类文件包含进来。然后创建并返回一个该类的实例。
这样,我们只需要把factory类文件包含进执行的脚本(如index.php)中就可以了。
大家可能还注意到了在t1.inc.php中的这两行代码。
代码如下复制代码global $config;$config='surfchen';为什么需要global呢?因为t1.inc.php是在factory::create中被包含的,t1文件中的变量将会默认为create的函数级变量。所以我们需要对其中的变量(如$config)进行global以便index.php能访问到。
运行index.php,将会输出代码如下复制代码name::T1surfchen http://www.bkjia.com/PHPjc/628801.html www.bkjia.com true http://www.bkjia.com/PHPjc/628801.html TechArticle本文章来给大家介绍php5中的一个新东西,就是工厂模式了,这里是我常用工厂模式的一些学习笔记,下面与大家一同分享有需要了解的朋友...
