适配器模式

概念 将某个类的接口转换成与另一个接口兼容。适配器通过将原始接口进行转换,给用户提供一个兼容接口,使得原来因为接口不同而无法一起使用的类可以得到兼容。 应用场景 老代码接口不适应新的接口需求,或者代码很多很乱不便于继续修改,或者使用第三方类库。 <?php interface Weather { public function show(); } class PhpWeather implements Weather { public function show() { $weatherInfo = ['weather' => '雨', 'tep' => 6, 'wind' => 3]; return serialize($weatherInfo); } } //兼容模式 使得java能够直接使用 interface WeatherA { public function getWeather(); } class JavaWeather implements WeatherA { protected $weather; public function __construct(Weather $weather) { $this->weather = $weather; } public function getWeather() { $info = unserialize($this->weather->show()); return json_encode($info); } } $weather = new PhpWeather(); // $info = unserialize($weather); // var_dump($info); $java_weather = new JavaWeather($weather); $info = json_decode($java_weather->getWeather()); var_dump($info);

March 23, 2022 · 1 min · ZhaoGuibin

工厂模式

概念 工厂模式是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。 好处 使用工厂模式的好处是,如果你想要更改所实例化的类名等,则只需要更改该工厂方法内容即可,不需要逐一寻找代码中具体实例化的地方(new 处)修改了。为系统结构提供灵活的动态扩展机制,减少了耦合。 分类 简单工厂模式 工厂方法模式 抽象工厂模式 简单工厂模式 简单工厂模式又称静态工厂模式,之所以可以这么说,是因为简单工厂模式是通过一个静态方法来创建对象的 <?php class DbMysql { public function conn() { echo "连接MySQL"; } } class DbSqlite { public function conn() { echo "连接SQLite"; } } class DbFactory { public static function createIns($type) { switch ($type) { case 'mysql': return DbMysql(); break; case 'sqlite': return new DbSqlite(); break; default: throw new ErrorException('类型错误'); } } } $mysql = DbFactory::createIns('mysql'); $mysql->conn(); $sqlite = DbFactory::createIns('sqlite'); $sqlite->conn(); 工厂方法模式...

March 22, 2022 · 2 min · ZhaoGuibin

单例模式

概念 是一种类的设计只会最多产生一个对象的设计思想 作用 php的应用主要在于数据库应用,所以一个应用中会存在大量的数据库操作,使用单例模式,则可以避免大量的new操作消耗的资源。 如果系统中需要有一个类来全局控制某些配置信息,那么使用单例模式可以很方便的实现。 再一次页面请求中,便于进行调试,因为所有的代码都会集中在一个类里面,我们可以在类中设置钩子,输出日志,从而避免到处var_dump,echo。 应用场景 数据库连接,缓存操作,分布式储存 单例模式的要点 构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化。 拥有一个保存类的实例的静态成员变量。 拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化) 简称 三私一公: 私有化构造方法:不让在外部产生多个对象 私有化克隆方法:不允许对象被克隆产生新对象 私有化静态属性:运行进入类内部产生对象 公有化静态方法:保存已经产生的对象 <?php //单例 class Uni{ //创建静态私有的变量保存该类对象 static private $instance; //参数 private $config; //防止直接创建对象 private function __construct($config){ $this -> config = $config; echo "我被实例化了"; } //防止克隆对象 private function __clone(){ } static public function getInstance($config){ //判断$instance是否是Uni的对象 //没有则创建 if (!self::$instance instanceof self) { self::$instance = new self($config); } return self::$instance; } public function getName(){ echo $this -> config; } } $db1 = Uni::getInstance(1); $db1 -> getName(); echo "<br>"; $db2 = Uni::getInstance(4); $db2 -> getName(); /** *运行结果: *我被实例化了1 *1 *$db1创建对象后,参数是1 *$db2没有创建对象,而是直接使用$instance保存的唯一对象,所以输出的参数并没有变为4; */

March 22, 2022 · 1 min · ZhaoGuibin

什么是设计模式

