PHP はフレンドリーな関数パラメータ受け渡しモード設計で、必要な友人が参照できます。
クラスのコンストラクター関数で渡す必要があるパラメーターが多い場合、プログラマーはコーディング時にパラメーターの順序や書き方を覚えるのが難しくなったり、間違ったパラメーターに値が渡されたりするため、コンパイルエラーが発生しやすくなります。 (弱い型付け言語) ケース。
親しみやすい機能的なデザイン
プログラマがクラスをインスタンス化する場合、渡されるパラメータは次の使いやすさの目標を満たしている必要があります。
1. 一部のパラメーターのみを渡すことができます
2. パラメータを順不同で渡す機能
3. パラメータの大文字と小文字を区別できません
4. パラメータ転送時に発生するエラーを迅速かつ正確に通知できる
プロセスを改善する
例 1 - メンバー変数にデフォルト値を割り当てる
次のコードを見てください。このようにして、関数のデフォルト値がメンバー変数に割り当てられ、一部のパラメーターのみが渡されると、システムは通知、つまり「フレンドリーさの目標」の最初の値を生成します。満たされていません。
- class FileUpload
- {
-
- private $filepath; //ファイルを保存するパスを指定します
- private $allowtype = array("gif", "jpg", "jpeg", "png"); type
- private $maxsize = 1000000; //アップロードできるファイルサイズは 1M です
- private $israndname = true //ファイル名を変更するかどうか
-
- function __construct($filepath, $allowtype, $maxsize, $israndname)
- {
- $this ->filepath = $filepath;
- $this->allowtype = $allowtype;
- $this->maxsize = $maxsize;
- $this->israndname = $israndname;
-
- var_dump( $this);
- }
- }
コードをコピー
例 2 - コンストラクターでのデフォルト値の割り当て
今回は、上記例の注意点を解消するために、パラメータはいくつでも渡せるようにし、渡されなかったパラメータにはデフォルト値を使用するようにプログラムを変更します。コンストラクター
別の問題が発生します。プログラマがパラメータ ("/upload",array("jpg","gif"),false) を渡すとき、つまりプログラマが maxsize パラメータを渡すのを忘れると、システムがエラーになります。 israndname の代わりに false を maxsize に割り当てます。システムはエラーを出力しないため、後続の作業に危険が残ります。
- class FileUpload
- {
-
- private $filepath;
- private $allowtype;
- private $maxsize;
- private $israndname;
-
- function __construct(
- $filepath = "/upload",
- $allowtype = array(" gif", "jpg", "jpeg", "png"),
- $maxsize = 1000000,
- $israndname = true)
-
- {
- $this->filepath = $filepath;
- $this->allowtype = $allowtype;
- $this->maxsize = $maxsize;
- $this->israndname = $israndname;
-
- var_dump($this);
- }
コードをコピー
例 3 - 配列を使用してパラメータをカプセル化する
例 2 の問題を解決するには、受信値をチェックして代入の不整合を防ぐことができます (とにかく、通常の状況では、受信値をチェックします)。ただし、これは問題の解決策ではありません。実装したい関数では、プログラマが値を順序どおりに渡すこともできないからです。
弱く型付けされた言語では、配列の特殊性を利用して、渡されたすべてのパラメーターを配列にカプセル化し、それらを key=>value ペアの形式で保存することで、この問題を解決できます。次のコードを参照してください:
- class FileUpload
- {
-
- private $filepath;
- private $allowtype;
- private $maxsize;
- private $israndname;
-
- function __construct($options=array([デフォルト値]))
- {
- //受信配列を解析します
- foreach($options as $key=>$value){
- $this->$key = $value
- }
- }
コードをコピーします
;
これにより、渡されるパラメータの順序の問題が解決され、また、一部のパラメータのみが渡される問題も解決されます。
ただし、この時点で、プログラマは次のように配列をパラメータとして入力する必要があります。
$up = new $FileUpload(array(- "filepath" => "/upload",
- "israndname" => false,
- "maxsize" => 2000000
- ));
-
コピーコード
例 4 - パラメーターの問題の解決
配列を使用してパラメータをカプセル化した後、プログラマは変数の名前を手動で入力する必要があります。これにより、スタイルの違いによる MaxSize、maxSize、maxsize などの記述の問題が発生します。この問題を解決するには、宣言時に小文字を使用するだけです。メンバー変数を追加し、コンストラクターに次の行を追加します。
foreach($options as $key=>$value){ $key = strto lower($key);
- ...
- }
-
- コードをコピー
この時点で、私たちのデザインは「フレンドリーさの目標」の最初の 3 つのポイントを満たしています。全体のコードは次のとおりです。
class FileUpload {-
- private $filepath;
- private $allowtype;
- private $maxsize;
- private $israndname;
-
- function __construct($options=array(
- "$filepath" => "./" ,
- "$allowtype" => array("txt","jpg"),
- "$maxsize" => 1000000,
- "$israndname" => true
- )){
- // 受信した配列を解析します
- foreach( $options as $key=>$value){
- $key = strto lower($key);
- $this->$key = $value
- }
- }
- }
-
コードをコピー
例 5 - 受信キーのエラーの処理
上記の例では、プログラマがクラスに存在しないパラメータを渡した場合、システムはエラーを報告します。ここでは 2 つの解決策があります。
1. 無効なパラメータを無視し、有効なパラメータのみを実行します
2. 渡した特定のパラメータが無効であることを示すフレンドリーなリマインダー
個人的には、プログラムの堅牢性のために、誤ったコードの存在を簡単に許可することはできないと考えているため、2 番目のオプションを選択します。呼び出し元にこのエラーをわかりやすく通知します。
foreach($options as $key=>$value){ $key = strto lower($key);- //クラスにこの変数があるかどうかを判断します
- if(in_array($key, get_class_vars( get_class( $this)))) {
- $this->$key = $value;
- }else{ //エラーの場所とパラメータの入力を求める
- echo "クラス ".get_class($this) の初期化時にエラーが発生しました。" with key: " .$key." 配列内 !";
- exit;
- }
- }
-
-
コードをコピーします
例 6 - 受信値が正当かどうかを確認する
この時点で、__construct() 関数を再利用可能にし、使用時に直接貼り付けることができるようにするために、変更されたコードを参照してください。
class FileUpload { //変数名には小文字を使用します- private $filepath;
- private $allowtype;
- private $maxsize;
- private $israndname;
-
- //コンストラクター
- 関数でデフォルト値を割り当てます__construct ($options=array(
- "$filepath" => "./",
- "$allowtype" => array("txt","jpg"),
- "$maxsize" => 1000000,
- " $israndname" => true
- )){
- // 受信配列を解析します
- foreach($options as $key=>$value){
- $key = strto lower($key);
- // キーがis クラス内で宣言します
- if(in_array($key, get_class_vars(get_class($this)))) {
- //値が要件を満たしているかチェックします
- if(checkValue($key,$value)) {
- $this -> $key = $value;
- } else {
- //エラーの場所とパラメータの入力を求める
- echo "無効な値".$value." が init クラス ".get_class($this)." で見つかりました: " .$key. " in array !";
- exit;
- }
- }else{
- //エラーの場所とパラメータの入力を求める
- echo "クラス ".get_class($this) の初期化時にエラーが発生しました。" キー: ".$ key." 配列内 !";
- exit;
- }
- }
- }
-
- function checkValue{
- if(){
- ...
- return true;
- }
- return false;
- }
- }
-
-
-
- コピーコード
|
PHP