4

私が次を持っているとしましょう:

class Thing {
   function __construct($id) {
     // some functionality to look up the record and initialize the object.

     return $this;
   }
}

IDの配列が与えられたので、インスタンス化されたものの配列になりたいと思います。次のようなもの:

$ids = array(1, 2, 3, 4, 5);
$things = array_map(array('Thing', 'new'), $ids); // Doesn't work

もちろん、Thingクラスには「新しい」メソッドはなく、「__construct」も立ち入り禁止でした。これは$idsをループする追加の手順で実現できることは知っていますが、array_mapを使用してそれぞれで「newThing($ id)」を呼び出す巧妙な方法はありますか?

4

3 に答える 3

8

静的メソッドがないため、機能しませんThing::new。追加するか、array_mapコールバックとして関数を提供することができます。

$ids = array(1, 2, 3, 4, 5);
$things = array_map(function($id){return new Thing($id);}, $ids);
于 2011-08-08T16:38:18.003 に答える
2
$things = array();
foreach($ids as $id)
   $things[] = new Thing($id);

これがphpのやり方です。これがphp言語の仕組みです。関数型プログラミング、イテレータ、内包表記、その他のsmartxxxトリックが好きな場合は、他の言語を検討してください。

あなたの質問に文字通り答えるには、2つの小さな関数が必要になります

// replacement for "new"
function init($klass /* , param, param */) {
    $c = new ReflectionClass($klass);
    return $c->newInstanceArgs(
        array_slice(func_get_args(), 1));
}

// generic currying
function curry($fn /* , param, param */) {
    $_ = array_slice(func_get_args(), 1);
    return function() use($fn, $_) {
        return call_user_func_array($fn, 
            array_merge($_, func_get_args()));
    };
}

その後

class Thing
{
    function __construct($x, $y) {
        $this->x = $x;
        $this->y = $y;
    }
}

// curry one param
print_r(array_map(
    curry("init", "Thing"),
    array("x1", "x2", "x3"),
    array("y1", "y2", "y3")
));

// curry two params
print_r(array_map(
    curry("init", "Thing", "x"),
    array("y1", "y2", "y3")
));

それは価値がありました?私はそうは思わない。

于 2011-08-08T16:42:02.680 に答える
0

見た目は、オブジェクト/クラスがすでに開始されているかどうかを確認しようとしています。

get_declared_classes()関数を試すことができます。ifは、すべてのクラスがインスタンス化された配列を返します。

この配列を使用すると、自分のクラスがシステムで認識されているかどうかを確認できます。認識されていない場合は、その場で開始できます。

于 2011-08-08T16:46:30.150 に答える