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__;
}
<?phprequire ‘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‘);
时间: 2024-11-06 06:35:54

php设计模式 工厂、单例、注册树模式的相关文章

PHP设计模式之工厂/单例/注册者模式

工厂模式 简单工厂模式 [静态工厂方法模式](Static Factory Method)是类的创建模式 工厂模式的几种形态: 1.简单工厂模式(Simple Factory)又叫做 静态工厂方法模式(Static Factory Method) 2.工厂方法模式(Factory Method)又叫做 多态性工厂模式(Polymorphic Factory) 3.抽象工厂模式(Abstract Factory)又叫做 工具箱模式(ToolKit) 创建工厂类 <?phprequire_once

PHP 设计模式 笔记与总结(6)基础设计模式:工厂模式、单例模式和注册树模式

三种基础设计模式(所有面向对象设计模式中最常见的三种): ① 工厂模式:使用工厂方法或者类生成对象,而不是在代码中直接new 在 Common 目录下新建 Factory.php: <?php namespace Common; class Factory{ static function createDatabase(){ //$db = new \Common\Database; $db = new Database; return $db; } } index.php: <?php de

PHP设计模式笔记三:三种基本设计模式(工厂模式、单例模式、注册树模式) -- Rango韩老师 http://www.imooc.com/learn/236

一.工厂设计模式 index.php $db = IMooc\Factory::createDatabase(); 使用工厂类的静态方法直接创建一个dababase对象,当类名发生修改时,在工厂里修改即可. IMooc/Factory.php 二.单例设计模式 保证在整个脚本运行期间,只有一个对象的实例,比如数据库操纵对象 Database.php Factory.php index.php output同一个对象: object(IMooc\Database)#1 (0) { } object

PHP模式设计之单例模式、工厂模式、注册树模式、适配器模式、观察者模式

php模式设计之单例模式 什么是单例模式? 单例模式是指在整个应用中只有一个实例对象的设计模式 为什么要用单例模式? php经常要链接数据库,如果在一个项目中频繁建立连接数据库,会造成服务器资源的很大浪费,在团队合作项目中,也能够避免不同的程序员实例自己的对象,造成人为的系统消耗. 单例模式的三大原则 1.构造函数需要标记为非public(防止外部使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化 2.拥有一个保存类的实例的静态成员变量$_instance 3.拥有一个可

php设计模式 -- 注册树模式

单例模式解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过new简历实例对象的方法.那么注册树模式想解决的问题是什么呢?首先我们看一下上面两种模式的局限: 首先,单例模式创建唯一对象的过程,本身还有一种判断,需要判断对象是否存在.每次创建实例对象都需要判断. 其次,工厂模式更多考虑的是扩展维护的问题. 总体来说,单例和工厂模式都可以产生更加合理的对象,但是怎么方便调用这些对象呢?能够统筹管理安排这些对象呢?因而,注册树模式应运而生,将每一个对象都放在注册树上,需要的时候取

Yii2设计模式——注册树模式

注册树模式 注册树模式(Registry Pattern)又叫注册模式.注册器模式.注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘的模式设计方法. 为什么要采用注册树模式? 单例模式在整个项目中创建唯一实例的问题:工厂模式封装了对象的创建方式(工厂方法——用一个抽象方法,抽象工厂——用一簇抽象方法),使得不必总用new关键词去获取对象:创建者模式则是分步骤的创建实例的各个部分:在Yii2中则通过依赖注入容器DI去获取实例... 这些方法实际上都是解决一个问题——如何合

php设计模式之注册树模式

什么是注册树模式?[全局共享和交换对象] 注册树模式当然也叫注册模式,注册器模式.注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘的模式设计方法.   这让我想起了小时候买糖葫芦,卖糖葫芦的将糖葫芦插在一个大的杆子上,人们买的时候就取下来.不同的是,注册树模式摘下来还会有,能摘很多次,糖葫芦摘一次就没了... 为什么要采用注册树模式? 单例模式解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过new建立实例对象的方法. 那么注册树模式想解决什么问

PHP设计模式_注册树模式

通过注册树模式可以更加简单快捷的获取对象,在某个地方实例化了一个对象,可以将这个对象“保存”起来(放入可以全局使用的数组里),用的时候只需要提供 保存对象的时候 的那个标识即可,解决全局共享和交换对象,直接从该数组上获取即可. 为什么要采用注册树模式? 单例模式解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过new建立实例对象的方法. 那么注册树模式想解决什么问题呢? 在考虑这个问题前,我们还是有必要考虑下前两种模式目前面临的局限. 首先,单例模式创建唯一对象的过程本身

php模式设计之 注册树模式

什么是注册树模式? 注册树模式当然也叫注册模式,注册器模式.之所以我在这里矫情一下它的名称,是因为我感觉注册树这个名称更容易让人理解.像前两篇一样,我们这 篇依旧是从名字入手.注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘的模式设计方法.   这让我想起了小时候买糖葫芦,卖糖葫芦的将糖葫芦插在一个大的杆子上,人们买的时候就取下来.不同的是,注册树模式摘下来还会有,能摘很多次,糖葫芦摘一 次就没了... 为什么要采用注册树模式? 单例模式解决的是如何在整个项目中创建唯一

java软件设计模式只单例设计模式

概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的:设计模式使代码编制真正工程化:设计模式是软件工程的基石脉络,如同大厦的结构一样. 设计模式分为三种类型,共23种.创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式.结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.