찾다
php教程php手册PHP 참조 (&)_php 기본 심층 분석

명언이란 무엇인가
PHP에서 인용한다는 것은 동일한 변수 내용에 다른 이름으로 액세스하는 것을 의미합니다. 이는 C 포인터와는 다릅니다. 대신 참조는 기호 테이블 별칭입니다. PHP에서는 변수 이름과 변수 내용이 다르기 때문에 동일한 내용이라도 다른 이름을 가질 수 있습니다. 가장 가까운 비유는 Unix의 파일 이름과 파일 자체입니다. 변수 이름은 디렉토리 항목이고 변수 내용은 파일 자체입니다. 참조는 Unix 파일 시스템의 하드링크로 간주될 수 있습니다.

인용문의 역할
PHP의 참조에서는 두 변수가 동일한 내용을 가리키는 것을 허용합니다. 이 작업을 수행할 때의 의미:

<&#63;php
$a =& $b;
&#63;>

이는 $a와 $b가 동일한 변수를 가리킨다는 의미입니다.

참고:

여기서 $a와 $b는 정확히 동일합니다. $a가 $b를 가리키거나 그 반대가 아니라 $a와 $b가 같은 위치를 가리킵니다.

참고:

참조가 있는 배열을 복사하면 해당 값은 역참조되지 않습니다. 배열 값을 함수에 전달할 때도 마찬가지입니다.

참고:

정의되지 않은 변수가 참조로 할당되거나, 참조로 전달되거나, 참조로 반환되면 해당 변수가 자동으로 생성됩니다.

예제 #1 정의되지 않은 변수에 대한 참조 사용

<&#63;php
function foo(&$var) { }

foo($a); // $a is "created" and assigned to null

$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)

$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
&#63;>

참조를 반환하는 함수와 new 연산자(PHP 4.0.4 이상)에서 동일한 구문을 사용할 수 있습니다.

<&#63;php
$bar =& new fooclass();
$foo =& find_var($bar);
&#63;>


PHP 5부터 new는 자동으로 참조를 반환하므로 여기서 =&를 사용하는 것은 더 이상 사용되지 않으며 E_STRICT 수준 메시지를 생성합니다.

참고:

& 연산자를 사용하지 않으면 개체 복사본이 생성됩니다. 클래스에서 $this를 사용하면 해당 클래스의 현재 인스턴스에 적용됩니다. &가 없는 할당은 인스턴스(예: 개체)를 복사하고 $this는 복사본에 적용되지만 항상 원하는 결과는 아닙니다. 성능 및 메모리 소비 문제로 인해 일반적으로 하나의 인스턴스에서만 작업하려고 합니다.

@new와 같은 @ 연산자를 사용하여 생성자에서 오류 메시지를 표시하지 않을 수 있지만 &new 문을 사용할 때는 아무런 효과가 없습니다. 이는 Zend 엔진의 제한 사항이며 구문 분석 오류가 발생합니다.

경고

함수 내에서 전역으로 선언된 변수에 참조가 할당되면 해당 참조는 함수 내에서만 표시됩니다. $GLOBALS 배열을 사용하면 이 문제를 피할 수 있습니다.

예제 #2 함수 내 전역 변수 참조

<&#63;php
$var1 = "Example variable";
$var2 = "";

function global_references($use_globals)
{
 global $var1, $var2;
 if (!$use_globals) {
  $var2 =& $var1; // visible only inside the function
 } else {
  $GLOBALS["var2"] =& $var1; // visible also in global context
 }
}

global_references(false);
echo "var2 is set to '$var2'\n"; // var2 is set to ''
global_references(true);
echo "var2 is set to '$var2'\n"; // var2 is set to 'Example variable'
&#63;>

글로벌 $var;를 $var =& $GLOBALS['var'];의 약어로 생각하세요. 따라서 $var에 다른 참조를 할당하면 지역 변수에 대한 참조만 변경됩니다.
참고:

