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

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

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

    工厂模式 简单工厂模式 [静态工厂方法模式](Static Factory Method)是类的创建模式 工厂模式的几种形态: 1.简单工厂模式(Simple Factory)又叫做 静态工厂方法模式 ...

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

    三种基础设计模式(所有面向对象设计模式中最常见的三种): ① 工厂模式:使用工厂方法或者类生成对象,而不是在代码中直接new 在 Common 目录下新建 Factory.php: <?php ...

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

    一.工厂设计模式 index.php $db = IMooc\Factory::createDatabase(); 使用工厂类的静态方法直接创建一个dababase对象,当类名发生修改时,在工厂里修改 ...

  4. php基础设计模式 注册树模式、工厂模式、单列模式

    废话不多说了,先给大家介绍注册树模式然后介绍工厂模式最后给大家介绍单列模式,本文写的很详细,一起来学习吧. php注册树模式 什么是注册树模式? 注册树模式当然也叫注册模式,注册器模式.之所以我在这里 ...

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

    php模式设计之单例模式 什么是单例模式? 单例模式是指在整个应用中只有一个实例对象的设计模式 为什么要用单例模式? php经常要链接数据库,如果在一个项目中频繁建立连接数据库,会造成服务器资源的很大 ...

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

    应用举例 在Yii.php中: <?php class ServiceLocator extends Component { //保存实例化的对象,每个对象都是单例,且有唯一string类型的I ...

  7. 2018/04/24 PHP 设计模式之注册树模式

    之前学习了工厂模式和单例模式,明白了他们的意义. 但是我们在之后的使用中会发现一个问题,在新建一个实例的时候还是需要调用一个单例或者工厂,之后还是造成了代码和耦合和不好处理. 下面开始说一下: -- ...

  8. PHP设计模式_注册树模式

    通过注册树模式可以更加简单快捷的获取对象,在某个地方实例化了一个对象,可以将这个对象“保存”起来(放入可以全局使用的数组里),用的时候只需要提供 保存对象的时候 的那个标识即可,解决全局共享和交换对象 ...

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

    php注册树模式 1.什么是注册树模式? 注册树模式通过将对象实例注册到全局对象树上,需要的时候将对象从全局对象树上取下来,就像小时候买糖葫芦一样,卖糖葫芦的将糖葫芦插在一个大的杆子上,人们买的时候就 ...

  10. php设计模式之注册树模式

    什么是注册树模式?[全局共享和交换对象] 注册树模式当然也叫注册模式,注册器模式.注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘的模式设计方法.   这让我想起了小时候买糖 ...

随机推荐

  1. 装饰者模式(Decorator pattern)

    知识点 类应该对扩展开放,对修改封闭. 案例 (本故事纯属虚构) 某日早上,流年刚把新开发的游戏项目提交给经理 public abstract class Role { public virtual ...

  2. List<T>保存为XML文件

    今天我们学习怎样把List<T>写成一个XML文件保存起来.因为我们在做动态网站开发时,需要对一些不太常变化的数据产生为XML文件,让程序直接去读取,而不是每次是SQL数据库取. 为了解决 ...

  3. 近乎(Spacebuilder)移动端 V2.2 发布,SNS 社区开源软件

    本次新版本是在以往版本基础上的进一步优化,尤其是架构和操作体验方面. 架构方面: 近乎团队在此次改版中摒弃了原有的缓存框架,启用更加清晰.易于维护的近乎V2.2结构框架,提升了产品的开发效率和拓展性, ...

  4. C++: DataGridView::DataSource

    #pragma once #include "Form2.h" namespace cdemo { using namespace System; using namespace ...

  5. jquery练习

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. SoapUI 使用笔记

    1. 构建项目 安装完成后 右键Project --> New SOAP Project 在弹出的 New SOAP Project框中输入名字 和 webservice服务地址(example ...

  7. Python Sqlite3以字典形式返回查询结果

    sqlite3本身并没有像pymysql一样原生提供字典形式的游标. cursor = conn.cursor(pymysql.cursors.DictCursor) 但官方文档里已经有预留了相应的实 ...

  8. Linux命令速查手册,超详细Linux命令教程

    一.常用命令速查 ls cd pwd cat more less tail head cp scp mv mkdir rmdir touch rm ps kill top free clear tre ...

  9. 使用PhpStrom等IDE编辑 远程linux服务器上的文件 实时更新

    习惯了在linux上 vim进行PHP的开发,突然忘了IDE的感觉,所以想到了.通过PhpStrom等IDE直接编辑 samba共享到 mac或者windows本地的磁盘进行编辑. 为了忘却的纪念,有 ...

  10. SpringFramework的简介

    一.前言 Spring提供了一种轻量级的解决方案,用于建立"快装式企业应用".在此基础上,Spring还提供了包括声明式事务管理,RMI或Web Services远程访问业务逻辑, ...