PHP Nesne Soru

3 Cevap php

Unfortunately I cannot provide any code examples, however I will try and create an example. My question is about Objects and memory allocation in PHP.

Ben bir nesne varsa, sağlar ki:

$object = new Class();

Sonra ben böyle bir şey yapmak

$object2 = $object;

Bu aslında ne yapıyor? Ben bir klon fonksiyonu olduğunu biliyorum, ama ben soruyorum ne thats değil, bu başka bir aynı nesne oluşturma olsun, ya da onun sadece $ nesnesine bir başvuru atama eğer endişeliyim.

Ben kuvvetle bu sadece bir referans oluşturur, ancak benim bazı vaka kullanımları, ben oluşturulan başka bir $ nesne olsun bulmak, ve ben neden anlayamıyorum demek için bu anlıyorum.

3 Cevap

Eğer sihirli yöntemi kullanırsanız __invoke, bir fonksiyona benzer bir nesneyi çağırabilir, ve o sihirli yöntemini çağırır.

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

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

Bu $object2 ne olursa olsun bu işlevi döner eşit olduğu anlamına gelir.

Temelde, bir işlev çağırarak, ancak adı gibi bir değişken kullanıyor. Yani:

function test(){ echo "hi"; }
$function_name = "test";
$function_name(); // echos hi.

Bu durumda, sadece yerine bir nesne çağırıyor.

__invoke() function bu gibi görünüyor Yani sürece, sorunuza istinaden, bu hiç 'klonlama', aslında değil:

function __invoke(){ return this }

Bu durumda, bu aynı sınıf için bir referans olacaktır.

Aynı nesnenin ikinci bir referans yaratıyor. İşte kanıtı:

<?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";

Kullan clone , bir örneğinin bir kopyasını oluşturmak istiyorsanız.

Ne demek olduğunu varsayarsak

$object2 = $object;

Ve

$object2 = $object(); 

PHP will create a reference to the original object, it will not copy it. See http://www.php.net/manual/en/language.oop5.basic.php, the section called Object Assignment.