foreach 문에서 참조가 있는 변수에 값이 할당되면 참조된 개체도 변경됩니다.

예시 #3 인용 및 foreach 문

<&#63;php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
 // do something
}
echo $ref; // 3 - last element of the iterated array
&#63;>

참조가 하는 두 번째 일은 참조로 변수를 전달하는 것입니다. 이는 함수 내에서 지역 변수를 생성하여 수행되며 해당 변수는 호출 범위에서 동일한 내용을 참조합니다. 예:

<&#63;php
function foo(&$var)
{
 $var++;
}

$a=5;
foo($a);
&#63;>

$a를 6으로 변경합니다. 이는 foo 함수에서 $var 변수가 $a가 가리키는 것과 동일한 것을 가리키기 때문입니다. 자세한 설명은 참조로 전달을 참조하세요.

참조가 하는 세 번째 일은 참조 반환입니다.

인용문이 아닌 것
앞서 언급했듯이 참조는 포인터가 아닙니다. 이는 다음 구조가 예상한 효과를 생성하지 않음을 의미합니다.

<&#63;php
function foo(&$var)
{
 $var =& $GLOBALS["baz"];
}
foo($bar);
&#63;>

이렇게 하면 foo 함수의 $var 변수가 함수 호출 시 $bar에 바인딩되었다가 $GLOBALS["baz"]에 다시 바인딩됩니다. 참조 메커니즘을 통해 $bar를 함수 호출 범위 내의 다른 변수에 바인딩하는 것은 불가능합니다. 왜냐하면 foo 함수에는 $bar 변수가 없기 때문입니다($var로 표시되지만 $var에는 변수 내용만 있고 호출은 없습니다). 기호 테이블 이름-값 바인딩). 함수에 의해 선택된 참조 변수에 대한 참조 반환을 사용할 수 있습니다.

참조로 전달
함수가 인수 값을 수정할 수 있도록 함수에 대한 참조로 변수를 전달할 수 있습니다. 구문은 다음과 같습니다.

<&#63;php
function foo(&$var)
{
 $var++;
}

$a=5;
foo($a);
// $a is 6 here
&#63;>

함수 호출에는 참조 기호가 없으며 함수 정의에만 참조 기호가 있습니다. 매개변수를 참조로 올바르게 전달하려면 함수 정의만으로도 충분합니다. 최신 버전의 PHP에서는 foo(&$a);에서 &를 사용하면 "참조에 의한 호출 시간"이 더 이상 사용되지 않는다는 경고가 표시됩니다.

다음을 참조로 전달할 수 있습니다.

foo($a)와 같은 변수
foo(new foobar())
와 같은 새로운 문 함수에서 반환된 참조입니다. 예:

<&#63;php
function &bar()
{
 $a = 5;
 return $a;
}
foo(bar());
&#63;>

자세한 설명은 참조반환을 참조하세요.
다른 표현식은 참조로 전달할 수 없으며 결과는 정의되지 않습니다. 예를 들어, 참조로 전달하는 다음 예는 유효하지 않습니다.

<&#63;php
function bar() // Note the missing &
{
 $a = 5;
 return $a;
}
foo(bar()); // 自 PHP 5.0.5 起导致致命错误
foo($a = 5) // 表达式,不是变量
foo(5) // 导致致命错误
&#63;>

이러한 조건은 PHP 4.0.4 이상 버전에서 사용할 수 있습니다.

참고로 반품
참조 반환은 참조가 바인딩되어야 하는 변수를 찾기 위해 함수를 사용하려는 경우에 사용됩니다. 성능을 높이기 위해 반환 참조를 사용하지 마십시오. 엔진은 자체적으로 최적화할 만큼 똑똑합니다. 유효한 기술적 이유가 있는 경우에만 참조를 반환하십시오! 참조를 반환하려면 다음 구문을 사용하세요.

