您的位置:首页 > 编程语言 > PHP开发

php设计模式 工厂、单例、注册树模式

2016-02-29 10:59 615 查看
Source Code Pro字体 easyphp

命名空间:隔离类和函数,php5.3以后

//test5.php
<?php
namespace Test5;//命名空间必须是程序脚本的第一条语句,除了declare
function test(){
echo __FILE__;
}


//test6.php
<?php
namespace Test6;
function test(){
echo __FILE__;
}


<?php
require 'test5.php';
require 'test6.php';

Test5\test();
Test6\test();


类自动载入:php5.2以后

spl_autoload_register('autoload1');

Test5::test();
Test6::test();

function autoload1($class){
require __DIR__.'/'.$class.'.php';
}


PSR-0规范

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

类名首字母必须大写

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

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

全部使用命名空间

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

单一入口

spl标准库

PHP链式操作

<?php
namespace Baobab;

class Database{
function where($where){
return $this;
}

function order($order) {
return $this;
}

function limit($limit){
return $this;
}
}

?>

//index.php
$db = new Baobab\Database();
$db->where('id = 1')->order('order by id')->limit(1);


魔术方法:

__get/__set:接管对象属性。在给不可访问属性赋值时,__set() 会被调用;读取不可访问属性的值时,__get() 会被调用。

__call/__callStatic:在对象中调用一个不可访问方法时,__call() 会被调用;用静态方式中调用一个不可访问方法时,__callStatic() 会被调用。

__toString:一个类转化成字符串

__invoke:以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。

object.php

<?php
namespace Baobab;

class Object{
protected $array = array();
function __set($key, $value){
$this->array[$key] = $value;
}
function __get($key){
//echo __METHOD__;
return $this->array[$key];
}

function __call($func, $param){
//var_dump($func,$param);
return 'magic function';
}

static function __callstatic($func, $param) {
//var_dump($func, $param);
return 'magic static function';
}

function __toString(){
return __CLASS__;
}

function __invoke($param) {
return var_dump($param);
}

}


index.php

$obj = new baobab\Object();
$obj->title = 'hello';
echo $obj->title;
echo $obj->test1('hello', 123);
echo $obj::test1('hello1', 1234);
echo $obj;
echo $obj('test1');


1、三种基本设计模式

工厂模式:使用工厂方法或类生产对象,而不是在代码中直接new

Factory.php

<?php
namespace Baobab;

class Factory{
static function createDatabase(){
$db = new Database();
return $db;
}
}


index.php

$db = Baobab\Factory::createDatabase();
$db1 = Baobab\Factory::createDatabase();

$db->limit($limit);


单例模式:使某个类的对象仅允许创建一个

Database.php

<?php
namespace Baobab;

class Database{

protected static $db;

private function __construct(){

}

static function getInstance(){
if (self::$db){
return self::$db;
}else{
//self是指向类本身,也就是self是不指向任何已经实例化的对象(::域运算符号)
self::$db = new self();
return self::$db;
}
}


index.php

$db = Baobab\Database::getInstance();


注册模式:解决全局共享和交换对象,将对象注册到全局树上,可以在任何地方被直接访问

Register.php

<?php
namespace Baobab;

class Register{
protected static $objects;
static function set($alias, $object){
self::$objects[$alias] = $object;
}

static function _unset($alias) {
unset(self::$objects[$alias]);
}

static function get($name) {
return self::$objects[$name];
}
}


//将db注册到注册树上
Register::set('db1', $db);


index.php

$db = Baobab\Register::get('db1');
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: