ここにハブに関するすばらしいトピックが登場しましたJavascriptとPHPの違い;)私
それでは始めましょう
「デフォルトでは、すべてが値で渡され、オブジェクトも渡されます
PHPでは、C言語の絶対概念を引き上げて、すべてが値で渡されるようにしました。 そして、最初はオブジェクトに対してもそれを行いましたが、概念を少し変更しました-オブジェクトはまだ値ですが、この値はクラスインスタンスへのリンクです。」-false、オブジェクトは参照によってのみPHPに転送されます。 オブジェクトと参照 (%username%理由を整理する必要があるかどうか-オブジェクトを転送する方法に専用の別のトピックが必要かどうか。私は愚かなトピック質問をしたくないので、この投稿の最初のコメントは「方法に専用のトピックが必要ですか?」オブジェクトの転送「はいの場合はプラス、マイナスの場合はプラス)
著者のさらなる例
PHP:
<?php $arr = array( 'key1' => 'value1', 'key2' => 'value2', ); function doSmthWithArray($arr) { $arr['key3'] = 'value3'; } doSmthWithArray($arr); print_r($arr); // "key1 => value1, key2 => value2" —
Javascript:
var arr = { key1: 'value1', key2: 'value2' }; function doSmthWithArray(arr) { arr['key3'] = 'value3'; } doSmthWithArray(arr); console.log(arr); // "key1 => value1, key2 => value2, key3 => value3" — .. JS, , «», , (, — . , , , )
そのため、この例は間違っています。 なんで? まず、JavaScriptでは、ほとんどすべてがオブジェクトです
「JavaScriptはほぼ完全にオブジェクトベースです。 JavaScriptオブジェクトは、プロトタイプで拡張された連想配列です(以下を参照)。 オブジェクトプロパティ名は文字列キーです。obj.x= 10とobj ['x'] = 10は同等であり、ドット表記は構文糖です。 プロパティとその値は、実行時に追加、変更、または削除できます。 オブジェクト(およびそのプロトタイプ継承チェーン上のプロパティ)のほとんどのプロパティは、for ... inループを使用して列挙できます。 JavaScriptには、FunctionやDateなどの少数の組み込みオブジェクトがあります。
したがって、
var arr
参照によって渡される本格的なオブジェクトです。
私たちのお気に入りのPHPでは、
array
型はオブジェクトではありません。 (PHPにはいくつの型がありますか? 答えはここにあります )そして、ご存知のように、
object
のみ
object
参照によって渡され、その他はすべて値によって渡されます。 そのため、著者の例では、元の配列は変更されません。 配列をオブジェクトにキャストすることは可能ですか? はい
<?php $arr = array( 'key1' => 'value1', 'key2' => 'value2', ); $ArrayObject = (object) $arr; var_dump($ArrayObject); $anotherArrayObject = new ArrayObject($arr); var_dump($anotherArrayObject);
最初にオブジェクト型に明示的に変換するか、組み込みのArrayObjectクラスを使用します。
$ArrayObject
は、プロパティが元の配列のキーであるオブジェクトになり、これらのプロパティの値は配列の値になります。 2番目のケースでは、配列はArrayObject型のオブジェクトになりました。これについては、上記のリンクで説明しています。 そして、配列がオブジェクトになったら、元の記事の著者の例を修正して実行してみましょう。
$arr = array( 'key1' => 'value1', 'key2' => 'value2', ); $arr = new ArrayObject($arr); function doSmthWithArray($arr) { $arr['key3'] = 'value3'; } doSmthWithArray($arr); print_r($arr); echo $arr['key3'];
次に、このコードを実行して結果を見てください! さて、参照によってPHPに転送されるオブジェクトは何ですか?
ArrayObject Object ( [storage:ArrayObject:private] => Array ( [key1] => value1 [key2] => value2 [key3] => value3 ) ) value3
さらに、元の記事の著者はこれを持っています:
「コピーオンライト
誰もがこれについて確実に知っているわけではありません。 要するに、PHPでもすべてが値で渡されますが、実際には、コピーが常に発生するとは限りません。 たとえば、最初の例のように、構造内で値が変化したときに発生します。 ただし、コピーが作成されるのはこれだけではありません。 これについては、リンクで詳細をご覧ください。 単純型は、値によって参照によってオブジェクトに渡されることがすでにわかっています。
この場所を読んでくれたすべての人に感謝します。 リンクでオブジェクトを渡すことの混乱を少し明確にしたいと思います。 はい、ミニ投票を忘れないでください。 不正確、エラー、不快なデザインについては、許しを事前に許します。誰もこのトピックを必要としない場合でもnafig :)
UPD1:紳士、これはPHPとJavascriptの違いに対する答えのトピックです;)
UPD2:あなたはまったく同意しないものとマイナス? PHPでオブジェクトがまだ参照渡しされているという事実?
UPD3:たぶん正しくしませんでしたが、
値でパラメーターを渡す
パラメータを値で渡すと、呼び出し元の関数は、呼び出し先が使用できるメモリに即値(通常はスタック)をコピーします。 変数のコピーをそれぞれ変更しても、オリジナルには影響しません。
参照によるパラメーターの受け渡し
パラメータを参照渡しすると、コピーされるのは値自体ではなく、元の変数のアドレスです。
参照渡しでは、オブジェクトの状態を説明するすべての情報をコピーすることを避けます。 参照によって渡されたパラメーターの状態を変更すると、元のオブジェクトが変更されます。
したがって、私が言いたかったのは、オブジェクトが既に参照によって転送されていることです(はい、実際にはメモリ内のアドレスを値で渡すことになり、元のオブジェクトを見つけることができます )しかし、次の単純なタイプに値を渡します( 変更変数のコピー、それぞれ、オリジナルは影響しません。 )
、参照によるオブジェクト(参照によって渡されるパラメーターの状態を変更すると、元のオブジェクトが変更されます。 )
$test = 'LOREM IPSUM'; function byValue($param) { $param = strtolower($param); } byValue($test); echo $test.PHP_EOL; $object = new stdClass(); function byReference($param){ $param->foo = 'bar'; } byReference($object); var_dump($object);
PMに質問があふれています。私はすべてに答えます。ただ仕事をするだけではできません。 どうやって解放されるのかお答えします。