php經典設計模式和Trait類代碼的複用

PHP經典設計模式php

<?php
/**
 * 單例模式
 */
class Site
{
    #定義屬性
    public $siteName;
    #定義本類的靜態實例
    protected static $instance=null;
    #禁用構造方法
    private function __construct($siteName)
    {
        #初始化$siteName屬性
        $this->siteName=$siteName;
    }
    #獲取本類的惟一實例
    public static function getInstance($siteName="我是本類的惟一實例")
    {
        #檢測$instance屬性是否屬於本類
        if (!self::$instance instanceof self){
            self::$instance=new self($siteName);
        }
        return self::$instance;
    }
}
/**
 *用工廠模式生成本類的單一實例
 */
class Factory
{
    #建立指定類的實例
    public static function create()
    {
        return Site::getInstance("我是傳入的字符");
    }
}
/**
 * 對象註冊樹,註冊模式
 * 一、註冊:set(),把對象放樹上
 * 二、獲取:get(),把對象取下來使用
 * 三、註銷:_unset(),把對象註銷
 */
class Register
{
    #建立對象池,數組存儲
    protected static $objects=[];
    #生成對象並掛樹上
    public static function set($alias,$object)
    {
        self::$objects[$alias]=$object;
    }
    #從樹上取下對象
    public static function get($alias)
    {
        return self::$objects[$alias];
    }
    #把對象從樹上註銷
    public static function _unset($alias)
    {
        unset(self::$objects[$alias]);
    }
}
#將Site類的實例掛樹上去,放到對象池
Register::set('site',Factory::create());
#從樹上取下對象
$obj=Register::get('site');
#查看一下該對象
var_dump($obj);
echo"<hr>";
echo $obj->siteName;
?>

運行結果設計模式

Trait類的複用數組

<?php
/**
 * Trait實現了代碼的複用
 * 而且突破了單繼承的限制
 * Trait似類非類,不能實例化
 */
trait Demo1
{
    public function hello()
    {
        return __METHOD__;
    }
}
trait Demo2
{
    public function hello()
    {
        return __METHOD__;
    }
}
class Test
{
    public function hello()
    {
        return __METHOD__;
    }
}

class Demo extends Test
{
    #使用use關鍵字聲明trait,方法同名優先級:本類、trait、父類
    #Demo1的hello1方法替代Demo2的hello方法
    use Demo1,demo2{
        Demo1::hello insteadof Demo2;
        Demo2::hello as Demo2Hello;
    }
    public function hello()
    {
        return __METHOD__;
    }
    #經過trait使用
    public function test1()
    {
        #Demo1中的方法
        return $this->hello();
    }
    public function test2()
    {
        return $this->Demo2Hello();
    }
}
$obj=new Demo();
echo $obj->hello();
echo "<hr>";
echo $obj->test1();
?>

  運行結果this

當trait裏的方法和本類以及父類同名時的優先級:當前類方法 > trait 的方法 > 父類的方法spa

相關文章
相關標籤/搜索