<&#63;php
class foo {
 public $value = 42;

 public function &getValue() {
  return $this->value;
 }
}

$obj = new foo;
$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42.
$obj->value = 2;
echo $myValue;    // prints the new value of $obj->value, i.e. 2.
&#63;>

本例中 getValue 函数所返回的对象的属性将被赋值,而不是拷贝,就和没有用引用语法一样。

Note: 和参数传递不同,这里必须在两个地方都用 & 符号——指出返回的是一个引用,而不是通常的一个拷贝,同样也指出 $myValue 是作为引用的绑定,而不是通常的赋值。

Note: 如果试图这样从函数返回引用:return ($this->value);,这将不会起作用,因为在试图返回一个表达式的结果而不是一个引用的变量。只能从函数返回引用变量——没别的方法。如果代码试图返回一个动态表达式或 new 运算符的结果,自 PHP 4.4.0 和 PHP 5.1.0 起会发出一条 E_NOTICE 错误。

<&#63;php
function &test(){ 
 static $b=0;//申明一个静态变量 
 $b=$b+1; 
 echo $b; 
 return $b; 
}
$a=test();//这条语句会输出$b的值为1 
$a=5; $a=test();//这条语句会输出$b的值为2
$a=&test();//这条语句会输出$b的值为3 
$a=5; $a=test();//这条语句会输出$b的值为6
&#63;>

$a=test()方式调用函数,只是将函数的值赋给$a而已,而$a做任何改变化,都不会影响到函数中的$b,而通过$a=&test()方式调用函数呢, 他的作用是将return $b中的$b变量的内存地址与$a变量的内存地址指向了同一个地方,即产生了相当于这样的效果($a=&b;) 所以改变$a的值,也同时改变了$b的值,所以在执行了 $a=&test(); $a=5; 以后,$b的值变为了5。

取消引用
当 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:

<&#63;php
$a = 1;
$b =& $a;
unset($a);
&#63;>

不会 unset $b,只是 $a。

再拿这个和 Unix 的 unlink 调用来类比一下可能有助于理解。

引用定位
许多 PHP 的语法结构是通过引用机制实现的,所以上述有关引用绑定的一切也都适用于这些结构。一些结构,例如引用传递和返回,已经在上面提到了。其它使用引用的结构有:

global 引用
当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说和这样做是相同的:

<&#63;php
$var =& $GLOBALS["var"];
&#63;>

这意味着,例如,unset $var 不会 unset 全局变量。

使用unset($a)与$a=null的结果是不一样的。如果该块内存只有$a一个映射,那么unset($a)与$a=null等价,该内存的引用计数变为0,被自动回收;如果该块内存有$a和$b两个映射,那么unset($a)将导致$a=null且$b不变的情况,而$a=null会导致$a=$b=null的情况。

原因:某变量赋值为null,将导致该变量对应的内存块的引用计数直接置为0,被自动回收。

$this
在一个对象的方法中,$this 永远是调用它的对象的引用。

引用的作用
如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,个人建议用 "&" 方式,然后用$var=null的方式清除. 其它时候还是用php5的默认方式吧. 另外, php5中对于大数组的传递,建议用 "&" 方式, 毕竟节省内存空间使用。

下面再来个小插曲 php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。

通俗的讲

1:如果有下面的代码

<&#63;ph
$a="ABC";
$b=$a;
&#63;>
 

 其实此时,$a与$b都是指向同一内存地址,而并不是$a与$b占用不同的内存。

2:如果在上面的代码基础上再加上如下代码

$a="EFG";
 由于$a与$b所指向的内存的数据要重新写一次了,此时Zend核心会自动判断 自动为$b生产一个$a的数据拷贝,重新申请一块内存进行存储。

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace("&nbsp;","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么查找字符串是第几位php怎么查找字符串是第几位Apr 22, 2022 pm 06:48 PM

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구