欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

php设计模式 工厂、单例、注册树模式,php设计模式_PHP教程

程序员文章站 2024-04-06 10:30:37
...

php设计模式 工厂、单例、注册树模式,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__; }
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规范的基础框架

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

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1103615.htmlTechArticlephp设计模式 工厂、单例、注册树模式,php设计模式 Source Code Pro字体 easyphp 命名空间 :隔离类和函数,php5.3以后 //test5.php ? phpnamespace Test5...
相关标签: php5