php经典设计模式和Trait类代码的复用

2019-11-08 来源: 苑儿飞雪 发布在  https://www.cnblogs.com/wangtongcom/p/11821048.html

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("我是传入的字符");
    }
}
/**
 * 对象注册树,注册模式
 * 1、注册:set(),把对象放树上
 * 2、获取:get(),把对象取下来使用
 * 3、注销:_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();
?>

  运行结果

当trait里的方法和本类以及父类同名时的优先级:当前类方法 > trait 的方法 > 父类的方法

相关文章