当前位置: 首页 > news >正文

php 函数变量 前加,php在函数和变量前面加上@和$符号的区别详解

@ 运算符只对表达式有效。对新手来说一个简单的规则就是:如果能从某处得到值,就能在它前面加上 @ 运算符。例如,可以把它放在变量,函数和 include() 调用,常量,等等之前。不能把它放在函数或类的定义之前,也不能用于条件结构例如 if 和 foreach 等。

目前的“@”错误控制运算符前缀甚至使导致脚本终止的严重错误的错误报告也失效。这意味着如果在某个不存在或类型错误的函数调用前用了“@”来抑制错误信息,那脚本会没有任何迹象显示原因而死在那里。

对于$ 则是我们的重点问题

基本形式:function &find_var($param) //这里用&在对象前面,作用为声明

{

/* ...code... */

return $found_var;

}

$foo =& find_var($bar); //这里用&,作用为联系变量

$foo->x = 2; //赋值给函数

例子:function &test()

{

static $b=0;//申明一个静态变量

$b=$b+1;

echo $b;

return $b;

}

$a=test();//这条语句会输出$b的值为1,

$a=5;

$a=test();//这条语句会输出$b的值为2 ,因为没有引用返回,$a=5,不对对象起赋值作用

$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函数前面加&符号有什么作用呢?

php变量前面加&符号是什么意思

先看一个示例:$foo = 321;

$bar = &$foo;

$bar = 123;

print $foo;

//那么输出的结果将会是什么呢

改动新的变量将影响到原始变量,这种赋值操作更加快速。

注意:只有命名变量才可以传地址赋值,就是说,改变了$bar的值,也就改变了$foo的值了。

另一个例子:$_GET[1] = 1;

function &a()

{

$a = $_GET[1];

return $a;

}

$x =& a();

$x = 'MoontoC';

echo $_GET[1]; // 此时这里会显示 MoontoC, 而不是最初赋值的1

你明白其中的意义了吗, 使用函数传值时必须双方都使用引用符号才有意义,才能真正引用, 而任何一边少了引用符号, 都不会得到错误的内容, 但内容是传值, 而不是传引用了。没有程序基础的人最初学php的确很难理解传值和传引用的重要性, 觉得反正都能得到自己要的东西, 其实不是的, 很多时候虽然得到的东西一样, 但是代价却完全不一样, 一个长达200万字的值, 被当作值传送就是400万字同时放在内存中待用, 多耗费一倍内存的意思,而传引用就只是一个快捷方式传送过去而已。

相关文章:

  • 凸函数与简森不等式(Jensen's inequality)
  • php date参数n,总结PHP date()参数列表
  • 小程序自定义函数—数字千位转换
  • tp3.2.3php环境要求,TP3.2.3开发手册
  • 控件模板
  • php 热点,PHP+jQuery实现中国地图热点数据统计展示效果
  • phpspy.php,一款php后门 phpspy的情况
  • Appium 之处理首次启动手机App时的系统权限弹框
  • 体对角线 matlab,Matlab计算结果显示求不出精确解
  • 数据库ACID操作---事务四原则
  • php html转pdf 简书,Laravel Html 导出 PDF 方案 ----- wkhtmltopdf laravel-snappy
  • aps.net的身份证背景图片
  • matlab怎么画lnx图像,inx图像(lnx的图像函数)
  • matlab计算结果中特别长,matlab运算结果太长Output truncated. Text exceeds maximum line length o......
  • java之注解
  • (三)从jvm层面了解线程的启动和停止
  • @jsonView过滤属性
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • android 一些 utils
  • Angularjs之国际化
  • Java Agent 学习笔记
  • laravel5.5 视图共享数据
  • Linux CTF 逆向入门
  • Map集合、散列表、红黑树介绍
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Vue2.0 实现互斥
  • 给Prometheus造假数据的方法
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 前嗅ForeSpider教程:创建模板
  • 系统认识JavaScript正则表达式
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • $ git push -u origin master 推送到远程库出错
  • (1) caustics\
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .CSS-hover 的解释
  • .gitattributes 文件
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET Core 项目指定SDK版本
  • .NET 发展历程
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NET使用存储过程实现对数据库的增删改查
  • @RequestParam详解
  • [ C++ ] STL_list 使用及其模拟实现
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [BZOJ 4034][HAOI2015]T2 [树链剖分]
  • [C++] sqlite3_get_table 的使用
  • [EFI]Dell Inspiron 15 5567 电脑 Hackintosh 黑苹果efi引导文件
  • [HackMyVM]靶场Crossbow
  • [javaSE] GUI(事件监听机制)