>  기사  >  백엔드 개발  >  PHP 인용문의 의미와 사용법

PHP 인용문의 의미와 사용법

墨辰丷
墨辰丷원래의
2018-06-13 10:22:581374검색

이 기사는 예제와 함께 매우 자세한 방식으로 모든 사람에게 PHP에 대한 참조를 보여줍니다. 매우 좋은 기사이며 참조가 필요한 친구에게 권장됩니다.

인용문이란 무엇인가요?

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

참조의 역할

PHP의 참조를 사용하면 두 변수가 동일한 내용을 가리킬 수 있습니다. 이 작업을 수행할 때의 의미는 다음과 같습니다.

코드는 다음과 같습니다.

<?php
$a =& $b;
?>

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

참고:

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

참고:

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

참고:

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

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

코드는 다음과 같습니다.

<?php
function foo(&$var) { }
foo($a); // $a is "created" and assigned to null
$b = array();
foo($b[&#39;b&#39;]);
var_dump(array_key_exists(&#39;b&#39;, $b)); // bool(true)
$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, &#39;d&#39;)); // bool(true)
?>

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

코드는 다음과 같습니다.

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

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

참고:

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

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

경고

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

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

코드는 다음과 같습니다.

<?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 &#39;$var2&#39;\n"; // var2 is set to &#39;&#39;
global_references(true);
echo "var2 is set to &#39;$var2&#39;\n"; // var2 is set to &#39;Example variable&#39;
?>

global $var;를 $var =& $GLOBALS['var'];의 약자로 처리합니다. 따라서 $var에 다른 참조를 할당하면 지역 변수에 대한 참조만 변경됩니다.
참고:

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

예제 #3 참조 및 foreach 문

코드는 다음과 같습니다.

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

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

코드는 다음과 같습니다.

<?php
function foo(&$var){
    $var++;
    }
$a=5;foo($a);
?>

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

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

참조가 아닌 것

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

코드는 다음과 같습니다.

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

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

참조로 전달

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

코드는 다음과 같습니다.

<?php
function foo(&$var)
{
    $var++;
}
$a=5;
foo($a);
// $a is 6 here
?>

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

다음은 참조로 전달될 수 있습니다.

변수(예: foo($a))
새 문(예: foo(new foobar()))
함수에서 반환된 참조(예:

코드는 다음과 같습니다. :

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

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

코드는 다음과 같습니다.

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

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

引用返回
引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。不要用返回引用来增加性能,引擎足够聪明来自己进行优化。仅在有合理的技术原因时才返回引用!要返回引用,使用此语法:

代码如下:

<?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.
?>

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

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

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

代码如下:

<?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
?>

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

取消引用

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

代码如下:

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

不会 unset $b,只是 $a。

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

引用定位

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

global 引用

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

代码如下:

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

这意味着,例如,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:如果有下面的代码

代码如下:

<?ph
$a="ABC";
$b=$a;
?>

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

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

代码如下:

$a="EFG";

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

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

相关推荐:

php实现去除字符串中空字符的方法

PHP实现批量生成各种尺寸Logo的方法

PHP中array_fill函数定义多维数组的方法

위 내용은 PHP 인용문의 의미와 사용법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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