1

更新: で

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

それは言います:

よく言及される PHP5 OOP のキーポイントの 1 つは、「オブジェクトはデフォルトで参照によって渡される」ということです。これは完全に真実ではありません。

何故ですか?以下は、完全に正しいかどうかわからない理由です。

大まかに言えば、foo はオブジェクト、またはクラス Foo のインスタンスと言えると思います。

しかし、非常に技術的に言えば、foo は単なる参照であり、変数fooが常にオブジェクトへの参照である Java や Ruby とまったく同じ方法であるというのは本当ですか。

そのため、PHP では、

function add($obj) {
  $obj->a++;
}

「参照渡し」とは言いませんが、非常に技術的に言えば、参照である値を渡しています。つまり、「参照渡し」ではなく「参照渡し」です

しかし、PHP で foo がオブジェクトであると言うなら、「参照渡し」は理にかなっていると思います。それで本当ですか?foo は、オブジェクトではなくオブジェクトへの参照であると言われているため、「値渡し」しているだけなのでしょうか?

4

3 に答える 3

1

$fooはオブジェクトではなく、参照です。それ$fooがオブジェクトであると言うのはエラーで$fooあり、オブジェクトを指す参照です。

参照は、PHP (Java および Ruby も同様) の他の引数と同様に、値によって渡されるため、参照を直接割り当てて変更することはできませんが、それが指しているオブジェクトに対しては好きなように作業できます。

抽象化を単純化するために、プログラマー$fooは「オブジェクトです」と言うことがありますが、これは間違っていますが、「全体$fooがオブジェクトを指す参照である」と言うよりは簡単です。多くの場合、いくつかの特殊なケースを除いて、違いは実際には問題になりません。

于 2010-10-18T10:57:42.743 に答える
0

すべてのオブジェクトは、デフォルトでPHP 5以降で参照によって渡されますが、PHP 5で参照を渡す前に、「&」演算子を使用しました

つまり、オブジェクトをメソッドに渡すと、参照がコピーされ、メソッド内の別の変数に参照のコピーが含まれます。

したがって、デフォルトでは参照によって参照を渡さないので、参照のコピーを含む変数に新しい値を割り当てて、元の参照に影響を与えることはできません。

于 2010-10-18T10:40:12.730 に答える
0

PHP オブジェクト変数は、実際にはオブジェクトを含みません (他の多くの言語と同様)。オブジェクトの「ハンドル」を含みます。つまり、オブジェクトを識別し、検索し、操作するための値です。この変数は他の変数と同じように渡されます - val や ref などで渡すことができます。ただし、この値を別の変数にコピーすると、整数や文字列で起こることと同じことと異なることが起こります。

整数/文字列: 値がコピーされるため、値が変更されても、もう一方は同じままです。

オブジェクト: 値はコピーされますが、値はハンドルです。したがって、このハンドルが実際のオブジェクトにアクセスするために使用され (これがこのハンドルを使用する唯一の方法です)、このアクセスがそれを変更すると、別の変数 (独立しているが同じハンドルを含む) が変更を反映します。

したがって、実際には非常に一貫性があり、単純に「値による」および「参照による」処理を期待するものとは少し異なります。これは、渡されるものが実際にはスカラー変数とオブジェクト変数で異なるためです。オブジェクト変数には、間接的なレベルが含まれます。

これは、ところで、オブジェクト変数を参照渡しすることがほとんど意味をなさない理由です-関数内で1つのオブジェクトを別のオブジェクトに置き換えたい場合を除きます。

于 2010-11-26T23:02:13.673 に答える