2011-10-19 5 views
2

PHPでは、オブジェクトの配列を作成する場合、オブジェクトメソッド(データメンバーではありません)が配列内のオブジェクトの各インスタンスごとにコピーされるか、または一度だけコピーされますか?私はメモリの理由から、後者は真実であると仮定します。 StackOverflowコミュニティでこれが正しいことを確認したかっただけです。例えばPHPでは、オブジェクトメソッドコードがインスタンス間で重複または共有されていますか?

、私は現実法1(で明らかにすなわち

class MyClass { 
    public $data1; 
    private $data2; 
    public function MyClass($d1, $d2) { 
     $this->data1=$d1; $this->data2=$d2; 
    } 
    public function method1() { } 
    public function method2() { } 
} 

、メソッドのカップルとMyClassクラスがあるとします)と方法2は()空関数ではありません。 は、今ではこれらのオブジェクトの配列を作成すると:

$arr = array(); 
$arr[0] = & new MyClass(1,2); 
$arr[1] = & new MyClass(3,4); 
$arr[2] = & new MyClass(5,6); 

したがってPHPは、三個のオブジェクトインスタンスの各々について、メモリ内のデータメンバ3組を記憶しています。私の質問は、PHPは、$ arrの3つの要素のそれぞれについて、method1()とmethod2()(そしてコンストラクタ)のコピーを3回保存するのでしょうか?私は、メモリに各メソッドの200個のコピーを保存する必要があるため、〜200個のオブジェクトの配列があまりにもメモリを消費するかどうかを判断しようとしています。

お時間をいただきありがとうございます。

+3

確かに、方法は、定義上、プロシージャに対する*参照*ですか?この場合、プロシージャの仕組みは一度しか定義されません(オブジェクトをインスタンス化するときにクラスをロードする* not *)。すべてのインスタンスは単にそのプロシージャを指し示すだけです。これは純粋な推測ですが、クロージャでない限り、どのようなタイプのメソッド/関数に対しても他の方法であるとは見えません。 – DaveRandom

+0

Hmm。良い質問。これらのメソッドの中で定義されている静的な変数に何が起こるのか不思議です。それはメソッドのすべてのインスタンスによって共有される1つの静的なvarか、または各インスタンスが独自の静的varを取得するかどうかです。 –

+0

@DaveRandom Javascriptでは、クラスを定義すると、メソッドがオブジェクトに埋め込まれます。それらのコンテンツは、インスタンス間で「共有」されません。 –

答えて

4

定義によると(つまり、コード)、関数は1回しか存在しません。だからこそあなたはコードを作ります(データではありません)。

ただし、コードを使用して多くのデータを生成できます。しかしそれは別の話です;)。

オブジェクト間で不必要にコードを複製しない限り、関数は一度しか存在しません。独立したコードの数を作成します。コードに関連付けられたデータ(クラスメンバー)のみが複製されます。

Sounds fair?ところで

$arr[0] = & new MyClass(1,2); 

はあなたの厳格な基準の誤差を与えます。 newキーワードで参照/別名を割り当てることはできません。おそらくこの方法はPHP 4のコードの影響を受けますが、これはオブジェクトストアを導入したPHP 5以降に変更されています。

+0

"定義上、関数は一度しか存在しません">いいえ、Javascriptではそうではありません。私の答えを見てください。しかし、それはPHPでも当てはまります。 –

+0

さて、あなたは私のコメントを読むべきです...私は「例えば」と言いました。間違った文を言っているだけで、機能は一度は存在しません。私はOPが興味深い質問をしたと思います。言葉によっては必ずしも同じ答えではないので、それは "厄介"で正確な価値があります。 (あなたが好きなら激怒して、それは非常に成熟しています) –

+0

厳しい基準の誤りについては頭をアップしてくれてありがとう。私はPHP5のプログラミングにかなり新しいです、そして、私はヒントを感謝します。 – user1004061

0

メソッドの内容は、メモリに1回だけ保存されます。上記のクラスのすべてのPHPオブジェクトはメソッドへの参照を持ちます。

結論として、多くのオブジェクトを用意する予定がある場合は、メソッドのメモリサイズを気にする必要はありません。オブジェクト属性のメモリサイズに注意してください。

これは、たとえば、各クラス定義メソッドが各インスタンスに含まれるJavascriptとは異なります。しかし、プロトタイプにメソッドを定義すると、そのメソッドはすべてのクラスインスタンスで共有されます(もちろん、メモリは軽くなります)。このリンク:http://webdevelopersjournal.com/articles/jsintro3/js_begin3.htmlを参照してください。

+0

あなたがjavascriptについて言うことは間違っています。これは、すべてのjavascriptインタプリタについて記述するときには機能しませんが、実際に正しい言語名とバージョンを指定する必要があります。 – hakre

+0

@hakreもっと正確になりたいですか? –