zoukankan      html  css  js  c++  java
  • 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 est(); Test6 est();

    类自动载入: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 BaobabDatabase();
    $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 baobabObject();
    $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 = BaobabFactory::createDatabase();
    $db1 = BaobabFactory::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 = BaobabDatabase::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 = BaobabRegister::get('db1');
  • 相关阅读:
    hdu 4638 Group 线段树
    hdu 4635 Strongly connected 强连通分量
    hdu 4604 Deque
    hdu 1000 A + B Problem
    数组相关
    文本文件相关
    硬件电路中VCC,VDD,VEE,VSS有什么区别
    VIPM链接LabVIEW问题
    Touch实现轻扫
    touchesMoved 实现拖拽
  • 原文地址:https://www.cnblogs.com/tianxintian22/p/5209917.html
Copyright © 2011-2022 走看看