对象是否共享他们的方法,或者他们有自己的方法

时间:2013-08-13 17:49:29

标签: php oop memory prototypal-inheritance

当我在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。

3 个答案:

答案 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
    }
}
相关问题