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() を持っているかどうか、または 1 つしかないかどうかを知りたいです。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 つのメソッド ( set_attr() ) だけが SimpleClass プロトタイプ オブジェクトに割り当てられます。

4

3 に答える 3

1

はい、合計メソッドは 1 つだけです。

ただし、コンストラクターまたはメソッドでメソッドを作成することは、少なくとも Javascript、PHP、および C# で可能です。そうすることは Javascript で時々見られますが、PHP や C# で行われているとは聞いたことがありません。

次の例では、すべて不必要に関数 ID を作成し、メモリを浪費しています。

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 に答える
1

メモリ内にすべてのメソッドを持つ 1 つのクラスが存在し、SimpleClass クラスの 3 つの個別のインスタンス化が存在します。$sc1、$sc2、および $sc3 には、それぞれ独自の set_attr メソッドのコピーがあります。一方を呼び出しても、他方には影響しません。それらはメモリ内のクラスオブジェクトを呼び出し、それはメソッドですが、独立して動作すると思います。

ポインターを持つ 1 つのインスタンス化を作成するには、インスタンス化を複製またはコピーできます。

$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 に答える