2010-02-19 5 views
1

불행히도 어떤 코드 예제도 제공 할 수 없지만 예제를 작성하려고합니다. 제 질문은 PHP의 객체와 메모리 할당에 관한 것입니다.PHP 객체 질문

$object = new Class(); 
다음

내가

$object2 = $object; 

같은이가 actualy 무엇을하고합니까 : 나는 객체가있는 경우

는 말할 수? 나는 클론 함수가 있다는 것을 알고 있지만, 내가 묻는 것은 아니며, 이것이 또 다른 동일한 객체를 생성하는지 또는 $ 객체에 대한 참조를 할당했는지에 관해서 우려한다.

나는 이것을 참조하는 것만으로도 충분히 이해할 수 있지만, 어떤 경우에는 나의 용도에 따라 또 다른 $ 객체가 생성된다는 것을 알게되고 왜 그 이유를 알 수 없게됩니다.

답변

1

마법 메서드 __invoke을 사용하면 함수와 비슷한 개체를 호출 할 수 있으며 마법 메서드가 호출됩니다. $object2 무엇이든 그 함수가 리턴 같다는 것을 의미

class Object{ 
    function __invoke(){ return "hi"; } 
} 

$object = new Object; 
$object2 = $object(); 
echo $object2; // echos hi 

.

기본적으로 함수를 호출하지만 변수로 변수를 사용하고 있습니다. 따라서 :

이 경우, 대신 객체를 호출하는 것입니다.

function __invoke(){ return this } 

하는 경우,이 같은 클래스에 대한 참조가 될 것이다 다음 __invoke() 기능은 다음과 같습니다하지 않는 한, 모든 '복제'하지

따라서, 귀하의 질문에 대한 참조,이 실제로 .

+0

죄송합니다. 관련성을 이해하지 못합니까? 설명해 주시겠습니까? – Layke

+2

@Laykes, 코드에는 할당 주위에 괄호가 있으므로 Chacha102는 PHP에서 호출 핸들러를 사용하는 방법을 묻는 것으로 가정합니다. –

+0

참조 할당을 위해 참조를 사용하는 방법을 제공하기 위해 답을 업데이트했습니다. –

0

당신이

$object2 = $object; 

그리고하지

$object2 = $object(); 

PHP는 원래 개체에 대한 참조를 만들 것을 의미한다고 가정하면, 그것을 복사하지 않습니다. 개체 할당이라는 절인 http://www.php.net/manual/en/language.oop5.basic.php을 참조하십시오.

+0

첫 번째 포스터는 첫 번째 포스터를 의미했지만 과거에 내가 가진 또 다른 질문에 대답했습니다. 감사합니다. – Layke

1

동일한 개체에 대한 두 번째 참조를 만듭니다. 여기 증거가 :

<?php 
class TestClass { 
    private $number; 

    function __construct($num) { $this->number = $num; } 
    function increment() { $this->number++; } 

    function __toString() { return (string) $this->number; } 
} 

$original = new TestClass(10); 

echo "Testing =\n"; 
echo "--------------------------------\n"; 
echo '$equal = $original;' . "\n"; 
$equal = $original; 

echo '$equal = ' . $equal . ";\n"; 

echo '$original->increment();' . "\n"; 
$original->increment(); 

echo '$equal = ' . $equal . ";\n"; 

echo "\n"; 
echo "Testing clone\n"; 
echo "--------------------------------\n"; 
echo '$clone = clone $original;' . "\n"; 
$clone = clone $original; 

echo '$clone = ' . $clone . ";\n"; 

echo '$original->increment();' . "\n"; 
$original->increment(); 

echo '$clone = ' . $clone . ";\n"; 

사용 clone 당신이 인스턴스의 복사본을 만들려면.

+0

글쎄, 당신은 정확히 질문에 답하지 못했습니다 : 그것은'$ object2 = $ object()'입니다. 사실, 여러분 중 아무도하지 않았습니다. –

+0

또한, 나는 그가'$ object()'를 잘못 입력하지 않았는지 확인하기를 원했기 때문에 받아 들여진 답이 나올 때까지 투표를하지 않았다. 그러나 그가하지 않았다는 것이 밝혀졌습니다. 그리고 아무도 실제로 그것을 언급하지 않았습니다. –

+0

그래서, 나는 stratgetically downvoting 나를 위해 당신의 의견을 모욕하고 완전히 거짓말이라고 말하고 싶습니다. –

0
<?php 

class Object{ 
    public $value = 1; 

    public function inc(){ 
     $this->value++; 
    } 
} 

$object = new Object; 
$object2 = $object; 

$object->inc(); 

echo $object2->value; // echos 2, proving it's by reference