文件应该声明新符号(类、函数、常量等)并且不会引起其他副作用,或者它应该执行具有副作用的逻辑,但不应该两者都做。
考虑 config.php 文件中的这个例子(我自己的):
/**
* Parsing the database URL.
* DATABASE_URL is in the form:
* postgres://user:password@hostname:port/database
* e.g.:
* postgres://u123:pabc@ec2.eu-west-1.compute.amazonaws.com:5432/dxyz
*/
$url = parse_url(getenv('DATABASE_URL'));
define('DB_HOST', $url['host']);
define('DB_NAME', substr($url['path'], 1)); // get rid of initial slash
define('DB_USER', $url['user']);
define('DB_PASSWORD', $url['pass']);
如果我这样做,我实际上是不尊重建议。由于变量, phpcs会理所当然地抱怨它:
FILE: config.php
-----------------------------------------------------------------------------------------------------------------
FOUND 0 ERRORS AND 1 WARNING AFFECTING 1 LINE
-----------------------------------------------------------------------------------------------------------------
1 | WARNING | A file should declare new symbols (classes, functions, constants, etc.) and cause no other side
| | effects, or it should execute logic with side effects, but should not do both. The first symbol
| | is defined on line 17 and the first side effect is on line 162.
-----------------------------------------------------------------------------------------------------------------
另一种选择是:
define('DB_HOST', parse_url(getenv('DATABASE_URL'))['host']);
define('DB_NAME', substr(parse_url(getenv('DATABASE_URL'))['path'], 1));
define('DB_USER', parse_url(getenv('DATABASE_URL'))['user']);
define('DB_PASSWORD', parse_url(getenv('DATABASE_URL'))['pass']);
没有变量,没有问题。但这是湿的,难以阅读。
我知道建议就是这样,它说“应该”,而不是“必须”。但这仍然困扰着我……一方面,任何时候我检查文件 phpcs 都会抱怨它,但每行只报告一次,从而为添加更多在配置文件中没有位置的“副作用”敞开大门。
我对整个 PSR 事情还是很陌生。
我是否错过了任何巧妙的方法来摆脱变量,同时保持可读性?
一个推论是:严肃的项目,坚持信守建议,如何处理这个问题?