2012-07-01 5 views
0

다음과 비슷한 코드를 사용하는 몇 개의 라이브러리가 있습니다.call_user_func_array()에 대한 다음 호출이 작동합니까?

$args = array_merge(array(&$target, $context), $args); 
$result = call_user_func_array($callback, $args); 

코드는 두 경우에 다른,하지만 난의 코드가 이루어집니다 본질적 것입니다. $callback 기능은 다음 서명을 사용

function callback(&$target, $context); 

이 두 라이브러리는 해당 문서 및 타사 코드를 (이 플러그인을 호출, 또는 확장)를 확장 아무도 콜백을 정의하지 않는다 즉, 함수 서명을 채택 예 : function my_extension_loader_callback($target, $context).

나를 혼란스럽게하는 내용은 call_user_func_array()에 대한 다음 문장입니다.

PHP 5.4 이전에는 param_arr의 참조 변수가 함수가 참조로 전달할 매개 변수를 필요로하는지 여부에 관계없이 참조로 함수에 전달됩니다. 이 형식의 호출 시간 통과 참조는 비추천 통지를 내리지 않지만, 그럼에도 불구하고 비공개이며 PHP 5.4에서 제거되었습니다. 또한 함수 서명이 적용되는 내부 함수에는 적용되지 않습니다. 함수가 참조로 매개 변수를 예상 할 때 값을 전달하면 경고가 발생하고 call_user_func()FALSE이됩니다.

특히 강조 표시된 문장은 PHP 코드에서 정의 된 함수에 대해서는 강조 표시하지 않는 것이 좋습니다.

이렇게하면 call_user_func_array()을 PHP 5.4에서 사용할 수 있습니까?

답변

3

call_user_func_array을 사용하는 경우 함수가 참조를 기대할 때 값을 전달하면 최신 버전의 PHP에서 오류로 간주됩니다.

//first param is pass by reference: 
my_function(&$strName){ 
} 

//passing by value, not by reference, is now incorrect if passing by reference is expected: 
call_user_func_array("my_function", array($strSomething)); 

//correct usage 
call_user_func_array("my_function", array(&$strSomething)); 

값을 기준으로 위 패스 (내 프로젝트는 또한 오류의 종류에 예외를 발생하도록 설정되어 경고없이 더 이상 가능하지 않다 (주의 :

는 PHP 5.3.3 이전에 유효 PHP 코드를했다 , 경고 등).) 그래서 나는 이것을 고쳐야 만했다.

솔루션 나는이 문제를 공격했습니다 내가 (나는 작은 RPC 서버를, 그래서 그런 일이 PARAMS 직렬화를 해제 한 후 참조 값으로 없다) 그것을 해결하는 방법이 있습니다 :

//generic utility function for this kind of situations 
function &array_make_references(&$arrSomething) 
{ 
    $arrAllValuesReferencesToOriginalValues=array(); 
    foreach($arrSomething as $mxKey=>&$mxValue) 
     $arrAllValuesReferencesToOriginalValues[$mxKey]=&$mxValue; 
    return $arrAllValuesReferencesToOriginalValues; 
} 

call_user_func_array("my_function", array_make_references(array($strSomething))); 

내가 PHP의 사람이 사람을 돕는 생각했다 생각 incorrec 잡을 : $strSomething 참조에 의해 전달되지는 않지만, array_make_references는 자체에 대한 참조 할 것 call_user_func_array을 통과 할 때 자주 발생하는 함수 (잘 숨겨진 함정)라고 불리는 것입니다.

1

call_user_func_array()false 인 경우 문제가 발생하면 정상적으로 처리됩니다.

매개 변수는 더 이상 기본적으로 참조로 전달되지 않지만 명시 적으로 수행합니다. array_merge() 동안 참조가 손실되는 유일한 문제는 테스트하지 않은 것일 수 있습니다.

+4

'call_user_func_array()'는 호출 된 함수가 반환하는 값을 반환합니다. 호출 된 함수가 올바른 반환 값으로'false'를 반환하면 오류 반환을 위해이 반환 값을 사용하는 것은 좋지 않습니다. –

-1

참조로 전달 된 인수가있는 call_user_func_array을 사용하는 사이트가 여러 개인 경우 PHP5.4로 업그레이드 할 때 이와 동일한 문제가 발생했습니다.

해결 방법은 매우 간단하며 call_user_func_array 자체를 eval()을 사용하여 전체 함수 호출로 바꾸는 것으로 구성됩니다. 그것은뿐만 가장 우아한 해결책 그러나 그것은 나를 위해 목적에 맞는 :)

여기 이전 코드입니다 :이 도움이

$my_arguments = ''; 
for ($i=0; $i<count($arguments); $i++) { 
    if ($i > 0) { $my_arguments.= ", "; } 
    $my_arguments.= "\$arguments[$i]"; 
} 
$evalthis = " $target ($my_arguments);"; 
eval($evalthis); 

희망 : 나는 교체

call_user_func_array($target, &$arguments); 

!

관련 문제