В PHP методы кода объектов дублируются или используются между экземплярами?

В PHP, если вы создаете массив объектов, являются ли объектные методы (а не элементы данных) скопированы для каждого экземпляра объекта в массиве или только один раз? Я бы предположил, что по соображениям памяти последнее верно; Я просто хотел подтвердить сообществом StackOverflow, что это правда.

Например, предположим, что у меня есть класс MyClass с несколькими методами, т.е.

class MyClass { public $data1; private $data2; public function MyClass($d1, $d2) { $this->data1=$d1; $this->data2=$d2; } public function method1() { } public function method2() { } } 

Очевидно, в действительности метод1 () и method2 () не являются пустыми функциями. Теперь предположим, что я создаю массив из этих объектов:

 $arr = array(); $arr[0] = & new MyClass(1,2); $arr[1] = & new MyClass(3,4); $arr[2] = & new MyClass(5,6); 

Таким образом, PHP хранит три набора данных в памяти для каждого из трех экземпляров объекта. Мой вопрос заключается в том, что PHP также хранит копии методов1 () и method2 () (и конструктора) 3 раза для каждого из трех элементов из $ arr? Я пытаюсь решить, будет ли массив из ~ 200 объектов слишком интенсивным для памяти из-за необходимости хранить 200 копий каждого метода в памяти.

Спасибо за ваше время.

По определению (и это ваш код), функция существует только один раз. Вот почему вы создаете код (а не данные).

Однако вы можете использовать свой код для получения большого количества данных. Но это еще одна история;).

Поэтому, если вы не произвольно не дублируете код между объектами, ваша функция (ы) будет существовать только один раз. Независимо от количества экземпляров кода, который вы создаете. Только данные, связанные с кодом (члены класса), дублируются.

Звучит честно?

КСТАТИ:

 $arr[0] = & new MyClass(1,2); 

Дает вам строгую стандартную ошибку. Вы не можете назначить ссылку / псевдоним new ключевому слову. Вероятно, на этот способ написания влияет код PHP 4, но он изменился с момента PHP 5, который ввел хранилище объектов.

Содержимое метода будет храниться только один раз в памяти. Каждый PHP-объект (указанного класса) будет ссылаться на этот метод.

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

Это, например, отличается от Javascript, где каждый класс-метод содержится в каждом экземпляре. Однако, если вы определите метод в своем прототипе, то метод будет использоваться всеми экземплярами класса (конечно, в памяти легче). См. Эту ссылку: http://webdevelopersjournal.com/articles/jsintro3/js_begin3.html .