이 기사에서는 PHP 인용이 무엇인지 설명합니다. PHP에 인용된 소개(코드 예제)에는 특정 참고 가치가 있습니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
1. 참조란 무엇입니까
PHP에서 참조는 동일한 변수 내용에 다른 이름으로 액세스하는 것을 의미합니다.
PHP에서는 변수 이름과 변수 내용이 다르기 때문에 동일한 내용이라도 다른 이름을 가질 수 있습니다.
가장 가까운 비유는 Unix 파일 이름과 파일 자체입니다. 변수 이름은 디렉터리 항목이고 변수 내용은 파일 자체입니다. 참조는 Unix 파일 시스템의 하드 링크로 간주될 수 있습니다.
PHP의 참조는 C의 포인터와 다릅니다. 예를 들어 포인터 연산을 수행할 수 없습니다. 참조는 실제 메모리 주소가 아니라 기호 테이블 별칭입니다.
2. 참조의 특징
PHP의 참조는 두 개의 변수가 동일한 내용을 가리키는 것을 허용합니다.
$a =& $b;
이는 $a와 $b가 동일한 변수를 가리킨다는 의미입니다.
$a와 $b는 여기에서 정확히 동일합니다. $a가 $b를 가리키는 것이 아니고 그 반대도 아닙니다. $a와 $b가 같은 위치를 가리키는 것입니다.참조가 있는 배열을 복사하면 해당 값은 역참조되지 않습니다. 배열 값을 함수에 전달할 때도 마찬가지입니다.
$a = 'a'; $arr1 = [ 'a' => $a, 'b' => &$a, // $arr1['b'] 与 $a 指向同一个变量 ]; // 将 $arr1 传值赋值给 $arr2 $arr2 = $arr1; print_r($arr2); // $arr2 的值为 ['a' => 'a', 'b' => 'a'] // 修改 $a 的值为 'b' $a = 'b'; print_r($arr2); // $arr2 的值为 ['a' => 'a', 'b' => 'b'] function foo($arr){ // 将 $arr['b'] 的值改为 'c'; $arr['b'] = 'c'; } echo $a; // $a 的值为 'b' // 将 $arr1 传入函数 foo($arr1); echo $a; // $a 的值为 'c'
정의되지 않은 변수가 참조로 할당되거나, 참조 매개변수로 전달되거나, 참조로 반환되면 해당 변수가 자동으로 생성됩니다.
// 定义函数 foo(),通过引用传递参数 function foo(&$var) { } foo($a); // 创建变量 $a,值为 NULL var_dump($a); // NULL foo($b['b']); // 创建数组 $b = ['b' => NULL] var_dump(array_key_exists('b', $b)); // bool(true) $c = new StdClass; foo($c->d); // 创建对象属性 $c->d = NULL var_dump(property_exists($c, 'd')); // bool(true)
함수 내에서 전역으로 선언된 변수에 참조가 할당되면 해당 참조는 함수 내에서만 표시됩니다. $GLOBALS 배열을 사용하면 이 문제를 피할 수 있습니다.
$var1 = 'var1'; $var2 = 'var2'; function global_references($use_globals) { global $var1, $var2; if (!$use_globals) { $var2 = & $var1; // $var2 只在函数内部可见 } else { $GLOBALS["var2"] = & $var1; // $GLOBALS["var2"]在全球范围内也可见 } } global_references(false); echo "var2 is set to '$var2'\n"; // var2 is set to 'var2' global_references(true); echo "var2 is set to '$var2'\n"; // var2 is set to 'var1'
global $var;는 $var =& $GLOBALS['var'];의 약어로 생각하면 됩니다. 따라서 $var에 다른 참조를 할당하면 지역 변수에 대한 참조만 변경됩니다.
foreach 문에서 참조가 있는 변수에 값을 할당하면 참조된 개체도 변경됩니다.
$ref = 0; $row = & $ref; foreach ([1, 2, 3] as $row) { // do something } echo $ref; // 3 - 遍历数组的最后一个元素
3. 참조로 전달
변수를 참조로 함수에 전달하면 함수가 매개변수 값을 수정할 수 있습니다.
function foo(&$var) { $var++; } $a=5; foo($a); echo $a; // 6
함수 호출에는 참조 기호가 없으며 함수 정의에만 참조 기호가 있습니다. 매개변수를 참조로 올바르게 전달하려면 함수 정의만으로도 충분합니다. 참조로 전달할 수 있는 것은 무엇입니까? 함수를 사용하여 참조가 바인딩되어야 하는 변수를 찾습니다. 참조로 반환될 수 있습니다.
성능을 높이기 위해 반환 참조를 사용하지 마세요. 엔진은 스스로 최적화할 만큼 똑똑합니다. 유효한 기술적 이유가 있는 경우에만 참조를 반환하십시오!function foo(&$var) { $var++; } $a=5; foo($a); echo $a; // 6는 매개변수 참조 전달과 다릅니다. 참조 반환은 두 위치에서 앰퍼샌드를 사용해야 합니다. 이는 일반적인 복사본 대신 참조가 반환된다는 것을 나타냅니다. . 참조 반환은 변수만 반환할 수 있습니다. return intval($this->value);와 같이 함수에서 참조를 반환하려고 하면 함수가 참조된 변수가 아닌 표현식의 결과를 반환하려고 하기 때문에 오류가 발생합니다. 함수에서는 참조 변수만 반환할 수 있으며 다른 방법은 없습니다.
function foo(&$var) { $var++; echo $var; // 6 } function &bar() { $a = 5; return $a; } foo(bar());
function foo(&$var) { $var++; } function bar() // 注意,这个函数不返回引用 { $a = 5; return $a; } foo(bar()); // 自 PHP 5.0.5 起导致致命错误,自 PHP 5.1.1 起导致严格模式错误,自 PHP 7.0 起导致 notice 信息 foo($a = 5); // 表达式,不是变量。PHP Notice: Only variables should be passed by reference foo(5); // PHP Fatal error: Only variables can be passed by reference
6. Discovered
전역 $var로 변수를 선언하면 전역 변수에 대한 참조가 실제로 함수 내부에 설정됩니다. 즉, 이 작업의 효과는 동일합니다.
class Foo { public $value = 42; public function &getValue() { return $this->value; } } $foo = new Foo; // $myValue 是 $obj->value 的引用. $myValue = &$foo->getValue(); // 将 $foo->value 修改为 2 $foo->value = 2; echo $myValue; // 2이는 unset $var가 전역 변수 $GLOBALS["var"]를 설정 해제하지 않는다는 의미입니다.
$this
객체의 메서드에서 $this는 항상 이를 호출하는 객체에 대한 참조입니다.위 내용은 PHP 인용문이란 무엇입니까? PHP 인용 소개(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!