- 2007-05-31 (木) 14:39
- PHP
この記事の所要時間: 約 0分42秒
引数が多い時に困るのはみんな一緒ですね。
C++とかJavaで良く見るプログラミングスタイルだが、こうやってひたすら数字だけが並んでいるとやたらと読みにくい。三日後に見たらどのパラメーターが何なのかが思い出せなくて、コンストラクターのソースコードを参照せねばならない。
Life is beautiful: 「パラメーターのプロパティ渡し」でプログラムを読みやすくする、というアイデアはどうだろう
PHPのコンストラクタを名前付き引数で呼ぶアイデアはid:shimookaさんが書かれているので、ここでは通常のメソッドについて考えてみました。
いまいちなコードですが、引数省略時のデフォルト値、存在しない引数名が来た時・必須引数が無い場合に例外を投げるようにしてます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <?php class IllegalArgumentException extends Exception {} class Hoge { protected function getParam( array & $params , $key , $isMust = false, $default = null) { if ( array_key_exists ( $key , $params )) { $v = $params [ $key ]; unset( $params [ $key ]); return $v ; } else { if ( $isMust ) { throw new IllegalArgumentException(); } else { return $default ; } } } } class Foo extends Hoge { public function func1( array $params = array ()) { $id = $this ->getParam( $params , 'id' , true); $name = $this ->getParam( $params , 'name' , false, 'NO NAME' ); if ( count ( $params ) > 0) { throw new IllegalArgumentException(); } printf( "id=%s name=%s\n" , $id , $name ); } } $obj = new Foo(); // id=1 name=hoge $obj ->func1( array ( 'name' => 'hoge' , 'id' => 1)); // id=1 name=NO NAME $obj ->func1( array ( 'id' => 1)); // Uncaught exception 'IllegalArgumentException' $obj ->func1(); // Uncaught exception 'IllegalArgumentException' $obj ->func1( array ( 'name' => 'hoge' , 'id' => 1, 'email' => 'hoge@example.com' )); |
引数定義をメソッド宣言とは別に持つのはいまいちですね、はい。
ちなみにPythonは言語としてこの機能をサポートしているようです(via: odz buffer)。あとVBも同じような機能があります(via: 位置と名前による引数渡し)。
- Newer: Ruby on Rails vs PHP?
- Older: PHPを今まさに使っている(学んでいる)人へ
トラックバック:0
- このエントリーのトラックバックURL
- /blog/2007/05/php_argument.html/trackback
- Listed below are links to weblogs that reference
- 引数を名前で渡す from Shin x blog