Непонятки с сылками на объекты.

atv

Новичок
Непонятки с сылками на объекты.

Я совсем запутался. Кто мне скажет, этот код багофича?
PHP:
<?php

class Simple
{
    public $name;
}

$obj1 = new Simple();
$obj1->name = 'obj1';

$obj2 = new Simple();
$obj2->name = 'obj2';

$ref1 = $obj1;

$ref2 = $ref1;

$ref1 = $obj2;

print 'name: '.$ref2->name; // output name: obj1

?>
Рыскал по мануалу, не нашёл объяснения.

P.S. PHP 5.2
 

akd

dive now, work later
Команда форума
$ref1 = $obj1; // $ref1 - ссылка на obj1

$ref2 = $ref1; // $ref2 - ссылка на obj1

$ref1 = $obj2; // $ref1 - ссылка на obj2

все правильно, по-моему.
 

atv

Новичок
$ref1 = $obj1; // $ref1 - ссылка на obj1
Если строго по мануалу, то $ref1 и $obj1 оба являются сылками на один и тот же контент. После $ref2 = $ref1 должна прибавиться ещё одна ссылка на тот же контент.

Таким образом после $ref1 = $obj2, все три ссылки должны указывать на $obj2.

В мануале написано, что ссылки в PHP не тоже самое что указатели в C, к тому же, в PHP нет такого типа как "ссылка", чтобы можно было проверить чем является $ref2.

Вобщем, судя по работе примера, PHP всётаки различает типы ссылок.
 

Skubent

Новичок
$ref1 = obj1;
ref1 -> obj1;

$ref2 = $ref1;
ref2 -> obj1, а не ref2 -> ref1 -> obj1;

$ref1 = $obj2;
ref1 -> obj2, ref2 не затронут.
 

atv

Новичок
Сейчас попробую более чётко сформулировать что именно меня смущает.
PHP:
<?php
class Simple
{
    public $name;
}

$obj1 = new Simple();
$obj1->name = 'obj1';

$obj2 = new Simple();
$obj2->name = 'obj2';

$ref1 = $obj1;

$ref1 = $obj2;

print 'name: '.$obj1->name; // "name: obj1"
?>
Как известно, в PHP5 объекты передаются по ссылке, т.е. строчка $ref1 = $obj1 равнозначна $ref1 =& $obj1. Попробуем подставить эту строчку:
PHP:
<?php
$ref1 =& $obj1;

$ref1 = $obj2;

print 'name: '.$obj1->name; // в этом случае "name: obj2"
?>
Получается, что строчки $ref1 = $obj1 и $ref1 =& $obj1 не равнозначны.

Попробуем изменить следующую строчку:
PHP:
<?php
$ref1 =& $obj1;

$ref1 =& $obj2;

print 'name: '.$obj1->name; // а в этом случае "name: obj1"
?>
Что вполне логично, и так как должно быть.

Вобщем, в случае с объектами, ссылки действуют по каким-то другим правилам, не описанным в мануале, или я что-то пропустил...
 

Андрейка

Senior pomidor developer
Как известно, в PHP5 объекты передаются по ссылке
не всем это известно.. в таких утверждениях лучше цитировать мануал.. от того,что ты нацитируешь и будем копать
 

atv

Новичок
Ага, нашёл. Вот здесь это уже обсуждалось http://www.php.net/manual/en/language.oop5.basic.php
 

berkut

Новичок
atv ткни где именно по ссылке обсуждается такое поведение, плиз
 

atv

Новичок
В разделе "new"
PHP:
<?php
$assigned  =  $instance;
$reference  =& $instance;

$instance->var = '$assigned will have this value';

$instance = null; // $instance and $reference become null

var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>

The above example will output:

NULL
NULL
object(SimpleClass)#1 (1) {
   ["var"]=>
     string(30) "$assigned will have this value"
}
А также
http://www.php.net/manual/en/language.oop5.basic.php#50469
http://www.php.net/manual/en/language.oop5.basic.php#64410
В разделе "User Contributed Notes"
 
Сверху