PHP5 객체는 참조로 전달됩니까?
저는 이것에 대해 어떤 일관된 정보도 얻을 수 없는 것 같습니다.서로 다른 출처에서 서로 다른 말을 하는 것으로 보이며 존경받는 php.net 자체는 이것을 명시적으로 언급하지 않는 것으로 보입니다. 인정해야겠지만, 저는 단지 잠깐 보았을 뿐입니다.
'무거운' 개체를 전달하는 경우 참조로 전달해야 하지만 계속 입력하고 싶지 않습니다.
function foo(TypeName& $obj)
내가 쉽게 벗어날 수 있다면,
function foo(TypeName $obj)
그렇다면 기준은 무엇을 의미할까요?
개체는 참조를 통해 전달되고 할당됩니다.연산자 주소를 사용할 필요가 없습니다.
제가 입력한 내용이 지나치게 단순하다는 점을 감안하면 귀하의 목적에 적합할 것입니다.설명서에는 다음이 명시되어 있습니다.
종종 언급되는 PHP5 OOP의 핵심 사항 중 하나는 "객체는 기본적으로 참조에 의해 전달된다"는 것입니다.이것은 완전히 사실이 아닙니다.이 섹션에서는 몇 가지 예를 사용하여 일반적인 생각을 수정합니다.
PHP 참조는 별칭으로, 서로 다른 두 변수가 동일한 값에 쓸 수 있습니다.PHP5부터 객체 변수는 객체 자체를 더 이상 값으로 포함하지 않습니다.개체 액세스자가 실제 개체를 찾을 수 있도록 허용하는 개체 식별자만 포함되어 있습니다.개체를 인수로 보내거나 다른 변수에 반환하거나 할당할 때 다른 변수는 별칭이 아닙니다. 동일한 개체를 가리키는 식별자의 복사본을 보유합니다.
자세한 설명(과다 단순화 및 식별자 설명)은 다음 답변을 참조하십시오.
PHP 설명서에서:
함수를 참조하여 변수를 전달하여 함수가 변수를 수정할 수 있습니다.구문은 다음과 같습니다.
<?php function foo(&$var) { $var++; } $a=5; foo($a); // $a is 6 here ?>
참고: 함수 호출에는 참조 부호가 없습니다. 함수 정의에만 해당됩니다.함수 정의만으로도 참조로 인수를 올바르게 전달하기에 충분합니다.PHP 5.3.0 이후 & in foo(&$a);를 사용하면 "call-time pass-by-reference"가 사용되지 않는다는 경고가 표시됩니다.
PHP 5에서는 객체 모델의 인프라가 객체 핸들과 함께 작동하도록 다시 작성되었습니다.clone 키워드를 사용하여 개체를 명시적으로 복제하지 않는 한 개체의 복제를 장면 뒤에 만들지 않습니다.PHP 5에서는 객체를 참조로 전달하거나 참조로 할당할 필요가 없습니다.
따라서 사용할 수 있는 유일한 시간은function foo(&$var)
구문은 $var가 클래스의 인스턴스가 아닐 수 있는 경우입니다.
조금 더 정확한 것 같습니다, 객체의 값은 값으로 전달되지만 객체의 값 자체는 포인터입니다.이것은 단순히 참조를 전달하는 것과는 다릅니다.
http://www.php.net/manual/en/language.oop5.references.php 에 나열된 예는 좋습니다.첫 번째 집합에서 $a = NULL;은 $a가 포인터일 뿐이므로 $b에 영향을 주지 않습니다.두 번째 집합에서 $c = NULL; $d는 $c에 대한 참조이므로 $d도 NULL이 됩니다.
<?php
class A {
public $foo = 1;
}
$a = new A;
$b = $a;
$a->foo = 2;
$a = NULL;
echo $b->foo."\n"; // 2
$c = new A;
$d = &$c;
$c->foo = 2;
$c = NULL;
echo $d->foo."\n"; // Notice: Trying to get property of non-object...
?>
PHP 5부터는 모든 객체가 참조를 통해 전달되고 할당됩니다.
에서는 PHP 4를 하여 객체가.&
교환입니다.
종종 언급되는 PHP5 OOP의 핵심 사항 중 하나는 "객체는 기본적으로 참조에 의해 전달된다"는 것입니다.이것은 완전히 사실이 아닙니다.이 섹션에서는 몇 가지 예를 사용하여 일반적인 생각을 수정합니다.
PHP 참조는 별칭으로, 서로 다른 두 변수가 동일한 값에 쓸 수 있습니다.PHP5부터 객체 변수는 객체 자체를 더 이상 값으로 포함하지 않습니다.개체 액세스자가 실제 개체를 찾을 수 있도록 허용하는 개체 식별자만 포함되어 있습니다.개체를 인수로 보내거나 다른 변수에 반환하거나 할당할 때 다른 변수는 별칭이 아닙니다. 동일한 개체를 가리키는 식별자의 복사본을 보유합니다.
중요한 것은 걱정스러운 경우 함수 호출에서 clone 키워드를 명시적으로 사용하지 않는 한 개체의 복사본을 만들 수 없다는 것입니다.그것이 가명이든 식별자든 간에 이 사실은 변하지 않습니다.
참조를 통해 "객체"를 전달하는 것이 유용한 예입니다.
class RefTest1
{
public $foo;
public function __construct(RefTest2 &$ref = null)
{
$this->foo =& $ref;
}
}
class RefTest2
{
public $foo;
public function __construct(RefTest1 &$ref = null)
{
$this->foo =& $ref;
}
}
class RefTest3
{
public $foo;
public function __construct(RefTest2 &$ref = null)
{
$this->foo =& $ref;
}
}
class DoCrossRef
{
public $refTest1;
public $refTest2;
public function __construct()
{
$this->refTest1 = new RefTest1($this->refTest2);
$this->refTest2 = new RefTest2($this->refTest1);
}
public function changeReference()
{
$this->refTest1 = new RefTest3($this->refTest2);
}
}
에 지막에마.RefTest1
는 에대참보니다합유를에 대한 하고 있습니다.RefTest2
그리고 반대로, 만약 또한.RefTest2
하지 않았습니다.RefTest1
생성되었습니다.
에 전화한 에.DoCrossRef->changeReference()
,RefTest2
▁reference▁also▁a▁objects▁holds다▁new니포합에 대한 참조도 포함되어 있습니다.RefTest3
물건.
예, PHP5 이후에는 객체가 참조를 통해 전달됩니다.명시적으로 할 필요가 없습니다.
http://www.php.net/manual/en/migration5.oop.php
PHP 5에는 새로운 객체 모델이 있습니다.PHP의 객체 처리가 완전히 재작성되어 성능이 향상되고 더 많은 기능이 제공됩니다.이전 버전의 PHP에서는 객체가 원시 유형(예: 정수 및 문자열)처럼 처리되었습니다.이 메서드의 단점은 변수가 할당되거나 메서드에 매개 변수로 전달될 때 의미적으로 전체 개체가 복사된다는 것입니다.새로운 접근 방식에서 객체는 값이 아닌 핸들에 의해 참조됩니다(핸들은 객체의 식별자로 생각할 수 있습니다).
다음은 참조를 통해 객체가 전달되었음을 확인하는 또 다른 예입니다.
<?php
// discussion: https://stackoverflow.com/questions/2715026/are-php5-objects-passed-by-reference#_=_
class A {
public $foo = 1;
}
class B {
function inc($obj) {
$obj->foo++;
}
}
$objA = new A();
$objB = new B();
$objB->inc($objA);
echo "[" . $objA->foo . "]"; // Outputs [2]
언급URL : https://stackoverflow.com/questions/2715026/are-php5-objects-passed-by-reference
'source' 카테고리의 다른 글
IPython 종료 확인 사용 안 함 (0) | 2023.08.05 |
---|---|
web.config asp.net 의 오라클 데이터베이스 연결 (0) | 2023.07.31 |
SQL - 그룹화 기준에서 별칭 사용 (0) | 2023.07.31 |
컴파일러 경고 '임의적 함수 선언 memset'을 해결하는 방법 (0) | 2023.07.31 |
MySQL 인덱스 및 순서 (0) | 2023.07.31 |