ホームページ  >  記事  >  バックエンド開発  >  PHP でのフレンドリーな関数パラメーター受け渡しモードの設計

PHP でのフレンドリーな関数パラメーター受け渡しモードの設計

WBOY
WBOYオリジナル
2016-07-25 08:46:18971ブラウズ
PHP

PHP はフレンドリーな関数パラメータ受け渡しモード設計で、必要な友人が参照できます。


クラスのコンストラクター関数で渡す必要があるパラメーターが多い場合、プログラマーはコーディング時にパラメーターの順序や書き方を覚えるのが難しくなったり、間違ったパラメーターに値が渡されたりするため、コンパイルエラーが発生しやすくなります。 (弱い型付け言語) ケース。


親しみやすい機能的なデザイン

プログラマがクラスをインスタンス化する場合、渡されるパラメータは次の使いやすさの目標を満たしている必要があります。
1. 一部のパラメーターのみを渡すことができます
2. パラメータを順不同で渡す機能
3. パラメータの大文字と小文字を区別できません
4. パラメータ転送時に発生するエラーを迅速かつ正確に通知できる


プロセスを改善する 例 1 - メンバー変数にデフォルト値を割り当てる 次のコードを見てください。このようにして、関数のデフォルト値がメンバー変数に割り当てられ、一部のパラメーターのみが渡されると、システムは通知、つまり「フレンドリーさの目標」の最初の値を生成します。満たされていません。
  1. class FileUpload
  2. {
  3. private $filepath; //ファイルを保存するパスを指定します
  4. private $allowtype = array("gif", "jpg", "jpeg", "png"); type
  5. private $maxsize = 1000000; //アップロードできるファイルサイズは 1M です
  6. private $israndname = true //ファイル名を変更するかどうか
  7. function __construct($filepath, $allowtype, $maxsize, $israndname)
  8. {
  9. $this ->filepath = $filepath;
  10. $this->allowtype = $allowtype;
  11. $this->maxsize = $maxsize;
  12. $this->israndname = $israndname;
  13. var_dump( $this);
  14. }
コードをコピー
例 2 - コンストラクターでのデフォルト値の割り当て

今回は、上記例の注意点を解消するために、パラメータはいくつでも渡せるようにし、渡されなかったパラメータにはデフォルト値を使用するようにプログラムを変更します。コンストラクター

別の問題が発生します。プログラマがパラメータ ("/upload",array("jpg","gif"),false) を渡すとき、つまりプログラマが maxsize パラメータを渡すのを忘れると、システムがエラーになります。 israndname の代わりに false を maxsize に割り当てます。システムはエラーを出力しないため、後続の作業に危険が残ります。

  1. class FileUpload
  2. {
  3. private $filepath;
  4. private $allowtype;
  5. private $maxsize;
  6. private $israndname;
  7. function __construct(
  8. $filepath = "/upload",
  9. $allowtype = array(" gif", "jpg", "jpeg", "png"),
  10. $maxsize = 1000000,
  11. $israndname = true)
  12. {
  13. $this->filepath = $filepath;
  14. $this->allowtype = $allowtype;
  15. $this->maxsize = $maxsize;
  16. $this->israndname = $israndname;
  17. var_dump($this);
  18. }
コードをコピー
例 3 - 配列を使用してパラメータをカプセル化する

例 2 の問題を解決するには、受信値をチェックして代入の不整合を防ぐことができます (とにかく、通常の状況では、受信値をチェックします)。ただし、これは問題の解決策ではありません。実装したい関数では、プログラマが値を順序どおりに渡すこともできないからです。

弱く型付けされた言語では、配列の特殊性を利用して、渡されたすべてのパラメーターを配列にカプセル化し、それらを key=>value ペアの形式で保存することで、この問題を解決できます。次のコードを参照してください:

  1. class FileUpload
  2. {
  3. private $filepath;
  4. private $allowtype;
  5. private $maxsize;
  6. private $israndname;
  7. function __construct($options=array([デフォルト値]))
  8. {
  9. //受信配列を解析します
  10. foreach($options as $key=>$value){
  11. $this->$key = $value
  12. }
  13. }
コードをコピーします
;

これにより、渡されるパラメータの順序の問題が解決され、また、一部のパラメータのみが渡される問題も解決されます。

ただし、この時点で、プログラマは次のように配列をパラメータとして入力する必要があります。

    $up = new $FileUpload(array(
  1. "filepath" => "/upload",
  2. "israndname" => false,
  3. "maxsize" => 2000000
  4. ));
コピーコード 例 4 - パラメーターの問題の解決 配列を使用してパラメータをカプセル化した後、プログラマは変数の名前を手動で入力する必要があります。これにより、スタイルの違いによる MaxSize、maxSize、maxsize などの記述の問題が発生します。この問題を解決するには、宣言時に小文字を使用するだけです。メンバー変数を追加し、コンストラクターに次の行を追加します。

foreach($options as $key=>$value){
$key = strto lower($key);
  1. ...
  2. }
  3. コードをコピー

この時点で、私たちのデザインは「フレンドリーさの目標」の最初の 3 つのポイントを満たしています。全体のコードは次のとおりです。

    class FileUpload {
  1. private $filepath;
  2. private $allowtype;
  3. private $maxsize;
  4. private $israndname;
  5. function __construct($options=array(
  6. "$filepath" => "./" ,
  7. "$allowtype" => array("txt","jpg"),
  8. "$maxsize" => 1000000,
  9. "$israndname" => true
  10. )){
  11. // 受信した配列を解析します
  12. foreach( $options as $key=>$value){
  13. $key = strto lower($key);
  14. $this->$key = $value
  15. }
  16. }
  17. }
コードをコピー 例 5 - 受信キーのエラーの処理
上記の例では、プログラマがクラスに存在しないパラメータを渡した場合、システムはエラーを報告します。ここでは 2 つの解決策があります。 1. 無効なパラメータを無視し、有効なパラメータのみを実行します

2. 渡した特定のパラメータが無効であることを示すフレンドリーなリマインダー

個人的には、プログラムの堅牢性のために、誤ったコードの存在を簡単に許可することはできないと考えているため、2 番目のオプションを選択します。呼び出し元にこのエラーをわかりやすく通知します。

foreach($options as $key=>$value){
    $key = strto lower($key);
  1. //クラスにこの変数があるかどうかを判断します
  2. if(in_array($key, get_class_vars( get_class( $this)))) {
  3. $this->$key = $value;
  4. }else{ //エラーの場所とパラメータの入力を求める
  5. echo "クラス ".get_class($this) の初期化時にエラーが発生しました。" with key: " .$key." 配列内 !";
  6. exit;
  7. }
  8. }
コードをコピーします
例 6 - 受信値が正当かどうかを確認する この時点で、__construct() 関数を再利用可能にし、使用時に直接貼り付けることができるようにするために、変更されたコードを参照してください。

class FileUpload {
    //変数名には小文字を使用します
  1. private $filepath;
  2. private $allowtype;
  3. private $maxsize;
  4. private $israndname;
  5. //コンストラクター
  6. 関数でデフォルト値を割り当てます__construct ($options=array(
  7. "$filepath" => "./",
  8. "$allowtype" => array("txt","jpg"),
  9. "$maxsize" => 1000000,
  10. " $israndname" => true
  11. )){
  12. // 受信配列を解析します
  13. foreach($options as $key=>$value){
  14. $key = strto lower($key);
  15. // キーがis クラス内で宣言します
  16. if(in_array($key, get_class_vars(get_class($this)))) {
  17. //値が要件を満たしているかチェックします
  18. if(checkValue($key,$value)) {
  19. $this -> $key = $value;
  20. } else {
  21. //エラーの場所とパラメータの入力を求める
  22. echo "無効な値".$value." が init クラス ".get_class($this)." で見つかりました: " .$key. " in array !";
  23. exit;
  24. }
  25. }else{
  26. //エラーの場所とパラメータの入力を求める
  27. echo "クラス ".get_class($this) の初期化時にエラーが発生しました。" キー: ".$ key." 配列内 !";
  28. exit;
  29. }
  30. }
  31. }
  32. function checkValue{
  33. if(){
  34. ...
  35. return true;
  36. }
  37. return false;
  38. }
  39. }
  40. コピーコード
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。