PHP 获取不带命名空间的类名

方法很多,列出几个,以供参考。 Laravel 源码里扒出来的 class_basename 辅助函数 basename(str_replace('\\', '/', $class)); substr 实现 substr(strrchr($class, "\\"), 1); // or substr($class, strrpos($class, '\\') + 1); explode 实现

July 24, 2018 · Wi1dcard

数据库血的教训

不用扩展实现的 PHP 加密混淆,没有靠谱的产品,还有可能导致逻辑出问题,而且无法检查。 由于环境因素的差异在 PHP 内产生的影响是非常巨大的,做 SaaS (服务器由客户运维)还是不用 PHP 为好。 「简单易学」、「向前兼容性好」的特质使得 PHP 的代码可能极致优雅,也有可能一滩烂泥;「可以运行」的代码或许存在巨大的可读性差距、性能差距。 MySQL BINLOG 也不是那么好玩的… 若是数据库结构有改动,想要实现闪回恐怕不是那么简单。 准备开坑 Golang。 难受。

July 17, 2018 · Wi1dcard

Yii2 输出文件下载响应

最近为了尽可能优雅地实现产品需求,天天看 Yii 源码,感觉还是非常爽的。本文将要介绍如何使用 Yii 内置的方法,输出文件、流、字符串为下载响应。 通过查看 yii\web\Response 源码可知,其提供如下方法: public function sendFile($filePath, $attachmentName = null, $options = []); public function sendContentAsFile($content, $attachmentName, $options = []); public function sendStreamAsFile($handle, $attachmentName, $options = []); 那么如何在控制器内调用此方法输出呢?

July 14, 2018 · Wi1dcard

Yii2 在模块内映射 Controller 到其它控制器

上文讲解关于如何映射 Action,本文讲解如何映射 Controller。 0x00 实现 首先,在你的 Module 里,定义一个 $controllerRedirectMap 变量。 public $controllerRedirectMap = []; 重写 createControllerByID 方法。 public function createControllerByID($id) { if(isset($this->controllerRedirectMap[$id])) { $id = $this->controllerRedirectMap[$id]; } return parent::createControllerByID($id); } 0x01 用法 public $controllerRedirectMap = [ 'foo' => 'bar' // 访问 `module/foo/index` 将会被重定向至 `module/bar/index` 'foo/bar' => 'bar/foo' // 访问 `module/foo/bar/index` 将会被重定向至 `module/bar/foo/index` ]; 0x02 感想 一口气写三篇关于 Yii2 的博文,算是对自己近期项目中用到 Yii 以来的技巧小结吧。

July 13, 2018 · Wi1dcard

Yii2 在控制器内映射 Action 到其它动作

本文讲解:如何把控制器内的任意一个 Action 映射到另一个 Action。 0x00 准备 Yii ^ 2.0.7 0x01 代码 首先定义一个 RedirectAction 类。 class RedirectAction { protected $actionId; public function __construct($actionId) { $this->actionId = $actionId; } public function __invoke($id, \yii\base\Controller $controller) { return $controller->createAction($this->actionId); } } 接着在控制器内重写实现 actions() 方法,用于映射 Action ID => 实际的动作。

July 13, 2018 · Wi1dcard

Yii2 允许控制器内直接返回数组

类似 Laravel 的效果:直接 return 数组输出 JSON 响应。办法有很多,目前我找到的最优解决方案如下。 /** * Enable JSON response if app returns Array or Object * * @return void */ protected function enableJsonResponse() { $this->response->on(\yii\web\Response::EVENT_BEFORE_SEND, function ($event) { /** @var \yii\web\Response $response */ $response = $event->sender; if (is_array($response->data) || is_object($response->data)) { $response->format = \yii\web\Response::FORMAT_JSON; } } ); } 或者在配置内定义也可以:

July 13, 2018 · Wi1dcard

PHP 批量替换字符串

PHPer 们应该都知道 str_replace 函数,而如何使用数组批量替换某字符串内的子串,这里有个骚操作。 话不多说,直接上代码: $map = [ 'foo' => 'bar', // ... ]; $str = str_replace(array_keys($map), array_values($map), $str);

July 11, 2018 · Wi1dcard

PHP 使用 array_map 替代 foreach

讲个 PHP 的骚操作。论如何实现:把二维数组内某二维元素的值,单独提出来组成一维数组。 0x00 传统操作 $pieces = []; foreach($whole as $item) { $pieces[] = $item['foo']; } return $pieces; 0x01 骚操作 return array_map( function ($item) { return $item['foo']; }, $whole ); 省掉两个变量($pieces、$item),对于业务逻辑比较复杂的位置,省一个变量说不定就少死十个脑细胞…

July 11, 2018 · Wi1dcard

对 MacDown 说再见

这两天又在折腾编辑器,早上刚更新了关于 VSCode 的最新配置。 从接触 Markdown 到现在,差不多一年,最开始记不住格式、到现在驾轻就熟。 最早的时候,入门 MD 选了很久的编辑器,从各类在线编辑一路撸到 MacDown,那个时候选编辑器的唯一标准就是:预览一定要强大牛逼😂。 后来把 MD 作为代码文档标配,就开始尝试用 VSCode 写 MD,也慢慢总结出了一些优劣: VSCode 支持代码高亮渲染,MacDown 不支持。 MacDown 支持配置各类渲染选项、自定义 CSS,VSCode 原生不支持。 MacDown 支持回车自动补全列表 - / *,VSCode 原生不支持。 MacDown 支持导出 PDF,VSCode 原生不支持。 但是!就像我很早之前在 推荐 VSCode 的博文 里说的那样:

July 10, 2018 · Wi1dcard

VS Code - 来自微软的骚操作

PHP Storm 因功能强大被 PHPer 们所熟知,但自身功能愈发强大带来的问题也同样明显:功能臃肿/启动缓慢/内存占用高等。VS Code 经过几年的发展算是后起之秀,占领了一部分小众市场。 尝试发现,通过深度配置,VS Code 编写 PHP 代码的体验完全不亚于 PHP Storm。故今天为大家介绍:来自微软的骚操作 —— VS Code。 更新(2019 年 4 月 11 日) 由于 Settings 内包含敏感信息,因此 Gist 链接已移除。

July 10, 2018 · Wi1dcard