は、PHPで私たちはこのような何か書くことができます。「参照」の使用方法にはあいまいさがありますか?例えば
class C {
var $x;
function __construct($x) {
$this->x = $x;
}
function __toString() {
return (string)$this->x;
}
}
function f1($obj) {
$obj->x = 2;
}
$a = new C(1);
f1($a);
echo $a; // 2
を、いくつかは、これはあなたがそれらのプロパティを変更することができるので、オブジェクトは、参照によって渡され、それらの変更は、クラスの外に反映されていることを示していることだと思います。すなわち、オブジェクトはプリミティブがコピーされていない。
しかし、我々はこれを書くことができます。
function f2($obj) {
$obj = new C(2);
}
$b = new C(1);
f2($b);
echo $b; // 1
今オブジェクトはすべての参照渡しされていません示唆しています。実際には、オブジェクトはコピーされる(値渡される)が、は深くはないコピーされる。 $obj
がコピーされますが、$x
はまだ同じものを参照しています。
「参照」という言葉は両方の意味を持つと聞いていますが、一部の人は、PHPが参照渡しであると言い、他のものは渡し渡しと言うでしょう。
function f3(&$obj)
のような関数を定義すると言うとき
我々はPHPが参照渡しであると言うなら、私たちは何を意味するのですか? その関数はオブジェクトへの参照を取ります。これは、最初の意味が間違っていることを示しています。
しかし、C++のような言語やC#の構造体はどうですか?私のC++は少し錆びていますが、クラスを渡すときにクラス全体が実際にディープコピーされると思います。そのため、できる限り関数が参照を参照するようにしたり、ポインタを使用することをおすすめします。 C#では、構造体とクラスがどのように渡されるかに違いがあります。
値渡しではない場合、このディープコピー動作とは何ですか?
私たちは3つの行動とそれらを記述するための2つのフレーズしか持たないと思われ、これはコミュニティに多くの混乱を招いています。
ヘック、私はちょうどあなたの誰かが私がここに何か間違って書いたと言ってくるのを待っています。要約する
、3つの動作は次のとおり
- オブジェクトのみオブジェクトがコピーされ
- (オブジェクトとそのプロパティがクローン化された)ディープコピーである(その特性はまだを参照私たちは、tのそれぞれを呼び出す必要がありますどのようなオブジェクトはすべて
技術的にコピーされません
いつか(またはおそらくない)、... PHPは、引数に 'const'キーワードを実装しますが、これはいかなるあいまいさを削除します: ) – netcoder