Laravel 作为大名鼎鼎的 PHP Web 框架,有着「过度设计」的美誉(滑稽)。也就免不了附带着一些需要学习和摸索才能掌握的奇技淫巧(好吧其实只需要看看文档就行)。笔者结合自身的开发经验,把值得一提的东西梳理成文,便于读者在使用 Laravel 进行开发时事半功倍。

Composer

已经 9102 年了,Composer 作为 PHP 的包管理工具,相信已经不需要做介绍了。使用 Laravel 的过程中不可避免地会使用到各种各样的第三方包,Laravel 毫无疑问是使用 Composer 进行包管理的,对于国内开发者而言,第一件事显然是把 Composer 换为国内源,只需执行一下命令即可修改全局设置:

$ composer config -g repo.packagist composer https://packagist.phpcomposer.com

调试代码

打印变量

一般使用框架自带的 dd() 方法而不是 PHP 原生方法 print_r()var_dump() 来打印变量信息,因为 dd() 方法可以打印多个任何类型变量:dd($object, 123, [123, 324]);

顺便一提,所谓 dd 的意思是 dump, die,而在最新的 Laravel 6 框架中,新增了 ddd() 方法,它是 dd() 方法的升级版,意思是 dump, die, debug,你可以在这篇文章查看该方法的介绍。

打印 SQL 语句

在使用框架的 ORM 查询构造器时,可以通过 toSql() 方法输出原生 SQL 语句。

SQL 语句中的参数值由于被 ? 代替,可以使用 getBindings() 输出构造器中的查询条件:

<?php

$builder = DB::table('user')->where('id', 1);
$bindings = $builder->getBindings();
$sql = str_replace('?', '%s', $builder->toSql());
$sql = sprintf($sql, ...$bindings);

dd($sql);
阅读全文 »

翻转问答 VOL30 | 道理能解决消费主义和奢侈的否定欲望?

Episode Archive

道理无法解决问题

  • 消费主义本身并不是一个多深的批判,对消费主义的批评不需要过高的学术门槛。
  • 批判难度低并不意味着不具备批判价值。
  • 掌握道理本身不难,但改变和解决问题并不能通过了解某个道理来完成。

个人主义与消费依存

  • 消费主义与消费不是一回事。
  • 个人主义兴起之后,社会分工的消费交换使消费主义与消费的关联越来越紧密。
  • 依靠消费来维持日常生活,并不一定是消费主义的,而「由单一消费提供一切」的生活就是消费主义的。举例来说,购买器材录制播客,在录制过程中产出的内容并不是消费行为本身能够购买而来的,所以这一行为本身不是消费主义的。简单来看,消费过程中是否有内容产出,可以视为判断是否是消费主义的一个依据。

平民主义与消费权的平等

  • 消费权的平等伴随这消费门槛的降低而逐渐消失。在过去,某些消费具有门槛,例如衣冠不整不可进入餐厅;贵族社会使用的产品为特供等。
  • 消费权的不平等意味着在既有时代背景下,消费作为一种客体并不是最重要的东西,而导致消费不平等的因素或许比消费更重要,例如前述例子中的文明程度、权力等。
  • 平民主义兴起使得导致消费权不平等的因素越来越被反对,导致消费权不平等的各种特权亦被排斥,进而消逝。例如,一辆好车应该卖给谁,不以驾驶技术高低而论,而是价高者得。
  • 在诉诸消费权平等的过程中,金钱逐渐成为了决定消费的最重要的要素。附着在消费行为上的其他价值被渐渐瓦解,消费内涵的价值成了钱的价值。
  • 追求钱的价值会让物质的使用意义逐渐消逝,成为被观看的现象,让社会景观化
  • 物质本身的使用价值,需要更多的公共场合来展示,需要更多的公众关注。公共场合越小,公共场合越萎缩,社会越景观化,社会就越容易进入消费主义。
阅读全文 »

命名空间(namespace)

基本概念

  • PHP 命名空间与操作系统的物理文件系统不同,这是一个虚拟概念,没必要和文件系统中的目录结构完全对应。但是大多数 PHP 组件为了兼容 PSR-4 自动加载器标准,会把子命名空间放到文件系统的子目录中。
  • 从技术层面来看,命名空间只是 PHP 语言中的一种记号,PHP 解释器会将其作为前缀添加到类、接口、函数和常量的名称前面。
  • 不同代码可能使用相同的类名、接口名、函数名或常量名,如果不使用命名空间,名称会起冲突,导致 PHP 执行出错。而使用命名空间,把代码放在唯一的厂商命名空间中,这样不同命名空间下的代码就可以使用相同的名称命名类、接口、函数和常量。
  • 在同一个命名空间或子命名空间中的所有类没必要在同一个 PHP 文件中声明。你可以在 PHP 文件的顶部指定一个命名空间或子命名空间,此时,这个文件中的代码就是该命名空间或子命名空间的一部分。因此,我们可以在不同的文件中编写属于同一个命名空间的多个类。
阅读全文 »


PHP 的正则流派

  • PHP 的三种正则引擎是 pregcregmb_ereg
  • 在默认情况下,preg 套件的正则表达式是以字节为单位的,所以「\C」默认等价于「(?d:.)」,由 s 修饰的点号。不过,如果使用了修饰符 u,则 preg 套件就会以 UTF-8 字母为单位,也就是说,一个字符可能由 6 个字节组成。即使这样,「\C」仍然匹配单个字节。
  • \z」和「\Z」都能够匹配字符串的末尾,而「\Z」同样能够匹配最后的换行符。
  • $」的意义取决于模式修饰符 mD:如果没有设定任何修饰符,「$」等价于「\Z」(在字符串结尾的换行符,或者是字符串结尾);如果使用了 m,则它能够匹配内嵌的换行符,如果使用了模式修饰符 D,它能够匹配「\z」(只有在字符串的结尾)。如果同时设置了 mD,则忽略 D
  • PHP 正则引擎的处理方式完全是程序式的。
阅读全文 »


  • 因为 NFA 引擎容许用户进行精确控制,所以我们可以用心打造正则表达式。
  • 调校表达式时需要考虑的两个因素是准确性效率:精确匹配文本而不包含多余的内容,且速度要快。
  • 优化表达式的关键在于彻底理解回溯背后的过程,学习些技巧来避免可能的回溯。
  • 不同工具可能使用不同的优化措施。如果能够预先判断目标字符串基本无法匹配(例如目标宇符串缺少一个引擎能够预知的,匹配成功必须的字符),足够聪明的实现方式可以完全不应用正则表达式。
  • 在分析效率时,不要忘了不同正则引擎的差异。
阅读全文 »