2013-12-22 5 views
2

상태 the PHP reference manual 인용 :호출 시간은 PHP5.5에서 작동하는 것으로 보입니다.

as of PHP 5.4.0, call-time pass-by-reference was removed, so using it will raise a fatal error

를 그리고 아직은?

<?php 
error_reporting(E_ALL); 

class parentClass 
{ 
    function _funcA() 
    { 
     var_dump($this); 
    } 
} 

class childClass extends parentClass 
{ 
    function funcA() 
    { 
     call_user_func_array(array(&$this, '_funcA'), array()); 
    } 
} 

$test = new childClass(); 
$test->funcA(); 

그래서 문서가 잘못 PHP 5.5에 the following code와 함께 작동하도록 보인다? 또는 설명서에 언급되지 않은 몇 가지 특별한주의 사항이 있습니까? 문서가 그것이 없어야한다고 암시하는 경우 왜이 기능이 작동합니까?

편집 : 원래 코드에서

<?php 
function f($v) { return $v->x++; } 
$a = new StdClass(); 
$a->x = 1; 
$b = f(&$a); 
var_dump($a, $b); 
+1

아마도 개체 참조이기 때문에 개체는 항상 복사본이 아닌 "참조로"전달됩니다. 즉, 콜백에서 전달하는 특정 인스턴스입니다. –

+0

그럴 필요는 없습니다. 객체에 대한 참조에 의한 호출 시간이 치명적인 오류를 일으키는 위치의 예제를 제공하여 원본 게시를 업데이트했습니다. – neubert

답변

1

을 참조로 $this을 통과 하지 있습니다 : 이것은 $ 객체가 다음 여전히 치명적인 오류가 발생으로 중요하지 않는 것 사실 call_user_func_array으로 변경하면 처럼 보이지만처럼 보일 수 있습니다.

참조 및 문자열 배열과 빈 배열을 전달하고 있습니다.

따라서 이 아니고이 함수에 대한 참조를 전달하면 2 개의 배열을 전달하는 것입니다.

0

제거 된 사항은 "참조로 전달"이 아닌 "참조시 전달 시간"입니다.

함수에 대한 참조는 계속 전달할 수 있지만 함수 매개 변수는 '&'으로 정의해야합니다. 함수 호출시 변수의 '$'앞에 '&'을 사용하면 경고 (5.3) 또는 오류 (5.4)가 발생합니다.

그래서, 당신의 간단한 기능 이상과 같이 고정됩니다

<?php 
function f(&$v)  // '&' is added here 
    { return $v->x++; } 
$a = new StdClass(); 
$a->x = 1; 
$b = f($a);   // '&' is removed here 
var_dump($a, $b); 

는 그리고 당신의 시작 경우, 다른 질문입니다. $ this는 클래스 인스턴스 자체에 대한 포인터이며 '& $ this'는 같은 값을 갖습니다. PHP5의 Object 매개 변수는 이미 참조로 전달되었으므로 앞에 '&'을 추가 할 필요가 없습니다.

+0

두 번째 예제에서는 호출 시간 기준을 수행 할 필요가 없지만 결과로 시도 할 수없는 사실을 변경하지 않는다는 것이 맞습니다 치명적인 오류가 발생했습니다. 그것이 객체라는 사실은 치명적인 오류가 발생하는 것을 막지 않습니다. – neubert

+0

$ this는 object이며 참조로 전달되지만'array (& $ this, '_funcA')'는 '상수'이므로 오류가보고되지 않습니다. array()에 이름 (변수 참조)이 없으므로 나중에 다시 사용할 수 없습니다. – Fwolf

관련 문제