代码之家  ›  专栏  ›  技术社区  ›  netrox

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

  •  0
  • netrox  · 技术社区  · 15 年前

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

    2 回复  |  直到 15 年前
        1
  •  1
  •   TCCV    15 年前

    现在,用一点盐来处理这个问题,因为它来自内存,我找不到我的原始源,但是如果我正确地记住了,内存是按类分配的。

    一旦加载了一个类,它就会将所有方法加载到内存中,即使它们还没有被执行。然后,如果您有该类的新实例,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。你可能要去低水平,才能回答你的具体情况下的问题。

        2
  •  3
  •   bdonlan    15 年前

    一般来说,创建一个类的新实例并不会复制这些方法——一个类的所有实例都共享每个方法的一个副本,不管是否使用它。但是,根据语言的不同,将方法名链接到实际(共享)方法本身的表可能是共享的,也可能不是共享的——我不确定PHP在这里做什么。

    推荐文章