PHP的类设计
因为找到了以前在研讨会上学到的内容的备忘录,所以打算复习一下。
由于是相当久远的事情,所以解释可能会有错误。
(特别是ValueObject以下部分)
素材
创建询问/咨询表格。
班级的角色
班级的作用有以下两点。
1. 数据的存储
在类中定义的属性
public $name
通过引入 “…” 的方式,可以明确地指示需要什么样的项目,与数组不同。
换句话说,可以确定数据储存的规范。
比如,以下是一个User类的例子。
class User {
public $name;
public $age;
public $company;
}
在这个班级中需要 $name $age $company的项目。
2. 处理模块化
有时候,我们会将处理模块化为一个类,诸如验证(バリデート)等。在这种情况下,关键是在创建类时通过注释等必须写明「这个类是用来做什么」。
当你创建了将处理模块化的类时。
$contact = new User; //User:クラス名
通过创建类的实例,可以实现的方法变得非常方便,可以通过实例调用。
将课堂外部化
只需要一个选项,将以下内容进行中国本土化的释义:
据说这里被称为”将类外部化”。
return $contract->validate();
一旦能够通过”で呼び出せるようになったところ”,这只是稍微进行了一些外部化。
创建班级的要点
在中文中改述如下:
1个类1个功能是至关重要的原则。
例如,如果您想要执行以下操作,
-
- リクエストデータをとってくる
-
- バリデーションをする
-
- セッションに突っ込む
- DBに突っ込む
让一个类负责处理四个事务是没有意义的。
在创建一个班级时的重要概念
-
- 1クラス1責務
- IPO
重视这两点非常重要。
将班级投射到IPO中,可以得到以下结果。
-
- I:Input…引数
-
- P:Process…1クラス1責務
- O:Output…戻り値、例外
返回值的重要性
不要问「要做什么」,而是最重要的是「要做什么并回应什么」。
在修改反馈的保守时常常会发生,因此应该从一开始就进行文档化。
在PHP7中,可以使用返回值的类型指定。
validate():bool
在方法之后加上: 类型,可以指定返回的类型,所以应积极地使用。
返回值的验证
在验证的情况下,不仅返回“OK”或者“NG”,还要保证能够输出错误信息。
然而,需要注意的是,如果将“把错误信息返回给会话”这样的内容放在验证类中进行编写,会导致类的目的偏离。
创建一个验证类,专注于创建验证对象,并采取让接收方自由处理的态度是最好的解决方案。可以创建一个Service类,在其中将数据保存到数据库中。
控制器的作用
return view する
リダイレクトする
etc…
正如所说,控制器的角色是确保正确处理请求。
顺便说一下,如果在控制器内使用session,就无法在用于调试的artisan命令中使用,所以要注意。(因为session只能通过HTTP使用)
创建服务的地方 (Chuangjian fuwu de didian)
在Laravel中,创建服务通常将其放在app下。
价值对象
因为只是接收验证对象本身的话,感觉有点不方便,所以建议创建一个称为Contact类的ValueObject(以下简称VO)。
通过创建VO,与数组不同的是,“查看这里会明确了解到会有哪些项目”变得确凿无疑。
$contact = new Contact();
$contact->name = $data["name"]; //安全性が保障されている
状态保持/无状态哪一个更理想?
也许可以将同时具有属性和方法的类称为“状态类”。这样一来,在查看该类时会很方便,但如果它们相互依赖(属性和方法?)并且写错了处理时,会变得非常困难。
因此,在班级中互不依赖的「无状态」是理想的。
虽然类可以具有状态和处理的功能,但如果这样做会增加复杂性和依赖性,所以应该避免。
如果给出一个没有状态的类的例子,那就是Laravel的Eloquent。
不应该自己创建Eloquent。
总结
创建班级时
-
- 処理をするためのクラスか
- データを保持するためのクラスか
让我们开始思考。