2011-08-08 3 views
3

다음과 같이 가정 해보십시오.array_map을 사용하여 인스턴스화 된 객체의 배열을 반환 하시겠습니까?

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을 사용하여 "new Thing ($ id)"을 호출하는 매끄러운 방법이 있습니까?

답변

7

정적 메서드 Thing::new이 없으므로 작동하지 않습니다. 당신은 그것을 추가하거나 바로 array_map 콜백 같은 기능을 제공 할 수 있습니다 :

$ids = array(1, 2, 3, 4, 5); 
$things = array_map(function($id){return new Thing($id);}, $ids); 
+0

영리한! 나는 그것을 좋아한다 –

+0

이것은 나의 목적을 위해 중대한 작동한다. 감사! – robertwbradford

2
$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

고맙습니다, @stereofrog. 지금 당분간 그만한 가치는 없지만 여러 클래스 중 하나를 사용하는 것으로 바꿀 수 있습니다. – robertwbradford

0

보이기 위해서 당신은 이미 객체/클래스가 시작되었는지 확인하려고합니다.

get_declared_classes() 기능을 사용해보십시오. 모든 클래스가 인스턴스화 된 배열을 반환합니다.

이 배열을 사용하면 시스템에 클래스가 있는지 확인할 수 있습니다. 그렇지 않은 경우 즉시 수행 할 수 있습니다.

관련 문제