Home > PHP > 引数を名前で渡す

引数を名前で渡す

  • 2007-05-31 (木) 14:39
  • PHP
  • このエントリーをはてなブックマークに追加
この記事の所要時間: 042

引数が多い時に困るのはみんな一緒ですね。

C++とかJavaで良く見るプログラミングスタイルだが、こうやってひたすら数字だけが並んでいるとやたらと読みにくい。三日後に見たらどのパラメーターが何なのかが思い出せなくて、コンストラクターのソースコードを参照せねばならない。

Life is beautiful: 「パラメーターのプロパティ渡し」でプログラムを読みやすくする、というアイデアはどうだろう

PHPのコンストラクタを名前付き引数で呼ぶアイデアはid:shimookaさんが書かれているので、ここでは通常のメソッドについて考えてみました。

いまいちなコードですが、引数省略時のデフォルト値、存在しない引数名が来た時・必須引数が無い場合に例外を投げるようにしてます。

PHP:
  1. <?php
  2. class IllegalArgumentException extends Exception {}
  3.  
  4. class Hoge {
  5.   protected function getParam(array &$params, $key, $isMust = false, $default = null) {
  6.     if (array_key_exists($key, $params)) {
  7.       $v = $params[$key];
  8.       unset($params[$key]);
  9.       return $v;
  10.     } else {
  11.       if ($isMust) {
  12.         throw new IllegalArgumentException();
  13.       } else {
  14.         return $default;
  15.       }
  16.     }
  17.   }
  18. }
  19.  
  20. class Foo extends Hoge {
  21.   public function func1(array $params = array()) {
  22.     $id = $this->getParam($params, 'id', true);
  23.     $name = $this->getParam($params, 'name', false, 'NO NAME');
  24.     if (count($params)> 0) {
  25.       throw new IllegalArgumentException();
  26.     }
  27.                      
  28.     printf("id=%s name=%s\n", $id, $name);
  29.   }
  30. }
  31.                
  32. $obj = new Foo();
  33. // id=1 name=hoge     
  34. $obj->func1(array('name' => 'hoge', 'id' => 1));
  35. // id=1 name=NO NAME
  36. $obj->func1(array('id' => 1));
  37. //  Uncaught exception 'IllegalArgumentException'
  38. $obj->func1();
  39. //  Uncaught exception 'IllegalArgumentException'
  40. $obj->func1(array('name' => 'hoge', 'id' => 1, 'email' => 'hoge@example.com'));

引数定義をメソッド宣言とは別に持つのはいまいちですね、はい。

ちなみにPythonは言語としてこの機能をサポートしているようです(via: odz buffer)。あとVBも同じような機能があります(via: 位置と名前による引数渡し)。

トラックバック:0

このエントリーのトラックバックURL
http://www.1x1.jp/blog/2007/05/php_argument.html/trackback
Listed below are links to weblogs that reference
引数を名前で渡す from Shin x blog

Home > PHP > 引数を名前で渡す

検索
フィード
メタ情報

Return to page top