PHP编码策略
编码政策
以下是总结了在BEAR.Sunday框架开发中的编码原则的内容。
目标
-
- クリーン
-
- ハイパフォーマンス
- No BC break
如果柔软性、可扩展性和可测试性都是”清洁”的话,自然而然地包含在其中。
全球化
-
- グローバル定数(define)の禁止
-
- スーパーグローバル変数の参照の禁止
-
- グローバルなサービスロケータの参照の禁止
-
- グローバルな設定の参照の禁止(prod/devモードなど)
-
- グローバルなプロパティ参照の禁止(スタティックプロパティ)
- グローバルなメソッド利用の禁止(スタティックメソッド)
根据其相关性
以下是对该文本的中文本地化翻译:
* 所有的基本操作都使用DI(依赖注入)。
* 禁止使用new关键字创建对象(除了值对象以外)。
* 禁止使用实际类名来获取对象(如工厂方法等)。
* 禁止使用接口中没有定义的方法。
* 如果参数是一个对象并且使用了公共属性,请不要在参数类型提示中使用接口,而是使用抽象类。
* 禁止依赖include_path。
* 禁止在抽象类之外使用setter注入。
* 使用composer只指定依赖库的最低版本,而不是锁定到特定版本。
继承
-
- 実クラスの継承の禁止 (finalキーワード付加)
-
- 子クラスから親クラスのメソッド利用の禁止
- 抽象クラス以外でのprotectedプロパティの禁止。
特征
-
- 原則禁止
- アプリケーションでDIのセッターメソッドのみ
输入参数、返回值
-
- 引数の数は4つまで(4も例外的)
-
- 引数にbool値を使用することを禁止
-
- スカラー値よりバリューオブジェクトを好む
-
- 特定の構造を期待する連想配列を使わない
-
- 返り値のmixedを避ける
nullのデフォルト引数を避ける
クロージャの引数を避ける
构造
-
- elseの禁止
- ネストのインデントは2つまで
序列化
- オブジェクトはシリアライズ可能に
目标衡量指标
-
- 1つのクラスのメソッドの数は10以下
-
- 1つのクラスのプロパティの数は15以下
- 1メソッドの平均ライン数は10行以下
这是原样使用phpmd的默认设置。
You want me to provide a single paraphrased option in Chinese for “CI”. Here it is:
– 情报
scrutinizer score 10.0
travis test coverage 99.5%
phpstan -l max src tests 双方 (CIに含める)
php-cs-fixer, phpcs src tests 双方 (CIに含める)
面向对象编程 (mianxiang duixiang biancheng)
-
- setter、getterを使わない
-
- デメテルの法則
-
- 小さなクラスを好む。
-
- 早期バリデーション、遅延評価
-
- サービスにオブジェクトを渡さない。オブジェクトにサービスを渡す。 (XXManagerクラスの禁止)
DRYをあまり重視しすぎない。
只需要用一種選項用中文將以下句子改寫一下:
基本原則
-
- 小さく。迷ったら簡素な方を。
-
- 言い訳はあとで。まずは取り組んでみる。
-
- 守るのが難しく見える時、そもそも取り組み方がそれでいいのか再考する。
- 速度を犠牲にする方向で解決することを避ける。
解释
我会解释一些。
禁止引用全局設定
直接引用yml的配置文件,或者创建Config(容器)类来获取值,不会发生。需要的值将作为依赖项注入。
$foo = Configure::read("foo") // NG
public function __construct($foo)
{
$this->foo = $foo; // OK
}
禁止使用new
除去值对象等。主要指服务对象的情况。
$email = new Email('exmaple@example.com'); // OK
$http = new AnnotationReader() // NG
禁止直接参考超级全局变量
Foo::createFromGlobals(); //NG
Foo::create($GLOBALS) // OK
不直接引用超级全局变量,而是将其作为依赖传递。
除此之外禁止
如果条件是布尔值且只有一个确定的else状态,那么没有关系。(即三元运算符是可以使用的)
将else字面意义上的“其它”排除。(但在这种情况下,可以通过使用守卫子句轻松排除else)
不使用带有各自含义的关联数组作为参数。
作为一个例子,我们可以创建一个名为Location的类,它拥有公共属性$x和$y,而不是将数组$location作为参数传递并使用$location[‘x’]和$location[‘y’]。
总结
各种编码原则有时会被贬低为“不现实”或“不符合PHP特点”。但是现在的PHP完全可以按照这些面向对象编程原则进行编码。清晰的代码实际上更简洁,并且在使用IDE和CI工具时,开发速度的牺牲也仅仅是初期的问题。
我认为,优秀的代码在开发速度和运行时速度之间并不存在权衡关系。
BEAR.Sunday提供的不是一个库的集合,而是一个“框架”。模块的实现随时变化,但我们希望能够提供一个与持续演进的HTTP应用程序结构保持一致的框架。遵循软件设计原则是为了在不破坏该框架的情况下(牺牲向后兼容性),实现框架的持续演进。