什么是设计模式 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设计经验的总结。 那么我们常说的架构、框架和设计模式有什么关系呢? 架构是一套体系结构,是项目的整体解决方案; 框架是可供复用的半成品软件,是具体程序代码。 架构一般会涉及到采用什么样的框架来加速和优化某部分问题的解决,而好的框架代码里合理使用了很多设计模式。 比如:laravel框架中就使用到了很多的设计模式。其中包括单例模式,门面模式,注册树模式(DI/IOC),适配器模式,观察者模式等多种设计模式。 设计模式的目的是为了更好的代码重用性,可读性,可靠性,可维护性。 设计模式的作用 设计模式能解决: 替换杂乱无章的代码,形成良好的代码风格 代码易读,工程师们都能很容易理解 增加新功能时不用修改接口,可扩展性强 稳定性好,一般不会出现未知的问题 设计模式不能解决: 设计模式是用来组织你的代码的模板,而不是直接调用的库 设计模式并非最高效,但是代码的可读性和可维护性更重要 不要一味追求并套用设计模式,重构时多考虑 设计模式–六大原则 单一职责原则 定义 不要存在多于一个导致类变更的原因。既一个类只负责一项职责。 场景 类T负责两个不同的职责;职责P1,职责P2,当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。 <?php class Animal { public function bre($animal) { echo $animal."呼吸空气"; } } class Program { public function main() { $animal = new Animal(); $animal->bre('猫'); $animal->bre('狗'); $animal->bre('鱼'); } } 修正 遵循单一职责原则。分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。这样,当修改类T1时,不会使职责P2发生故障风险;同理,当修改T2时,也不会使职责P1发生故障风险。 <?php class Ter { public function bre($animal) { echo $animal."呼吸空气"; } } class Aqu { public function bre($animal) { echo $animal....

March 21, 2022 · 4 min · ZhaoGuibin

RSA数据加密解密

RSA数据加密解密 <?php //定义常量 define("INVOICE_PRINT_URL", ''); define("MERCHANT_ID", ''); define("MERCHANT_SECRET", ''); define("PLATFORM_PUBLIC_KEY", ''); define("MERCHANT_PUBLIC_KEY", ''); define("MERCHANT_PRIVATE_KEY", $''); define("ACCOUNT_VALUE", ''); const KEYSIZE = 2048;//密钥长度 <?php /** * @FuncName:getPlatformPublicKey * @Description 获取平台公钥 * @User ZHaoGuiBin * @Date 2020-08-17 8:29 * @return false|resource */ private static function getPlatformPublicKey() { return openssl_pkey_get_public(PLATFORM_PUBLIC_KEY); } /** * @FuncName:getMerchantPrivateKey * @Description 获取商户私钥 * @User ZHaoGuiBin * @Date 2020-08-17 8:29 * @return false|resource */ private static function getMerchantPrivateKey() { return openssl_pkey_get_private(MERCHANT_PRIVATE_KEY); } /** * @FuncName:getMerchantPublicKey * @Description 获取商户公钥 * @User ZHaoGuiBin * @Date 2020-08-17 8:29 * @return false|resource */ private static function getMerchantPublicKey() { return openssl_pkey_get_public(MERCHANT_PUBLIC_KEY); } /** * @FuncName:sslPublicEncrypt * @Description 公钥加密数据 * @User ZHaoGuiBin * @Date 2020-08-14 10:42 * @param $source_data * @return array */ private static function sslPublicEncrypt($source_data) { if (!...

August 22, 2020 · 2 min · ZhaoGuibin

多维数组拼接成字符串

多维数组拼接成字符串 /** * @FuncName:arrayToString * @Description 数组拼接成字符串 * @User ZHaoGuiBin * @Date 2020-08-14 9:17 * @param $data * @param string $keys * @param string $key_1 //多维数组主key * @param string $string * @return string */ private static function arrayToString($data, $keys = '', $string = '', $key_1 = '') { $temp = 0; foreach ($data as $key => $value) { if (is_array($value)) { if (!is_numeric($key)) { $key_1 = $key; $string .= $key_1 ....

August 22, 2020 · 1 min · ZhaoGuibin

数组按照alphabet序排序

数组key按照alphabet序排序 /** * @FuncName:arraySoft * @Description 数组key按照alphabet序排序 * @User ZHaoGuiBin * @Date 2020-08-13 15:45 * @param $data * @return mixed */ private static function arraySoft($data) { ksort($data); foreach ($data as $key => $value) { if (is_array($value)) { $data[$key] = self::arraySoft($value); } } return $data; }

August 22, 2020 · 1 min · ZhaoGuibin

php使用Linux命令导出MySQL数据到csv

PS :使用这个导出功能需要的条件: 1–服务器需要安装mysql客户端:yum install mysql 2–php需要开启exec函数(disable_functions exec) /** * @FILE_NAME:ExcelExport.php * @Description 数据导出excel,从数据库导出再下载,数据库配置 * [mysqld] * secure_file_priv= '' * @User ZHaoGuiBin * @Date 2019-12-04 13:52:58 */ class ExcelExport { /** * @FuncName:exportExcel * @Description * @User ZHaoGuiBin * @Date 2019-12-24 13:42:11 * @param string $title * @param $sql * @param $data * @return bool */ public static function exportExcel($title = '报表导出', $sql, $data) { $data_dir = getcwd() . "/data_export/"; //去除sql语句里的`,要不然执行shell命令报错 $sql = str_replace('`', '', $sql); $sql = str_replace('"', "'", $sql); //删除历史表格 self::deleteExcel(); if (!...

January 19, 2020 · 3 min · ZhaoGuibin

MySQL_OUTFILE导出数据

PS : mysql 需要开启grant FILE on . to newerp; 权限 /** * @FILE_NAME:ExcelExport.php * @Description 数据导出excel,从数据库导出再下载,数据库配置 * [mysqld] * secure_file_priv= '' * @User ZHaoGuiBin * @Date 2019-12-04 13:52:58 */ class ExcelExport { /** * @FuncName:exportExcel * @Description * @User ZHaoGuiBin * @Date 2019-12-24 13:42:11 * @param string $title * @param $sql * @param $data * @return bool */ public static function exportExcel($title = '报表导出', $sql, $data) { $data_dir = getcwd() ....

January 19, 2020 · 3 min · ZhaoGuibin

PHP导出数据报表

/** * @FILE_NAME:ExcelExport.php * @Description csv导出数据 * @User ZHaoGuiBin * @Date 2019-12-04 13:52:58 */ class ExcelExport { /** * @FuncName:sqlQuery * @Description 生成器模式返回数据 * @User ZHaoGuiBin * @Date 2020-01-08 16:43 * @param $sql * @return Generator */ public static function sqlQuery($sql) { $sys = new SysModel(); $db = $sys->getAdapter(); foreach ($db->fetchAll($sql) as $key => $val) { yield $val; //生成器返回数据,避免内存溢出 } } /** * @FuncName:exportExcel * @Description * @User ZHaoGuiBin * @Date 2020-01-09 09:23 * @param string $title * @param string $sql * @param array $data example : ["单号" => 'order_key'],['报表title名称'=>'mysql语句字段名'] * @return bool */ public static function exportExcel($title = '报表导出', $sql = '', $data = []) { $data_dir = getcwd() ....

January 19, 2020 · 3 min · ZhaoGuibin