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

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规范的基础框架

  1. 全部使用命名空间
  2. 所有PHP文件必须自动载入,不能有include/require
  3. 单一入口

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');