Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当我创建一个类的对象时,它是执行类内的所有方法还是只执行调用的方法?_Php_Oop_Class_Memory - Fatal编程技术网

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

Php 当我创建一个类的对象时,它是执行类内的所有方法还是只执行调用的方法?,php,oop,class,memory,Php,Oop,Class,Memory,我很好奇,如果我创建了一个由许多方法(PHP仍然调用它们的函数)组成的类,而其中许多方法都没有被使用,那么我创建了一个对象,它是否会为所有方法创建内存,即使大多数方法都没有被使用?我正在做PHP OOP编码 一般来说,创建一个类的新实例并不会复制这些方法-一个类的所有实例都共享每个方法的一个副本,无论是否使用。根据语言的不同,将方法名称链接到实际(共享)方法本身的表可能是共享的,也可能不是共享的,但是-我不确定PHP在这里做什么。一般来说,创建一个类的新实例并不会复制这些方法-一个类的所有实例共

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

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

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

现在,请恕我直言,因为这是来自内存的,我找不到原始源代码,但是如果我记得正确,内存是按类分配的

一旦加载了一个类,它就会将所有方法加载到内存中,即使它们还没有被执行。然后,如果您有该类的新实例,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类,foo类将依次加载construct和bar方法(以及其他内置方法)。然后,当您实例化它时,它不需要为方法分配空间,它只引用已经加载的方法。因此,在我的示例中,
bar()
方法已经加载并等待,无需重新分配空间

当然,在讨论私有方法/成员以及实例引用时,这会变得有点棘手。只需说一句,如果您非常担心,那么PHP可能不是您要使用的语言


不确定是否有一种方法可以深入PHP代码以查看分配了哪些内存,例如,使用C可以很容易地做到这一点。为了回答你具体案例中的问题,你可能不得不进行低层次的思考。

现在,请恕我直言,因为这是从内存中获取的,我找不到我的原始来源,但如果我没记错的话,内存是按类分配的

一旦加载了一个类,它就会将所有方法加载到内存中,即使它们还没有被执行。然后,如果您有该类的新实例,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类,foo类将依次加载construct和bar方法(以及其他内置方法)。然后,当您实例化它时,它不需要为方法分配空间,它只引用已经加载的方法。因此,在我的示例中,
bar()
方法已经加载并等待,无需重新分配空间

当然,在讨论私有方法/成员以及实例引用时,这会变得有点棘手。只需说一句,如果您非常担心,那么PHP可能不是您要使用的语言

不确定是否有一种方法可以深入PHP代码以查看分配了哪些内存,例如,使用C可以很容易地做到这一点。在你的具体情况下,为了回答这个问题,你可能不得不走那么低的层次。

你的条件不适用了。“一般来说,创建一个类的新实例不会复制成员-一个类的所有实例共享每个成员的一个副本”应该是“一般来说,创建一个类的新实例不会复制方法-一个类的所有实例共享每个方法的一个副本”术语成员可以指私有数据成员(即,私有变量)您的术语已关闭。“一般来说,创建一个类的新实例不会复制成员-一个类的所有实例共享每个成员的一个副本”应该是“一般来说,创建一个类的新实例不会复制方法-一个类的所有实例共享每个方法的一个副本”术语成员可以指私有数据成员(即私有变量)