Вопрос об объекте PHP - PullRequest
       0

Вопрос об объекте PHP

1 голос
/ 19 февраля 2010

К сожалению, я не могу предоставить примеры кода, однако я постараюсь создать пример.У меня вопрос об объектах и ​​распределении памяти в PHP.

Если у меня есть объект, скажем:

$object = new Class();

Затем я делаю что-то вроде

$object2 = $object;

Чтоэто на самом деле делает?Я знаю, что есть функция клонирования, но это не то, о чем я спрашиваю, я обеспокоен тем, создает ли это другой идентичный объект или просто присваивает ссылку на объект $.

Я настоятельнопонимаю, что это означает, что он просто создает ссылку, но в некоторых случаях моего использования я обнаружил, что создал еще один объект $, и я не могу понять, почему.

Ответы [ 4 ]

1 голос
/ 19 февраля 2010

Вы создаете вторую ссылку на тот же объект.Вот подтверждение:

<?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, если вы хотите создать копию экземпляра.

1 голос
/ 19 февраля 2010

Если вы используете магический метод __invoke, вы можете вызвать объект, аналогичный функции, и он вызовет этот магический метод.

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

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

Это означает, что $object2 равно любомуэта функция возвращает.

По сути, вы вызываете функцию, но используете в качестве имени переменную.Итак:

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

В этом случае вы просто вместо этого вызываете объект.

Итак, что касается вашего вопроса, на самом деле это вообще не «клонирование», если толькоФункция 1013 * выглядит следующим образом:

function __invoke(){ return this }

В этом случае это будет ссылка на тот же класс.

0 голосов
/ 19 февраля 2010
<?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
0 голосов
/ 19 февраля 2010

Предполагая, что вы имеете в виду

$object2 = $object;

А не

$object2 = $object(); 

PHP создаст ссылку на исходный объект, он не будет копировать его.См. http://www.php.net/manual/en/language.oop5.basic.php, раздел «Назначение объектов».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...