1

当我在 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 对象在内存中是否有自己的方法 set_attr() 或者是否只有一个。在 JavaScript 中,可以使用原型对象以这种方式做到这一点。我想知道它是否也是这样的其他语言。

只是为了澄清:在 JavaScript 中,我可以创建一个基于原型对象的方法:

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');

在此示例中,每个对象 sc1 和 sc2 都将分配一个变量,但只有 1 个方法 ( s​​et_attr() ) 将分配给 SimpleClass 原型对象。

4

3 回答 3

1

只会实例化一种方法。它将使用指向您调用它的对象的隐式 this 指针调用。

http://php.net/manual/en/language.oop5.basic.php

于 2013-08-13T17:56:46.390 回答
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
于 2013-08-13T18:38:39.423 回答
1

是的,总共只有 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
    }
}
于 2013-08-13T19:32:01.913 回答