1

私はほとんどの場合 PHP でプログラミングしていますが、Ruby では、これらの「ハッシュ引数」を PHP 関数に実装する方法が必要になることがあります (たとえば、HTML 選択ヘルパーのように)。

draw_select :name => :id, :onclick => 'alert(this.value)'

PHP の問題は、考えられる多くの属性を実装するために引数の順序を定義する必要があることです。

私は1つの文字列引数を定義してjson_decode()を使用することを考えていたので、次のように引数を渡すことができます:

draw_select("'name': 'id', 'onclick': 'alert(this.value)' ")

定義は次のようになります。

function draw_select($string) {
// use json_decode here and pass them as variables
}

これを行うためのよりスマートな方法を知っていますか..または、PHPでこれを試みることは実際にはまったく意味があると思いますか?

編集して追加: function(array(...)) のような引数としてサイン配列を渡すだけの「代替」の代替手段を探しています

4

6 に答える 6

5

代わりに配列を渡さないのはなぜですか?

draw_select(array(
  'name'=> 'id', 
  'onclick'=> 'alert(this.value)'
));
于 2009-05-15T19:47:42.857 に答える
3

PHP は、この点で確かに甘いものを欠いています。私も多くの Python を使用していますが、PHP を使用するときは名前付き引数が恋しいです。ただし、PHP では、多数のオプションを受け入れる必要がある関数があるときはいつでも、1 つまたは 2 つの必須/重要な引数と、残りの配列を受け入れるだけです。

function draw_select($name, $options = array(), $html_options = array()) {

}

これは、CodeIgniter や CakePHP などのライブラリが同じ<select>シナリオを処理する方法です。

個人的には、このような状況で JSON を使用しても、PHP の連想配列が非常に強力であるため、実際のメリットはありません。言語が提供するものに固執するだけで、これが PHP でそれを行う方法です。

于 2009-05-15T19:47:40.223 に答える
1

PHP 5.3 までのすべてのバージョンの PHP でこれを行う方法 は1つではありません。

PHP は、名前付きパラメーターおよび/または smalltalk/objective-c/ruby スタイル セレクターをサポートしていません。PHP は、言語のこの部分を再定義する方法も提供していません。PHPでこれが必要な場合は、運が悪いです。PHP は、いわゆる「メタプログラミング」に最適な言語の選択肢ではありませんでした。

他の人が述べたように、PHP での最善の策は、抽出と組み合わせてキーと値のペアを持つ配列を使用することです。

myFunction(array(
    'theThing'=>0,
    'param2'=>'another value',
));

function myFunction($params){
    extract($params);
    echo $param2;
}   
  1. おそらく C/C++ で拡張機能を作成して、この機能を備えた PHP を拡張することもできますが、マゾヒストになってしまうでしょう。:)
于 2009-05-16T01:02:47.110 に答える
0

解決策は、可変引数を使用することです。

連想配列をネイティブにサポートしていない言語でこれを使用することがあります。

function AssociativeArrayFromFlatArray($args)
{
    $nbArgs = count($args);
    if( $nbArgs % 2 != 0 )
    {
        die('This function must have an even number of arguments');
    }

    $ret = array();
    for( $i = 0; $i < $nbArgs; $i += 2 )
    {
        $key = $args[$i];
        $value = $args[$i + 1];
        $ret[$key] = $value;
    }
    return $ret;
}

function DoSomething(/*...*/)
{
    $args = AssociativeArrayFromFlatArray(func_get_args());

    if( $args['action'] == 'greet' )
    {
        $count = $args['count'] or 1;
        for( $i = 0; $i < $count; $i += 1 )
        {
            echo $args['text'];
        }
    }
}

DoSomething('action', 'greet', 'count', 10, 'text', 'Hello World! ');

連想配列をネイティブにサポートしているので、これをPHPに使用するのは残念ですが...

于 2009-05-15T20:13:26.383 に答える
0

' func_get_args()'関数を使用して、最初のすべてのパラメーターを変数名として使用し、毎秒を値として使用することができます。それはおそらくあなたがルビーの道にたどり着くのと同じくらい近いでしょう(私はそれをする方法で何年も探していました、私はあなたがルビーのアレイに対するエレガントな解決策についてあなたが何を意味するのかを正確に理解しています)。うまくいけば、将来的にPHPがオープンし、rubyのように実行時に再プログラムできるようになります(実際に何と呼ばれるかはわかりませんが、RubyとRuby on Railsが非常に優れているのはこのためです)。

于 2009-07-18T03:26:03.237 に答える
0

Since all the options here involve calling array, and it seems to be the "PHPish" way of doing things, I'll throw in that if you're doing this all the time that maybe it makes sense to have a function z() (I'm just thinking along the lines of $() in jQuery) that aliases to array(). Besides the length of the name array, I don't see how the Ruby version is any more elegant. There are less characters, but I somewhat dislike that you can't immediately tell the difference between a function parameter and a key/value pair in that example code.

于 2009-05-15T19:58:13.193 に答える