2010-08-29 3 views
0

Мне интересно, если я создаю класс многих методов (как PHP по-прежнему их называют), которые многие из них не используются, и я создаю объект, он создает память для всех методов, даже если большинство методов не являются используемый? Я занимаюсь программированием PHP OOP.Когда я создаю объект класса, он выполняет ВСЕ методы внутри класса или просто вызванные методы?

ответ

1

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

Как только у вас есть класс, который загружен, он будет иметь все методы, загруженные в память, даже если они еще не выполнены. Затем, если у вас есть новые экземпляры этого класса, PHP будет ссылаться на исходный класс для методов. Однако он будет выделять собственное пространство памяти для участников. Обратите внимание, что существует различие между классом и экземпляром.

//this is a class (obviously) 
class foo { 
    __construct(){ 
     print "constructing foo\n"; 
    } 
    public function bar(){ 
     print "called bar\n"; 
    } 
} 

//this is the first instantiation of that class, 
//the class already has methods loaded in memory, ready to run. 
//bar is never called, but it's still in memory, just waiting. 
$my_foo = new foo(); 

//this is the second instance, everything is already loaded, 
//if you call bar, there's no need to reallocate anything. 
$your_foo = new foo(); 
$your_foo->bar(); 

выше загрузит класс Foo, который в свою очередь, загружает конструкта и штриховые методы (а также другие, которые встроены в). Затем, когда вы создаете экземпляр, ему не нужно выделять пространство для методов, он просто ссылается на уже загруженные методы. Поэтому в моем примере метод bar() уже загружен и ждет, нет необходимости перераспределять пространство.

Конечно, это становится немного сложным, когда речь идет о частных методах/членах, а также ссылки на экземпляры. Достаточно сказать, что если вы так сильно волнуетесь, то PHP не может быть языком, который будет использоваться.

Не уверен, есть ли способ копаться в PHP-коде, чтобы узнать, какая память распределена, как вы могли бы легко использовать с C, например. Вам, вероятно, придется пойти на этот низкий уровень, чтобы ответить на вопрос в вашем конкретном случае.

3

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

+2

Ваши условия отключены. «В общем, создание нового экземпляра класса не копирует членов - все экземпляры одного класса имеют одну копию каждого члена» должно быть «В общем, создание нового экземпляра класса не копирует МЕТОДЫ - все экземпляры класса совместно используют одну копию каждого МЕТОДА " член термина может ссылаться на частные члены данных (то есть частные переменные) –

+0

Действительно, исправлено .. – bdonlan

Смежные вопросы