Объекты в массиве передаются по ссылке? - PullRequest
15 голосов
/ 07 июля 2011

в ситуации, подобной приведенной ниже,

class my_class {

    public __construct($params = array()){

        **** do something
    } 

 }

 $other_object = new some_class();

 $object = new my_class(array(
                         'var1' => 'test' 
                         'object' => $other_object));

$ other_object будет передано по ссылке или по значению?

Ответы [ 5 ]

16 голосов
/ 07 июля 2011

Объекты всегда являются ссылками, кроме вас clone это явно.

Вы можете использовать spl_object_hash(), чтобы получить «идентификатор объекта», а затем сравнить их друг с другом. Помните, что после удаления объекта из памяти сборщиком мусора идентификатор может быть использован повторно.

2 голосов
/ 07 июля 2011

Вот один пример, который показывает ссылочный объект каждый раз, когда ... http://codepad.org/HK6Oo4xL

0 голосов
/ 30 ноября 2017

по состоянию на PHP 5 Переменная объекта PHP содержит ссылку или идентификатор на фактическую переменную.Вот пример, чтобы продемонстрировать это.

class test{
public $test = 1;
}

$obj1 = new test;
$orginal = [$obj1,array(2),3];
$copy = $orginal;
echo 'orginal array';
var_dump($orginal);
echo 'copy of orginal';
var_dump($copy);

//after changing
$copy[0]->test = 'changed';
$copy[1][0] = 'changed';
$copy[3] = 'changed';
echo 'orginal array after changing its copy';
var_dump($original);
echo 'copy of orginal after changing';
var_dump($copy);

вывод для этого

original array
array (size=3)
  0 => 
    object(test)[38]
      public 'test' => int 1
  1 => 
    array (size=1)
      0 => int 2
  2 => int 3

copy of original
array (size=3)
  0 => 
    object(test)[38]
      public 'test' => int 1
  1 => 
    array (size=1)
      0 => int 2
  2 => int 3

original array after changing its copy
array (size=3)
  0 => 
    object(test)[38]
      public 'test' => string 'changed' (length=7)
  1 => 
    array (size=1)
      0 => int 2
  2 => int 3

copy of original after changing
array (size=3)
  0 => 
    object(test)[38]
      public 'test' => string 'changed' (length=7)
  1 => 
    array (size=1)
      0 => string 'changed' (length=7)
  2 => string 'changed' (length=7)

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

дополнительная информация о ссылке на объект: Объекты и ссылка

0 голосов
/ 07 июля 2011

Объекты в PHP 5 всегда передаются по ссылке. С помощью debug_zval_dump () вы можете проверить refcount для переменной для подсчета количества ссылок на экземпляр объекта. Обратите внимание на примечание в документации, вы найдете много интересных вещей о передаче переменной в функцию.

0 голосов
/ 07 июля 2011

Объекты в php передаются по значению.Подробнее см. этот ответ .

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