邢栋博客

邢栋博客,Action博客,记录工作和生活中的点点滴滴

php设计模式之单例模式简单事例
<?php

//单例模式
class Singleton
{
	/**
	 * @var 这个类的"单例"
	 */
	private static $instance;

	/**
	 * 防止在这个类之外new这个类
	 */
	private function __construct()
	{
	}

	/**
	 * @return 返回这个类的单例
	 */
	public static function getInstance()
	{
		if(self::$instance === null){
			self::$instance == new self();
		}
		return self::$instance;
	}

	/**
     * @return void 把 clone 方法声明为 private,防止克隆单例
     */
    private function __clone()
    {
    }

     /**
     * @return void 把反序列化方法声明为 private,防止反序列化单例
     */
    private function __wakeup()
    {
    }

}

class SingletonChild extends Singleton
{
}

$obj = Singleton::getInstance();
var_dump($obj === Singleton::getInstance());             // bool(true)

$anotherObj = SingletonChild::getInstance();
var_dump($anotherObj === Singleton::getInstance());      // bool(true)

var_dump($anotherObj === SingletonChild::getInstance()); // bool(true)

?>

单例模式是非常有用的,特别是我们需要确保在整个请求的声明周期内只有一个实例存在。 典型的应用场景是,当我们有一个全局的对象(比如配置类)或一个共享的资源(比如事件队列)时。

php设计模式之工厂模式简单事例
<?php

//工厂模式

class Automobile
{
	private $vehicleMake;
	private $vehicleModle;

	public function __construct($make,$model)
	{
		$this->vehicleMake = $make;
		$this->vehicleModle = $model;
	}

	public function getMakeAndModel()
	{
		return $this->vehicleMake.' '.$this->vehicleModle;
	}

}


class AutomobileFactory
{
	public static function create($make,$model)
	{
		return new Automobile($make,$model);
	}
}

$veyron = AutomobileFactory::create('Bugatti','Veyron');

print_r($veyron->getMakeAndModel());
?>

上面的代码用来一个工厂来创建 Automobile 对象。用这种方式创建对象有两个好处: 首先,如果你后续需要更改,重命名或替换 Automobile 类,你只需要更改工厂类中的代码,而不是在每一个用到 Automobile 类的地方修改; 其次,如果创建对象的过程很复杂,你也只需要在工厂类中写,而不是在每个创建实例的地方重复地写。

php关于猴子选大王的算法题
<?php
    
    /**
     *  $m 猴子总数
     *  $n 出局数
     */
    function king($m,$n){
        $arr = range(1, $m);
        $i = 0;
        while (count($arr)>1) {
            if(($i+1)%$n == 0){
                unset($arr[$i]);
            }else{
                array_push($arr, $arr[$i]);
                unset($arr[$i]);
            }
            $i++;
        }
        return reset($arr);
    }

    function king2($m,$n){
        $arr = range(1, $m);
        $unsetNum = 0;
        for($i=2;$i<= $m*$n;$i++){
            foreach ($arr as $key => $value) {
                $unsetNum++;
                if($unsetNum == $n){
                    unset($arr[$key]);
                    $unsetNum = 0;
                }
                if(count($arr) == 1){
                    return reset($arr);
                }
            }
        }
    }

    function ysf($m,$n){
        $num=0; 
        for($i=2; $i<=$m; $i++){
            $num=($num+$n)%$i; 
        }
        return $num+1; 
    }

    $res = king(5,3);
    var_dump($res);

    $res2 = king2(5,3);
    var_dump($res2);

    $res3 = ysf(5,3);
    var_dump($res3);

php还原java中gzip压缩方法
有个需求,要把java代码里面的jzip压缩方法还原成php
java jzip压缩代码如下


 /*** 
     * 压缩GZip 
     *  
     * @param data 
     * @return 
     */  
    public static byte[] gZip(byte[] data) {  
        byte[] b = null;  
        try {  
            ByteArrayOutputStream bos = new ByteArrayOutputStream();  
            GZIPOutputStream gzip = new GZIPOutputStream(bos);  
            gzip.write(data);  
            gzip.finish();  
            gzip.close();  
            b = bos.toByteArray();  
            bos.close();  
        } catch (Exception ex) {  
            ex.printStackTrace();  
        }  
        return b;  
    }  



    php代码

     
class {

   /*
     * 把字符串进行gzip压缩,并转换成byte数组
     * @param $str 需要进行压缩的字符串
     * @param $bytes 目标byte数组
     */

   public static function myGzencode($str){

       $res = gzencode($str);
       $res = self::getBytes($res);
       $res[9] = 0; //这步完全是为了和java压缩后的头部保持一致,也许是个坑
       return $res;
   }

