邢栋博客
邢栋博客,Action博客,记录工作和生活中的点点滴滴
php设计模式之策略模式简单事例
<?php //策略模式 interface OutputInterface { public function load($arrayOfData); } class SerializedArrayOutput implements OutputInterface { public function load($arrayOfData) { return serialize($arrayOfData); } } class JsonStringOutput implements OutputInterface { public function load($arrayOfData) { return json_encode($arrayOfData); } } class ArrayOutput implements OutputInterface { public function load($arrayOfData) { return $arrayOfData; } } class SomeClient { private $output; public function setOutput(OutputInterface $outputType) { $this->output = $outputType; } public function loadOutput($arrayOfData) { return $this->output->load($arrayOfData); } } $client = new SomeClient(); $arrayOfData = array('name'=>'action','age'=>'28'); // Want an array? $client->setOutput(new ArrayOutput()); $data = $client->loadOutput($arrayOfData); var_dump($data); echo "<hr>"; // Want some JSON? $client->setOutput(new JsonStringOutput()); $data = $client->loadOutput($arrayOfData); var_dump($data); echo "<hr>"; // Want some Serialized? $client->setOutput(new SerializedArrayOutput()); $data = $client->loadOutput($arrayOfData); var_dump($data);
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压缩代码如下
php代码
同学给推荐了这边文章,如下内容
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)
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
<?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();
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); ?>