2012-02-25 7 views
11

나는 이것의 무엇이든을 찾아 낼 수없고, 기능 또는 기능 참고를 배열 성분을위한 가치로 저장할 수 있는지 생각해보고 있었다. 예 :배열 값으로 함수

array("someFunc" => &x(), "anotherFunc" => $this->anotherFunc()) 

고마워요!

function foo() { echo "bar"; } 
$array = array('fun' => 'foo'); 
$array['fun'](); 

이 행해져 Yout이 manual에 더 많은 예제를 확인하실 수 있습니다 :이 같은 뭔가를 할 수 있도록

+0

가능한 [PHP 배열에 함수를 저장할 수 있습니까?] (http://stackoverflow.com/questions/1499862/can-you-store-a-function-in-a-php-array) – nawfal

+0

'x()'는 함수 나 함수 호출이 아니라 함수 호출입니다. 즉 함수가 지금 실행되고 키가 'someFunc'에 배열에 저장됩니다. 자세한 정보 (질문에 대한 답변 포함)에 대해서는 [functions] (http://php.net/manual/en/language.functions.php)에 관한 PHP 문서를 읽으십시오. – axiac

답변

13

당신이 할 수있는 "참조"어떤 기능을 할 수 있습니다. 함수 참조는 "메모리상의 주소"또는 무엇인가에 대한 참조가 아닙니다. 이것은 단지 함수의 이름 일뿐입니다.

<?php 

$functions = array(
    'regular' => 'strlen', 
    'class_function' => array('ClassName', 'functionName'), 
    'object_method' => array($object, 'methodName'), 
    'closure' => function($foo) { 
    return $foo; 
    }, 
); 

// while this works 
$functions['regular'](); 
// this doesn't 
$functions['class_function'](); 

// to make this work across the board, you'll need either 
call_user_func($functions['object_method'], $arg1, $arg2, $arg3); 
// or 
call_user_func_array($functions['object_method'], array($arg1, $arg2, $arg3)); 
+0

좋습니다, 고마워요! 그래서 궁극적으로, 나는 포인터를 만들기위한 수단을 찾고 있다고 생각합니다. 함수를 복제하고 싶지는 않지만 포인터가 참조하는 값을 수정하고 읽을 수있는 포인터 만 있으면됩니다. – user784446

+0

젠장, call_user_func가 PHP의 함수 - 메소드 라이브러리의 실제 멤버라는 사실을 깨달았습니다! 감사! – user784446

+0

구문 분석 오류 : 구문 오류, 예기치 않은 T_FUNCTION on line 7 –

5

PHP는 가변 함수에 대한 개념을 지원한다.

+1

감사합니다. 해결책으로 그렇게 생각하고있었습니다. 그러나 문서에서는 요소의 값이 모든 유형이 될 수 있으므로 함수를 사용할 수없는 이유는 무엇입니까? 나는 "element"=> object()를 사용할 수 있지만 이것을 어떻게 할 수 있는지 모른다. – user784446

5

PHP의 call_user_func을 확인하십시오. 아래의 예를 고려하십시오. 당신은 당신이 루프와 함께 할 수있는 순서로 모든 기능을 실행하려면

두 가지 기능 지금

function a($param) 
{ 
    return $param; 
} 

function b($param) 
{ 
    return $param; 
} 


$array = array('a' => 'first function param', 'b' => 'second function param'); 

을 고려하십시오.

foreach($array as $functionName => $param) { 
    call_user_func($functioName, $param); 
} 

플러스 배열, 등 모든 데이터 유형을 함수 호출, 중첩 배열, 객체, 문자열, 정수 등 등

+0

난 그냥 긴 switch 문을 대체하는 좋은 방법입니다 지나치게 복잡한 얻으려면 메서드를 싶지 않아 추가하고 싶습니다. –

4

예, 할 수 있습니다

$array = array(
    'func' => function($var) { return $var * 2; }, 
); 
var_dump($array['func'](2)); 

이것은 물론, PHP에게 PHP 버전 5.3.0에 도착 anonymous function 지원을 필요로 않습니다. 이것은 꽤 읽을 수없는 코드로 당신을 떠날 것입니다.

+0

에 PHP를 업데이트 ... 지금은 잘 작동, 예기치 않은 T_FUNCTION 오류를 반환합니다. – user784446

+0

어떤 PHP 버전을 사용하고 있습니까? PHP 5.3.6을 실행중인 랩톱에서 정상적으로 실행됩니다. 당신이 5.2를 사용하고 있다면 이것은 분명히 내 대답에 언급 된대로 작동하지 않습니다. – Treffynnon

+0

아, 알겠습니다. 아마 그럴거야. PHPDesigner2008을 사용하고 있습니다. 따라서 오류 알림 라이브러리가 오래된 것 같습니다. – user784446