   /*
    * 转换一个String字符串为byte数组
    * @param $str 需要转换的字符串
    * @param $bytes 目标byte数组
    * @author Zikie
    */

   public static function getBytes($str) {

       $len = strlen($str);
       $bytes = array();
       for($i=0;$i<$len;$i++) {
           if(ord($str[$i]) >= 128){
               $byte = ord($str[$i]) - 256;
           }else{
               $byte = ord($str[$i]);
           }
           $bytes[] =  $byte ;
       }
       return $bytes;
   }  
    }
ps:https://tools.ietf.org/html/rfc1952#section-2.2

    同学给推荐了这边文章,如下内容 
0 - FAT filesystem (MS-DOS, OS/2, NT/Win32)
         1 - Amiga
         2 - VMS (or OpenVMS)
         3 - Unix
         4 - VM/CMS
         5 - Atari TOS
         6 - HPFS filesystem (OS/2, NT)
         7 - Macintosh
         8 - Z-System
         9 - CP/M
        10 - TOPS-20
        11 - NTFS filesystem (NT)
        12 - QDOS
        13 - Acorn RISCOS
       255 - unknown

    我压缩后转换成byte数组,第九位是11,java那边是0,可能我的文件系统是NTFS filesystem (NT),java可能是FAT filesystem (MS-DOS, OS/2, NT/Win32)


PHP不用第三变量交换2个变量的值
<?php
	
	$a = 'a';
	$b = 'b';
	//第一种方法 字符串截取
	$a .= $b;
	$b = substr($a,0,strlen($a)-strlen($b));
	$a = substr($a,strlen($a)-strlen($b));

	echo $a;
	echo "<br>";
	echo $b;
	echo "<br>";

	//第二种方法 字符串替换
	$a .=$b;
	$b = str_replace($b,"",$a);
	$a = str_replace($b,"",$a);
	echo $a;
	echo "<br>";
	echo $b;
	echo "<br>";

	//第三种方法 数组转换
	list($b,$a) = array($a,$b);
	echo $a;
	echo "<br>";
	echo $b;
	echo "<br>";

	//第四种方法 异或运算
	$a=$a^$b;
	$b=$b^$a;
	$a=$a^$b;
	echo $a;
	echo "<br>";
	echo $b;
yii2创建自己的扩展
1.建立yii2-helloxd仓库
    flyaction/yii2-helloxd
2.添加仓库内容,并初始化composer,提交到packagist
    2.1 添加仓库内容,并初始化composer,    
    mkdir composer-yii2 //创建目录
    cd composer-yii2  
    git clone https://github.com/flyaction/yii2-helloxd.git //克隆
    cd yii2-helloxd 
    composer init 
        This command will guide you through creating your composer.json config.
        Package name (<vendor>/<name>) [root/hello-yii2]: flyaction/yii2-helloxd
        Description []: say hello for yii
        Author [, n to skip]: n
        Minimum Stability []: dev
        Package Type (e.g. library, project, metapackage, composer-plugin) []: yii2-extension
        License []: BSD-3-Clause
        Define your dependencies.
        Would you like to define your dependencies (require) interactively [yes]? no
        Would you like to define your dev dependencies (require-dev) interactively [yes]? no
        {
           "name": "flyaction/yii2-helloxd",
           "description": "say hello for yii",
           "type": "yii2-extension",
           "license": "BSD 3-Clause",
           "minimum-stability": "dev",
           "require": {}
        }
    Do you confirm generation [yes]? yes
    Would you like the vendor directory added to your .gitignore [yes]? yes

   2.2修改生成的composer.json
    {
       "name": "flyaction/yii2-helloxd",
       "description": "say hello for yii2",
       "type": "yii2-extension",
       "license": "BSD-3-Clause",
       "require": {
       "yiisoft/yii2": "*"
   },
   "minimum-stability": "dev",
   "autoload": {
       "psr-4": {
           "flyaction\\helloxd\\": ""
       }
    }
}

2.3在yii2-helloxd 下新建Helloxd.php,内容如下
<?php
namespace flyaction\helloxd;
class Helloxd
{
   public static function sayHello()
   {
       return "hello";
   }
}
2.4提交至仓库,并打上标签
git commit -a -m 'first commit'
git push
git tag -a v1.0.0 -m '1.0.0版本'  
git push --tags

3.发布 到 packagist
进入https://packagist.org/,登陆后点击右上角的submit按钮,之后输入你的 github 仓库地址,点击 check 之后 submit
仓库地址: https://github.com/flyaction/yii2-helloxd.git

