В PHP дублируются ли методы методов объектов или используются ими совместно? - PullRequest
2 голосов
/ 20 октября 2011

В 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() {  }
}

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 20 октября 2011

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

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

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

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

Кстати:

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

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

0 голосов
/ 20 октября 2011

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

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

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

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