2010-02-12 3 views
1

내가 PHP   4, PHP   5. 아래에이 코드 사이에 다르게 행동 나타납니다 몇 가지 코드가 : PHP   4,PHP 할당 연산자가이 경우 참조로 할당 역할을하는 이유는 무엇입니까?

class CFoo 
{ 
    var $arr; 

    function CFoo() 
    { 
     $this->arr = array(); 
    } 

    function AddToArray($i) 
    { 
     $this->arr[] = $i; 
    } 

    function DoStuffOnFoo() 
    { 
     for ($i = 0; $i < 10; ++$i) 
     { 
      $foo2 = new CFoo(); 
      $foo2 = $this;   // I expect this to copy, therefore 
            // resetting back to the original $this 
      $foo2->AddToArray($i); 
      echo "Foo2:\n"; 
      print_r($foo2); 
      echo "This:\n"; 
      print_r($this); 
     } 
    } 
} 

$foo1 = new CFoo(); 
$foo1->DoStuffOnFoo(); 

이전을, 위의 $에서는 foo2의 할당은 다시 $에서는 foo2를 다시 것 $ this가 원래 설정된 값. 이 경우 빈 $ arr 멤버가있는 CFoo로 설정 될 것으로 예상됩니다. 그러나 $ foo2를 $ this에 할당하면 참조로 할당이됩니다. Foo2가 이에 대한 별칭 역할을합니다. 따라서 foo2에서 "AddToArray"를 호출하면 this $ arr도 추가됩니다. 그래서 foo2를 다시 할당하려고 할 때, 이것의 초기 값을 얻지 않고, 본질적으로 자체 할당을 얻습니다.

이 동작은 PHP  에서 변경 되었습니까? foo2가이를 복사하도록하려면 어떻게해야합니까?

답변

3

PHP의 객체 지향 부분은 대단히 overhauled in PHP 5입니다. 이제 개체가 참조로 전달됩니다 (not exactly but almost). http://docs.php.net/clone을 참조하십시오.

예 :

$x1 = new StdClass; 
$x1->a = 'x1a'; 

$x2 = $x1; 
$y = clone $x1; 

// Performing operations on x2 affects x1/same underlying object 
$x2->a = 'x2A'; 
$x2->b = 'x2B'; 

// y is a clone/changes do not affect x1 
$y->b = 'yB'; 

echo 'x1: '; print_r($x1); 
echo 'y:'; print_r($y); 

인쇄

x1: stdClass Object 
(
    [a] => x2A 
    [b] => x2B 
) 
y:stdClass Object 
(
    [a] => x1a 
    [b] => yB 
) 
3

PHP 4에서는 참조로 지정하지 않고 (& = 사용) 객체를 복사했습니다. PHP 5에서는 객체에 대한 참조가 할당됩니다.

그래서 $this$this-$foo2 점, $foo2을하지 CFoo의 새 복사본에 할당 한 후.

PHP 5에서 사본을 만들려면 clone $this라고 말하십시오.

두 경우 모두 앞의 new 문이 낭비됩니다.

+1

어떻게 강제로 복사합니까? –

+0

답변을 추가했습니다. – Matijs

1

PHP는 객체를 복사하려면 버전 5부터 참조를 사용하고있다, 사용 :

$copy = clone $object; 
2

예, PHP 5 지금은 참조로 복사하는 . 이제 clone 개체에 복사본을 만들어야합니다.

관련 문제