当我创建一个类的对象时,它是在类中执行ALL方法还是只调用方法?

时间:2010-08-29 03:26:16

标签: php oop class memory

我很好奇,如果我创建了一个很多方法的类(PHP仍然调用它们的函数),其中很多都没有被使用并且我创建了一个对象,它是否为所有方法创建内存,即使大多数方法都没有正在使用?我在做PHP OOP编码。

2 个答案:

答案 0 :(得分:3)

通常,创建类的新实例不会复制方法 - 类的所有实例共享每个方法的单个副本,无论是否使用。根据语言,将方法名称链接到实际(共享)方法本身的表可能会也可能不会共享,但是 - 我不确定PHP在这里做了什么。

答案 1 :(得分: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语言。你可能不得不去那个低级别来回答你特定情况下的问题。