PHP生成二维码单态模式封装类

PHP生成二维码封装类

简介:

1,php生成二维码,利用单态设计模式进行封装,方便调用。
2,里边融合了面向对象的基础知识,几个魔术方法,加深熟练
3,如果需要php生成二维码的基础代码,我会把上一篇链接在本篇文章

代码:

<?php
class makeqrcode
{ 
    private static $QRobj;
    private $data;
    private $level = 'Q';
    private $size = '10';
    private $margine = '2';
    private $filename = '../images/qrcode.png';
    private $qrcode_logo = '../images/qrcode_logo.png';
    private $rate = 5;
    private function __construct($data)
    { 
        require_once '../QRcode/phpqrcode.php';
        $this->data = $data;
    }
    public function __tostring()
    { 
        echo '二维码生成类';
    }
    public function __set($name,$value)
    { 

        switch($name)
        { 
            case 'level':
                if(!($value == 'L' || $value == 'M' || $value == 'Q' || $value == 'H')){ 
                    echo 'level参数错误';
                    return; 
                }
            break;
            case 'size':
                if( $value <= 0){ 
                    echo '$size参数不能小于等于0';
                    return;
                }
            break;
            case 'margine':
                if( $value <= 0){ 
                    echo '$margine不能小于0';
                    return;
                }
            break;
            case 'rate':
                if( $value <= 1){ 
                    echo '$rate不能小于1';
                    return;
                }
            break;
            case 'finename' || 'qrcode_logo':
                    echo '这两个参数不能修改';
                    return;
            break;
        }
        $this->$name = $value;
    }
    public function __get($name)
    { 
        echo $this->$name;
    }

    public function __isset($name)
    { 
        if($name == 'filename' || $name == 'qrcode_logo'){ 
            echo '不用测试,必须要有';
            return;
        }
        $bool = isset($this->$name);
        return $bool;
    }
    public function __unset($name)
    { 
        if($name == 'filename' || $name == 'qrcode_logo'){ 
            echo "不能删除";
            return;
        }
        unset($this->$name);
    }
    public function __call($funname,$param)
    { 
        echo '您调用的方法'.$funname.'不存在';
        echo '参数为';
        print_r($param);
    } 
    //单态模式生成对象
    static function newObj($data)
    { 
        if(is_null(self::$QRobj)){ 
            self::$QRobj = new self($data);
        }

        return self::$QRobj;
    }
    //生成纯二维码
    public function makeqrcode()
    { 
        QRcode::png($this->data,$this->filename,$this->level,$this->size,$this->margine);
    }
    //生成夹有logo的二维码
    public function qrCodeLogo()
    { 
        $this->makeqrcode();
        $QRcode = $this->filename;
        $logo = $this->qrcode_logo;
        //imagecreatefromstring() 从字符串中的图像流新建一图像
        $QR = imagecreatefromstring(file_get_contents($QRcode));
        $LG = imagecreatefromstring(file_get_contents($logo));
        $QR_width = imagesx($QR);
        $QR_height = imagesy($QR);
        $LG_width = imagesx($LG);
        $LG_height = imagesy($LG);
        $QR_LG_width = $QR_width/$this->rate;
        $tmp = $LG_width/$QR_LG_width;
        $QR_LG_height = $LG_height/$tmp;
        $width = ($QR_width-$QR_LG_width)/2;
        //从新组合  imagecopyresampled()重采样拷贝部分图像并调整大小 
        imagecopyresampled($QR,$LG,$width,$width,0,0,$QR_LG_width,$QR_LG_height,$LG_width,$LG_height);
        imagepng($QR,'../images/qr_logo_code.png');
    }
    //清除掉data
    public function __destruct()
    { 
        $this->data = "";
    }
}

$obj = makeqrcode::newObj('nihao');

$obj->qrCodeLogo();

归纳总结:

面向对象中的魔术方法:

    __set()     当给私有属性设定值的时候会访问该方法,怎么处理方法里设置
    __get()     当访问私有属性的时候回访问该方法,自己设置如何处理
    __call()    当访问类中没有的方法的时候,调用该方法
    __tostring()
    __construct()
    __destruct()

单态设计模式:

    节约内存,自始至终实例化一个对象。所以不能随便new,用构造方法私有化即可。用成员方法new对象
    ,但没对象访问,所以成员方法静态化用类名访问。如何判断到你new没new,可加一个属性来判断,
    静态方法不能访问非静态属性,所以对象属性静态化。最后就是静态方法,静态属性。静态方法里判
    断静态属性。只能实例化一次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值