程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php設計模式 工廠、單例、注冊樹模式,php設計模式

php設計模式 工廠、單例、注冊樹模式,php設計模式

編輯:關於PHP編程

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__; }
<?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規范的基礎框架

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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved