当我在PHP中实例化多个对象时,每个对象都有自己的方法,或者只有1个方法被实例化?
示例:
Class SimpleClass {
public $attr = 'some value';
public function set_attr($val){
$this->attr = $val ;
}
}
$sc1 = new SimpleClass();
$sc2 = new SimpleClass();
$sc1->set_attr('new value1');
$sc2->set_attr('new value2');
在这个例子中,我想知道每个SimpleClass对象在Memory中是否有自己的方法set_attr(),或者只有一个。在JavaScript中,可以使用原型Object以这种方式完成。我想要知道它是否也在其他语言中。
只是为了澄清: 在JavaScript中,我可以基于原型Object创建一个Method:
SimpleClass = function() { this.attr = 'old val'; };
SimpleClass.prototype.set_attr = function(val) { this.attr = val ; };
var sc1 = new SimpleClass();
var sc2 = new SimpleClass();
sc1.set_attr('new val');
sc2.set_attr('new val');
在这个例子中,每个Object,sc1和sc2都有一个变量assigend,但只有1个方法(set_attr())将被赋予SimpleClass原型Object。
答案 0 :(得分:1)
只会实例化一个方法。它将使用一个隐式this指针调用,该指针指向您调用它的对象。
http://php.net/manual/en/language.oop5.basic.php
答案 1 :(得分:1)
在内存中将有一个包含所有方法的类,然后将有三个单独的SimpleClass类实例。 $ sc1,$ sc2和$ sc3将各自拥有自己的set_attr方法副本。召唤一个不会影响另一个。我相信他们会调用内存中的类对象和它的方法,但是可以独立运行。
要创建一个具有指针的实例,您可以克隆或复制实例化:
$sc1 = new SimpleClass();
$sc2 = $sc1;
$sc2->set_attr('something');
$sc1->get_attr(); // would return 'something' as $sc2 is a pointer to $sc1
答案 2 :(得分:1)
是的,总共只有一种方法。
但是,至少在Javascript,PHP和C#中,可以在构造函数或方法中创建方法。干 所以有时候在Javascript中可以看到,但我从未听说它是用PHP或C#完成的。
在以下示例中,所有创建函数标识都是不必要的并浪费内存。
在PHP中
<?php
class WastingMemoryForMethods {
public $value = 3;
public function __construct() {
$this->method1 = function() {
return $this->value;
};
$this->method2 = function() {
};
$this->method3 = function() {
};
}
}
$a = new WastingMemoryForMethods();
echo $a->method1->__invoke();
//3
在Javascript中:
function WastingMemoryForMethods() {
this.value = 3;
this.method1 = function() {
return this.value;
};
this.method2 = function() {
};
this.method3 = function() {
};
}
var a = new WastingMemoryForMethods();
console.log(a.method1());
//3
在C#中
class WastingMemoryForMethods {
public int value = 3;
public Func<int> method1;
public Func<int> method2;
public Func<int> method3;
public WastingMemoryForMethods() {
this.method1 = () => this.value;
this.method2 = () => 0;
this.method3 = () => 0;
}
public static void Main(string[] args) {
var a = new WastingMemoryForMethods();
Console.WriteLine(a.method1());
//3
}
}