php几种设计模式,php三种基本设计模式

PSR,是PHP开发的事实标准;

PSR-0 自动加载:

命名空间必须与绝对路径一致。

类名首字母必须大写。

除入口文件外,其他”.php”必须只有一个类。

开发符合PSR-0规范的基础框架

严格全部使用命名空间。

所有PHP文件必须自动载入,不能有include/require。

单一入口。

SPL(PHP标准库)

SqlStack,SqlQueue,SplHeap,SqlFixedArray等数据结构类。

ArrayIterator、AppendIterator、Countable、ArrayObject。

SPL提供的函数。

PHP链式操作

eg:$db ->where()->limit()->order();

PHP魔术方法

__get/__set

常用于类的构造方法,当对象的属性不存在时,将自动调用 __set 初始化属性, __get 返回对象初始化属性。

__call/__callStatic

常用于类的构造方法,当对象的方法不存在时,将自动回调 __call 初始化方法, __callStatic 针对静态方法。

__toString

将对象转换成字符串类型。

__invoke

把对象当成函数去使用,则自动回调 __invoke 方法,返回对象传入的参数。

PHP的3种基本设计模式(1,2,3)

1、工厂模式,工厂方法或者类生成对象,而不是在代码中直接new;将new的操作统一,方便以后统一修改,就是在类中封装new方法,然后返回对象。可以在类做了修改后不必一个一个去修改各php文件中的new对象。

在工厂中写

class Factory{

static function createDatabase(){

$db = new Database();

return $db;

}

}

在index文件中写

$db = IMooc\Factory::createDatabase();

2、单例模式,使某个类的对象仅允许创建一个;私有化构造方法,提供获取本类对象的方法,私有构造函数+静态创建本类函数+受保护的属性(保存自身)

单例模式(口诀:三私一公)

class Singleton{

//私有化构造方法,禁止外部实例化对象

private function __construct(){}

//私有化__clone,防止对象被克隆

private function __clone(){}

//私有化内部实例化的对象

private static $instance = null;

// 公有静态实例方法

public static function getInstance(){

if(self::$instance == null){

//内部实例化对象

self::$instance = new self();

}

return self::$instance;

}

}

类只是被实例化了一次,如果是数据库连接,那么在一个脚本运行的生命周期内将只会创建一个连接

实现方式:

声明一个类的私有或者保护的静态变量,构造方法声明为私有(不允许外部进行new操作),如果不存在则实例化它,然后返回,如果存在则直接返回。

单例模式:私有构造函数+静态创建本类函数+受保护的属性(保存自身)

1.构造函数设为私有或保护

private function __construct(){}

2.编写getInstance()函数

static function getInstance()

{

if(self::$db){

return self::$db;

}else{

self::$db = new self();

return self::$db;

}

}

调用方式:类名::getInstance();

工厂+单例模式

class Factory

{

static function creatDatabase()

{

//如果不是单例模式这么写

//return new Database();

//用单例模式用以下方式写

return Database::getInstans();

}

}

//以下三种使用情况

//普通使用直接使用new一个对象

//$db=new Database();

//使用单例模式

//$db=Database::getInstance();

3、注册(树)模式,全局共享和交换对象;工厂方法里面,将需要的对象注册到注册树上面,然后该工厂方法只需要调用一次(可以放到系统环境初始化这样的地方),以后需要调用该对象的时候直接从注册树上面取出来即可,不需要再调用工厂方法和单例模式。

Register.php,用来将一些对象注册到全局的注册树上,可以在任何地方访问。set():将对象隐射到全局树上,_unset():从树上移除。get():去注册到树上的对象。在框架初始化的时候,会做注册器的初始化操作,然后可以在任何地方去访问注册器的方法。用来将一些对象注册到一个全局的树上,供全局访问;不用在通过类创建,具有全局对象树类。

namespace IMooc;

class Register{

protected static $objects;

static function set($alias,$object){

self::$objects[$alias] = $object;

}

static function get($name){

return self::$objects[$name];

}

function _unset($alias){

unset(self::$objects[$alias]);

}

}

在工厂模式写下

class Factory{

static function createDatabase(){

$db =Database::getInstance();

Register::set('db1', $db);

return $db;

}

}

在index.php

$db = IMooc\Factory::createDatabase();

$db1 = \IMooc\Register::get('db1');

var_dump($db);

var_dump($db1);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值