4.测试使用
进入我们的yii项目
composer require flyaction/yii2-helloxd
安装完毕后,进入一个控制器的方法,写入一些内容即可
echo \flyaction\helloxd\Helloxd::sayHello();




php格式化输出json数据
<?php  
  
/** Json数据格式化 
* @param  Mixed  $data   数据 
* @param  String $indent 缩进字符,默认4个空格 
* @return JSON 
*/  
function jsonFormat($data, $indent=null){  
  
   	// json encode  
    $data = json_encode($data,JSON_UNESCAPED_UNICODE);  //php5.4版本以上,如果低版本只能先urlencode然后再urldecode,保护中文
 
    // 缩进处理  
    $ret = '';  
    $pos = 0;  
    $length = strlen($data);  
    $indent = isset($indent)? $indent : '    ';  
    $newline = "\n";  
    $prevchar = '';  
    $outofquotes = true;  
  
    for($i=0; $i<=$length; $i++){  
  
        $char = substr($data, $i, 1);  
  
        if($char=='"' && $prevchar!='\\'){  
            $outofquotes = !$outofquotes;  
        }elseif(($char=='}' || $char==']') && $outofquotes){  
            $ret .= $newline;  
            $pos --;  
            for($j=0; $j<$pos; $j++){  
                $ret .= $indent;  
            }  
        }  
  
        $ret .= $char;  
          
        if(($char==',' || $char=='{' || $char=='[') && $outofquotes){  
            $ret .= $newline;  
            if($char=='{' || $char=='['){  
                $pos ++;  
            }  
  
            for($j=0; $j<$pos; $j++){  
                $ret .= $indent;  
            }  
        }  
  
        $prevchar = $char;  
    }  
  
    return $ret;  
}  
  

  
header('content-type:application/json;charset=utf8');  
  
$arr = array(  
    'member' =>array(  
        array(  
            'name' => '小矿工',  
            'gender' => '传奇卡'  
        ),  
        array(  
            'name' => '电磁炮',  
            'gender' => '传奇卡'  
        )  
    )  
);  
  
echo jsonFormat($arr);  
  
?>  

yii2控制器中跳转带提示语
控制器中
<?php
    use yii\helpers\Url;

    public function actionDelete($id)
    {
        $model = new LiveUser;

        $params = array();
        $params['id'] = $id;

        $result = $model->findOne($params)->delete();//删除

        if($result){
            $message = "删除成功";
            $error = false;
        }else{
            $message = "删除失败";
            $error = true;
        }
        $delay = 3;
        
        return $this->renderPartial('/system/redirect', array(
            'message'=> $message,
            'url'=> Url::to(['user/index']),
            'error'=>$error,
            'delay'=> $delay,
        ));
        
    }
?>


/system/redirect 视图
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>页面跳转提示</title>
    <style type="text/css">
        body{ margin:0px; padding:0px; font-size:12px;background:#FFFFFF;  font-family: '微软雅黑'; font-size:13px; color:#666666;}
        a{ font-size:13px; color:#2571be; text-decoration:none;}
        #cont{ width:60%; height:200px; border:1px solid #CCCCCC; margin:0px auto; margin-top:100px; background:#FFFFFF;}
        #cont_main{ width:80%; height:120px;  margin:0px auto; margin-top:50px;}
        #cont_main_l{ width:20%; height:100px; float:left; text-align:center; }
        #cont_main_r{ width:80%; height:120px; float:left; line-height:30px;}
        #cont_main_r .a{ font-size:16px; font-weight:bold;}
    </style>
</head>

<body>

<div style="background:#FFFFFF; height:500px;">
    <div id="cont">
        <div id="cont_main">

            <div id="cont_main_l">
                <?php if($error) {?>
                    <img src="statics/img/icon_failed.png" />
                <?php }else{?>
                    <img src="statics/img/icon_success.png" />
                <?php }?>
            </div>
            <div id="cont_main_r">
                    <span class="a"><?php echo($message); ?></span><br />

                <span>提示你可以进行以下操作:</span><br />
                系统将在 <b id="wait"><?php echo($delay); ?></b> 秒钟会自动跳转 <a id="href" href="<?php echo($url); ?>">点击跳转</a></span>
            </div>


        </div>
    </div>
</div>

<script type="text/javascript">
    (function(){
        var wait = document.getElementById('wait'),href = document.getElementById('href').href;
        var interval = setInterval(function(){
            var time = --wait.innerHTML;
            if(time <= 0) {
                location.href = href;
                clearInterval(interval);
            };
        }, 1000);
    })();
</script>
</body>
</html>


优惠券
最新微语