когда я создаю объект класса, он выполняет ВСЕ методы внутри класса или просто вызывает методы? - PullRequest
0 голосов
/ 29 августа 2010

Мне любопытно, если я создаю класс из многих методов (функции, которые PHP все еще вызывает их), многие из которых не используются, и я создаю объект, создает ли он память для всех методов, даже если большинство методов не использовался? Я делаю PHP ООП кодирования.

Ответы [ 2 ]

3 голосов
/ 29 августа 2010

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

1 голос
/ 29 августа 2010

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

Как только у вас есть класспосле загрузки все методы будут загружены в память, даже если они еще не выполняются.Затем, если у вас есть новые экземпляры этого класса, 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, который, в свою очередь, загружает методы construct и bar (а также другие встроенные).Затем, когда вы создаете его экземпляр, ему не нужно выделять место для методов, он просто ссылается на уже загруженные методы.Так что в моем примере метод bar() уже загружен и ожидает, нет необходимости перераспределять пространство.

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

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

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