Skip to main content

PHP.yml

13 min read


---


- type: PHP
tag: langs
score: 0
using:
url: https://github.com/php/php-src
des: The PHP Interpreter
sub:
- url: https://github.com/composer/composer
des: PHP PKG Manager
- url: https://github.com/laravel/valet
des: 大概是最好用的laravel开发环境部署工具,比 Vagrant 和 Homestead 之类的都更易用。使用valet可以大大简化本身非常繁琐的PHP开发环境部署。另外,valet除了原生支持laravel以外,还支持slim, symfony, wordpress以及Drupal, CakePHP之类很多国外比较常用的PHP框架,如果官方不支持也可以从gh搜到类似 ThinkPHP5ValetDriver 这样的driver,非常实用,可以免受各种安装PHP环境之苦。[2024-05-07] 吐槽一下valet,不得不说虽然已经,但是使用流程仍然很别扭,最核心的问题就是,不应该用composer来安装valet(而是应该用brew之类的第三方)。可以理解为层级问题,依赖关系为php -> composer -> valet,然后需要先park再link,park本身就可以给该dir下的所有。另外,需要 `pecl install igbinary`、`pecl install redis`。我不理解,为啥用valet提供的虚拟域名,就会报“不支持redis”的bug,用 run启动built-in的server,就没有这个问题。有点离谱,就这个问题至少搞了1h。
rel:
- url: https://github.com/shivammathur/homebrew-php
des: 这个就是valet在用的用来切换PHP版本的repo,因为homebrew对
topics:
- topic: PHP functions
qs:
- 数组相关函数(取差集和交集 diff函数, intersect)(数组回调函数 array_reduce(), array_map(), array_filter(), array_walk())、(排序函数 # sort()/rsort(), asort()/arsort())
- array_search(), in_array(), array_key_exists() 的区别?
- array+array 和 array_merge()?
- "***php中使用 array_filter(), array_map(), array_reduce() 各自使用场景***"

- 字符串相关函数(pos, replace, slashes, cmp, 打印输出)
- strtr() 和 str_replace() 的区别 # perf, is case sensitive

- 文件相关函数
- 数字相关函数
- PHP 精度丢失,有哪些解决方案? # 用PHP 的高精度拓展BC Math
- PHP如何保留两位小数?
- PHP如何返回随机小数?

- topic: PHP的OOP语法
qs:
- 类型声明(type hint)有哪些?返回类型声明和标量类型声明 (对象,接口,数组或者 callable) 分别有哪些? # 通用的(int、float、bool、string、array、callable、iterable、class/interface/self 类、递归类型 Traversable)
- "***PHP 的异常处理?***" # 错误和异常是两码事, try-catch, throwable(php7 之后才有的)
- "***PHP有哪些预定义Exception?***" # BadFunctionCallException, LengthException, ...

- 【PHP 闭包(Closure)】 # use, bindTo
- 【PHP 魔术方法】 # 4*2 + 2*4 = 16
- PHP Attributes?
- 【PHP 预定义变量】
- 【PHP 全局变量 (全局预定义变量)】 # $_GET, $_POST, $_COOKIE, ...
- 【PHP 魔术常量】都有哪些?
- 【PHP 预定义常量】都有哪些?
- PHP中const 和 define定义常量有啥区别? # Const 关键字在类内定义常量,define 在类外定义常量
- "***public, private, protected, final, static 各自的使用场景?***"
- 有哪些`访问权限修饰符`?
- 【final 修饰符】是什么?
- 使用`静态方法`的好处?
- PHP 中静态方法和非静态方法的使用及区别?举例说明静态方法的好处?
- 为什么$this 能够访问到静态方法呢?
- “三元运算符”的几种写法?tricks写法? # "($a = $a ?: 1) ($a = $a ?? 1) ($a = $a ? $a : 1) ($len = $type == 'year' ? 4 : 2;)"
- 【instanceof】 # $data as &$key 是什么意思?
- VariadicFunc 可变参数和参数解包
- if...else...label的使用 # [一个关于if else容易迷惑的问题](https://mp.weixin.qq.com/s/ilfoYetC-tLaKAoCdtvdVg) 也就是说,通过在else里加语句这种label写法,把if...else...变成了顺序执行。这种语法糖知道就行了,还是少用为好,结构不清晰

- topic: PHP class
qs:
- 抽象类里可以没有抽象方法吗? # 抽象类中可以没有抽象方法(全部都是普通方法),那么,抽象类和普通类的区别就在于:抽象类只能继承,不能实例化。
- 抽象类和接口类的区别? # 接口类是特殊的抽象类。接口类不能声明变量,只能声明常量。抽象类可以声明变量。接口类没有构造方法,抽象类可以有。接口类就是一个类的领导者,指明方向,子类必须完成他指定的方向,就是要实现什么都已经规定好了。抽象类就是把相同的抽出来了,不需要必须使用,继承的时候使用 extends 继承。
- implements, extends # 接口继承用 implements,抽象类继承用 extends

- 【trait】怎么看待 trait?要评价 trait,首先需要解决以下几个问题:我们为什么需要引入多重继承?引入多重继承是为了解决什么问题? # Trait 解决了 PHP 不能多继承的问题,“看起来像 interface,但是用起来像 class 的东西”
- 如果两个 trait 里有同名方法或者属性怎么办? # 使用 instanceof() 和 as 来解决。instanceof() 关键字用前者取代了后者,as 关键字给被取代的方法起了一个别名。

- "***【PHP预定义类】有哪些?***" # Exception, Directory, Error(TypeError, ParseError), Throwable, Closure

# [PHP Predefined Interfaces 预定义接口 -- 简明现代魔法](http://www.nowamagic.net/librarys/veda/detail/2167)
- "***【PHP预定义接口类(PHP七大预定义接口)】有哪些?***" # Iterator, Generator, Closure, JsonSerializable, ...

- PHP中使用闭包的几种方法? # use 方法、bindTo 方法
- 【php匿名类】
- php 后期静态绑定 # [对 PHP 后期静态绑定的理解 | Laravel China 社区](https://learnku.com/articles/8964/understanding-of-static-binding-at-the-later-stage-of-php)

- topic: composer
qs:
- 几种PSR规范 # Code Spec(PSR1, PSR2, 内容很多,但是无须注意直接用cs-fixer即可), logging(PSR3), Autoload(PSR4)
- "**composer 自动加载原理?**"
- 把 composer 包名字写到 require 里,执行 update,具体是怎么把包自动加载到 laravel 里的?能不能说一下?
- php 自动加载的演进过程?
- composer.json 文件里都有什么? # PSR-4(composer 的标准自动加载方式)、class-map、直接加载file
- PSR规范 (PSR-4)
- composer SemVer
- 怎么开发 Composer 包?实战
- 如果 laravel 的类没有正常引入,执行 composer dump-autoload,再引入一遍

- topic: 其他问题
qs:
- php的xdebug断点调试怎么搞? # [[php.ini] xdebug](https://gist.github.com/XBPk3T/4596477bd95bd797e5cb582d5f60abf4) 其实php的xdebug断点调试也很简单,pecl install xdebug之后,修改 php.ini 中ext相关配置即可

repo:

- url: https://github.com/laravel/laravel
rel:
- url: https://github.com/spatie/laravel-query-builder
des: query-builder嘛
- url: https://github.com/DarkaOnLine/L5-Swagger
des: swagger for laravel # php artisan l5-swagger:generate
- url: https://github.com/Jiannei/lumen-api-starter
des: 非常完善的api-starter,可以参考,不逊于我的laravel-starter
- url: https://github.com/dingo/api
des: 已经EOL了。用来实现接口的路由版本管理,dingo 内置的异常处理(Http Exception)、多种认证方式、接口限流、接口的版本管理(前缀与子域名),以及最常用的 transformer。
- url: https://github.com/tymondesigns/jwt-auth
des: 用来实现用户认证
- url: https://github.com/thephpleague/fractal
des: 实际上就是 dingo 默认的 transformer 层
- url: https://github.com/larastan/larastan # php artisan code:analyse --level=4
rel:
- url: https://github.com/phpstan/phpstan
des: 静态检查工具Static Analysis Tool,和 cs-fixer 一样,一种是作为服务,一种是作为一个 laravel 的 composer 包。建议作为服务使用,以免影响生产环境性能,当然作为包使用更方便。如果laravel项目可以使用larastan。除此之外,其他工具还有 phplint、phpqa、grumPHP。需要注意PHP作为Dynamic-Lang,SAT工具实际上很鸡肋。
- url: https://github.com/overtrue/phplint
- url: https://github.com/PHP-CS-Fixer/PHP-CS-Fixer
des: 代码规范工具 # [PHP Linters](https://gist.github.com/XBPk3T/8ba0b43a6d38906c12825d5dede1e22a) php-cs-fixer fix $PWD --config=cs.php
- url: https://github.com/orchestral/testbench
des: benchmark test for laravel
- url: https://github.com/aschmelyun/docker-compose-laravel
des: laravel docker-compose.yml
topics:
- topic: x
qs:
- "***How to optimize laravel?***"
- laravel 里使用了哪些设计模式?
- laravel 文件夹结构
- laravel 的工作原理?laravel 路由加载原理?

- topic: laravel用法
qs:
- laravel 里如何直接使用 db 的 json 类型?如果字段是 meta,可以直接用 meta->name 这种方法取出;读操作和写操作都可以使用
- laravel 不读某个字段? # 用$hidden 属性在 model 里设置隐藏字段和安全字段
- laravel 里 model 属性的隐藏,展示和临时隐藏 分别怎么实现? # $hidden, $visible, 临时隐藏(return $user->makeVisible('attribute')->toArray();)
- laravel 的$appends 属性怎么用? # appends 属性用来临时添加某个数据库里没有的字段,实现动态修改模型,使用 getColumnAttribute() 来定义字段数据
- 同一个 model 使用不同 connections 连接不同数据库,使用事务时,即使报错也无法回滚,怎么处理? # DB::connection('some_connection')->beginTransaction();

- laravel 单元测试的文件上传? # $fakeImg = UploadedFile::fake()->image('temp.jpg');
- laravel 里多对多的写入和查询怎么做?
- laravel 里服务容器的工作原理?
- laravel 的 elq 关联关系中的 loadMissing() 和 getDirty() 方法的区别?
- laravel 里多态关系的表单验证
- laravel 怎么添加自定义校验规则? # 在 AppServiceProvider 里通过 Validator::extend 注册自定义规则,如果规则比较复杂,也课可以通过 make:rule 生成一个对应的自定义规则类。
- "***怎么把laravel服务暴露在局域网?***" # php artisan serve --host=局域网ip --port=

- topic: service-provider
qs:
- laravel 为什么需要 service-provider # register() 就是 service-provider 用来往 service-container 里注册服务的
- provides() 和$defer
- service-provider 的加载和执行过程
- service-provider 的boot(), provides() 和$defer

- topic: facade
qs:
- facade 是什么?
- facade 的工作原理?
- laravel 是怎么实现 facade 的?

- topic: queue
qs:
- 多个 laravel 同时运行时,队列互串的问题,怎么解决?
- laravel 里如何限制队列执行频率和队列长度?
- laravel 里队列,如何给不同的队列设置不同的 list?如何修改某个队列的 driver? # 这块还要注意 trait 属性不能通过重新定义直接重写的问题,最好在构造方法里重写
- 消息推送是否应该放到队列里?队列里应该放什么逻辑? # 应该放耗时任务,一些逻辑无关的业务,一些错误容忍性高的业务。比如一些使用了与逻辑无关的第三方应用(比如消息推送,一次两次的失败是可以接收的;当然,一些与逻辑有关的第三方应用应该做好容错)
- laravel 队列的 fail, retry, delay

- topic: jwt-auth
qs:
- jwt 是什么? # header(加密算法), payload(exp 过期时间,sub 是 jwt 的主体,通常是用户的 id), sign(保证 token 不被篡改)
- 安装 jwt 以及配置
- 为什么需要刷新 token? # 因为设置有效期后,token 会失效,所以需要刷新 token
- 怎么使用刷新 token?
- "***如果使用 jwt 作为客户端到服务端的验证?***" # 依次check token中的sign, 以及payload中的expire和sub
- 如果 jwt 被截取了,怎么办?假设一个场景,黑客抓到了用户 a 的 jwt,使用用户 a 的 jwt 进行各种操作,怎么办?
- token 的验证流程?要看源码
- 如果刷新 token 过期了,怎么办?
- 如果 refresh token 过期,就需要用户重新登录了
- 当然还可以把这个机制设计得更复杂一些,比如,Refresh Token 每次使用的时候,都更新它的过期时间,直到与它的创建时间相比,已经超过了非常长的一段时间(比如三个月),这等于是在相当长一段时间内允许 Refresh Token 自动续期。
- jwt-auth 黑名单
- laravel+dingo 的第三方登录
- jwt 怎么实现多表多用户系统的隔离?

- topic: fractal
qs:
- fractal 的基本使用? # DAS 数据的结构是统一的,无论输出集合还是单条数据,都是 data 和 meta;而 AS 在输出单条数据时,没有 data 这层;相比之下,我们的使用频率;DAS>AS>JAS
- 怎么直接切换 fractal 提供给我们的三种数据结构? # 在`\App\Providers\AppServiceProvider`里的`boot()`里加这个方法
- 如何使用fractal返回自定义格式的接口? # 1、在\App\Providers\AppServiceProvider::boot 里,加一个 fractal() 方法,在这里就把数据格式进行转换。2、写一个自定义的 CustomSerializer 类,来起到自定义格式的作用。3、修改config/api.php里的errorFormat。

- topic: laravel-starter 时遇到的一些坑(以及学到的一些东西)
qs:
- 拿 Laravel 开发时,首先要把缓存关闭,否则上线之后,会出一大堆问题
- Laravel 转移文件夹到另一 PC 或者环境后访问出现 500,设置权限为 777
- 设置路由后页面总是 404 Not Found
- php+zipkin
- laravel 的 composer 包的 Logger 怎么实现?
- 单元测试,需要现在 phpunit.xml 里预定义各项配置。如果不使用默认的`.env`文件,需要通过`createApplication()`方法指定如`.env.dev`等配置文件。

- url: https://github.com/sebastianbergmann/phpunit
sub:
- url: https://github.com/mikeerickson/phpunit-pretty-result-printer
des: phpunit 美化
- url: https://github.com/mockery/mockery
des: Mock Test For PHP
topics:
- topic: phpunit
qs:
- 断言有哪几种?
- "***phpunit.xml 文件说明***" # 需要现在 phpunit.xml 里预定义各项配置
- laravel 的 tests 文件夹的两个子文件夹(Feature和Unit)分别有啥用? # Feature 用来功能测试,Unit 用来单元测试
- "*多环境下,怎么使用对应环境的 phpunit?*" # 添加 .env.dev, .env.prod 之类的env文件
- 怎么模拟认证用户?
- 文件上传怎么单测?
- "***有哪些对于 phpunit 的增强方案?***" # 1、phpunit 美化。2、对 phpunit 持续集成。3、phpunit 测试覆盖率。
- phpunit 测试覆盖率
- "***怎么用单元测试来测试 laravel(以及laravel中间件)?***" # [一份经过时间检验的 Laravel PHPUnit 测试经验分享 | Laravel China 社区](https://learnku.com/articles/44675)

- url: https://github.com/perftools/xhgui
des: PHP的性能分析工具都不太靠谱,其他的类似服务,本地服务(z-ray、tideways+xhgui、kint、blackfire)和在线服务(oneapm、new-relic)都不太行。差不多能用的只有只有这个了,xhgui是基于tideways和xhprof实现的。

- url: https://github.com/z-song/laravel-admin
rel:
- url: https://github.com/jqhph/dcat-admin
des: 基于 laravel-admin 二次开发的

- url: https://github.com/jakzal/phpqa

- url: https://github.com/mix-php/mix
des: 也就是之前的OpenMix,PHP 命令行模式开发框架,内置了redis之类的服务

- url: https://github.com/hyperf/hyperf
des: 基于swoole实现让PHP也支持协程的ms框架

- url: https://github.com/briannesbitt/Carbon
des: 就是那个Carbon,最好用的时间库

- url: https://github.com/rectorphp/rector
des: Rector 是一个用于即时升级和自动重构任何 PHP 5.3+ 代码的工具。1、支持从 PHP 5.3 升级到 PHP 8.4,简化了框架和库的更新过程。2、自动化代码重构,提高团队中开发者之间的一致性与代码质量。3、可以通过单个规则或规则集灵活使用,便于控制变更。


- url: https://github.com/livewire/livewire
des: 基于laravel的全栈框架