2009-07-09 2 views
12

:PHP의 객체가 값 또는 참조로 전달 되었습니까? 이 코드

<?php 
class Foo 
{ 
    var $value; 

    function foo($value) 
    { 
     $this->setValue($value); 
    } 

    function setValue($value) 
    { 
     $this->value=$value; 
    } 
} 

class Bar 
{ 
    var $foos=array(); 

    function Bar() 
    { 
     for ($x=1; $x<=10; $x++) 
     { 
      $this->foos[$x]=new Foo("Foo # $x"); 
     } 
    } 

    function getFoo($index) 
    { 
     return $this->foos[$index]; 
    } 

    function test() 
    { 
     $testFoo=$this->getFoo(5); 
     $testFoo->setValue("My value has now changed"); 
    } 
} 
?> 

있어서 Bar::test() 실행되고, 그 배열은 실제 푸 # 5가 영향을 받는다, 푸 오브젝트의 배열 푸 # 5의 값을 변경 또는시기를 $testFoo 변수는 함수의 끝 부분에 존재하지 않는 지역 변수 일뿐입니다?

+1

관련 질문 : http://stackoverflow.com/questions/879/php-variables-passed-by-value-or-by-reference. – TSomKes

답변

20

왜 함수를 실행하지 않습니까? 에 의해 할당 "에

이"참조로 전달 "에 의한하지
Foo #5 
My value has now changed 

그러나, 그것은 때문이다 : 나를 위해

$b = new Bar; 
echo $b->getFoo(5)->value; 
$b->test(); 
echo $b->getFoo(5)->value; 

은 (코드와 함께) 위의 코드는이 출력을 생산 참고". PHP 5에서 참조에 의한 대입은 객체에 대한 기본 동작입니다. 대신 값으로 지정하려면 clone 키워드를 사용하십시오.

+0

PHP 4에서 어떻게됩니까? –

+1

PHP4는 '복제본'처럼 동작합니다 – Evert

+0

PHP 4는 PHP 5와 같은 방식으로 참조 지정을 할 수 있습니까? –

4

그들은 명시 적으로이를 표시하기 위해 당신은 PHP 4에서 참조로 객체를 전달하기 위해 PHP 5에서 PHP 4에서 참조로 값이 전달됩니다

$obj = &new MyObj; 
10

당신은 http://ca2.php.net/manual/en/language.oop5.references.php을 참조 할 수 있습니다 귀하의 질문에 대한 실제 답변.

종종 언급되는 PHP5 OOP의 요점 중 하나는 "객체는 기본적으로 참조에 의해 전달됩니다"라는 것입니다. 이것은 완전히 사실이 아닙니다.

PHP 참조는 두 개의 다른 변수가 동일한 값을 쓸 수 있도록하는 별칭입니다. PHP5에서 객체 변수는 객체 자체를 더 이상 값으로 포함하지 않습니다. 객체 접근자가 객체를 찾을 수있게하는 객체 식별자 만 포함합니다. 객체가 인수에 의해 전송되거나 반환되거나 다른 변수에 할당되면 별개의 변수는 동일한 객체를 가리키는 식별자 사본을 보유합니다.