php中引用&的真正理解-变量引用、函数引用、对象引用
web PHP 2019-03-27 2140 0
关于本站

“最难不过坚持”

本人承接扒站仿站,php网站维护,病毒查杀,网站编辑,网站改版,html制作

有需要网站维护,改版,病毒查杀,网站编辑,网站备案,html制作等相关的工作可以联系我。
本人有多年相关工作经验,也可提供免费咨询,交个朋友。
有需要探讨问题的朋友,也可以加我微信,共同探讨!
微信:15011482830 QQ:408917339

7439509 2655 39
最新评论
https://jueru.net/
评 留言
:weixiao:
评 留言
:shuijiao: :weiqu: :zhenbang: :leng:
评 留言
:yiwen: :yiwen: :yiwen: :yiwen:
评 EasySass: could not generate CSS file. See Output panel for details.
这个业务逻辑多少都有点奇怪了,阅读浏览次数增值在新闻详情页的控制器方法里setInc,这怎么还写进模型事件里了。如果非要用onAfterRead也可以,把新闻文章的内容单独分出来一个news_content表,然后把它和news做关联,然后给news_content表的onAfterRead事件做增值处理,这样点进新闻页内查询到文章内容时才会触发它。
评 TP6模型事件-查询后onAfterRead不好用
文章标签更多
ThinkPHP (254)
Mysql (58)
DedeCms (33)
jQuery (67)
证件照 (1)
setInc (4)
setDec (4)
onclick (5)
打开边栏(ESC) 关闭边栏(ESC)

php的引用(就是在变量或者函数、对象等前面加上&符号) 

最重要就是 删除引用的变量 ,只是引用的变量访问不了,但是内容并没有销毁

在PHP 中引用的意思是:不同的名字访问同一个变量内容.

变量的引用
PHP 的引用允许你用两个变量来指向同一个内容 

<?php
$a = "ABC";
$b = &$a;
echo $a; //这里输出:ABC 
echo $b; //这里输出:ABC 
$b = "EFG";
echo $a; //这里$a的值变为EFG 所以输出EFG 
echo $b;//这里输出EFG 
?>
函数的传址调用
传址调用我就不多说了 下面直接给出代码
<?php
function test(&$a) {
    $a = $a + 100;
} 
$b = 1;
echo $b; //输出1 
test($b);   //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了 
echo "<br>"; 
echo $b;//输出101
?>
要注意的是,在这里test(1);的话就会出错,原因是:PHP规定传递的引用不能为常量(可以看错误提示)。


函数的引用返回
先看代码

<?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();得到的其实不是函数的引用返回,这跟普通的函数调用没有区别 
至于原因: 这是PHP的规定,PHP规定通过$a=&test(); 方式得到的才是函数的引用返回 
至于什么是引用返回呢(PHP手册上说:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。) 这句狗屁话 害我半天没看懂
用上面的例子来解释就是 $a=test()方式调用函数,只是将函数的值赋给$a而已,而$a做任何改变,都不会影响到函数中的$b,而通过$a=&test()方式调用函数呢, 他的作用是将return $b中的$b变量的内存地址与$a变量的内存地址指向了同一个地方,即产生了相当于这样的效果($a=&b;),所以改变$a的值也同时改变了$b的值。所以在执行了 $a=&test(); $a=5; 以后,$b的值变为了5
这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中
对象的引用



<?php
class a {
    var $abc = "ABC";
} 
$b = new a;
$c = $b;
echo $b->abc; //这里输出ABC 
echo $c->abc; //这里输出ABC 
$b->abc = "DEF";
echo $c->abc; //这里输出DEF
?>
以上代码是在PHP5中的运行效果 在PHP5中 对象的复制是通过引用来实现的。上列中$b=new a; $c=$b; 其实等效于$b=new a; $c=&$b; PHP5中默认就是通过引用来调用对象, 但有时你可能想建立一个对象的副本,并希望原来的对象的改变不影响到副本 . 为了这样的目的,PHP定义了一个特殊的方法,称为__clone. 


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

取消引用 

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


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


不会 unset $b,只是 $a。 


<?php 
function quoteTest(){ 
	global $var ; //相当于 $var = &$GLOBALS['var']; 
	unset($var); //删除只是删除引用,而引用的内容还存在,同上这并不意味着变量内容被销毁了
}
$var = 1;
quoteTest();
echo $var; //  结果 1
?>



<?php 
function quoteTest(){ 
	global $var ; //相当于 $var = &$GLOBALS['var']; 
	$var = 5; //因为他们都指向 同一内存内容
}
$var = 1;
quoteTest();
echo $var; //结果 5
?>


'&' 这就是引用

 

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

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

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

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

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

通俗的讲 1:如果有下面的代码 [php] $a="ABC"; $b=$a; [/php] 其实此时 $a与$b都是指向同一内存地址 而并不是$a与$b占用不同的内存

2:如果在上面的代码基础上再加上如下代码 [php] $a="EFG"; [/php] 由于$a与$b所指向的内存的数据要重新写一次了,此时Zend核心会自动判断 自动为$b生产一个$a的数据拷贝,重新申请一块内存进行存储


版权声明:本篇文章来源于网络。 来源链接

相关推荐
php实现ZIP压缩文件解压缩,中文乱码解决方法(重要)
PHP | 2019-04-30 6233
直接上代码,具体代码里面都有注释。直接中文压缩文件解压到中文文件夹。 <?php // 需开启配置 php_zip.dll // phpinfo(); header("Content-type:text/html;charset=utf-8"); /* * $filename 被解压文件名 * $path 解压...
openssl_private_decrypt解密失败
PHP | 2019-01-16 6012
复制别人的解密程序,原程序可以解密,复制过来就不可以 一步步尝试发现,秘钥换行符有区别, 原秘钥有换行符,复制过来不知道什么时候把换行符清空了,成了一行字符串了。
评论:0条
评论加载中...
发表评论