Использовать array_map для возврата массива созданных объектов? - PullRequest
4 голосов
/ 08 августа 2011

Скажите, у меня есть следующее:

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

     return $this;
   }
}

Теперь, учитывая массив идентификаторов, я хочу получить массив экземпляров вещей. Примерно так:

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

Конечно, для класса Thing нет «нового» метода, и «__construct» также был запрещен. Я знаю, что это может быть достигнуто с помощью дополнительных шагов, проходящих по $ ids, но есть ли удобный способ вызова «новой вещи ($ id)» для каждого с использованием array_map?

Ответы [ 3 ]

8 голосов
/ 08 августа 2011

Не может работать, потому что нет статического метода Thing::new.Вы можете добавить его или просто предоставить функцию в качестве обратного вызова array_map:

$ids = array(1, 2, 3, 4, 5);
$things = array_map(function($id){return new Thing($id);}, $ids);
2 голосов
/ 08 августа 2011
$things = array();
foreach($ids as $id)
   $things[] = new Thing($id);

это php способ делать вещи.Вот как работает язык php.Если вам нравится функциональное программирование, итераторы, понимания и другие хитрости smartxxx, рассмотрите другие языки.

Чтобы ответить на ваш вопрос буквально , вам понадобятся две маленькие функции

// 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")
));

стоит лиЭто?Я так не думаю.

0 голосов
/ 08 августа 2011

Похоже, вы пытаетесь проверить, был ли объект / класс уже инициирован.

Вы можете попробовать функцию get_declared_classes () . if вернет массив со всеми экземплярами классов.

с помощью этого массива вы можете проверить, известен ли ваш класс в системе, если нет, вы можете запустить его на лету.

...