예를 들어, 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++과 structs 같은 언어는 어떨까요? 내 C++은 녹슬지 만, 클래스 전체를 전달할 때 전체 클래스가 실제로 복사된다고 믿는다. 그래서 가능하다면 함수가 참조를 취하도록하거나 포인터를 사용하도록 권장한다. C#에서는 구조체와 클래스가 어떻게 전달되는지에 차이가 있습니다.
값으로 전달하지 않으면이 딥 복사 동작을 무엇이라고 부릅니까?
우리에게는 3 가지 행동과 2 가지 문구가있어 이들을 묘사하는 것처럼 보입니다. 이로 인해 커뮤니티에 많은 혼란이 생깁니다.
지옥, 나는 당신이 나에게 내가 틀린 무엇인가 썼다라고 나에게 이야기하기를 기다리고있다. 요약
, 3 개 동작은 다음과 같습니다
- 객체가 깊은 복사 (객체와 속성이 복제됩니다)
- 만 개체가 복사됩니다 (속성은 여전히 참조입니다 우리는 t을 각각 호출해야 무슨 목적은 모든
기술적으로 복사되지 않습니다
(아마 여부) 언젠가, PHP 인수를위한'const' 키워드를 구현하는 것, 이것은 어떠한 모호성을 제거합니다 ... :) – netcoder