你真的了解PHP中的引用符号()吗

admin3年前PHP教程53

引言

最近接手了五六年前的老项目,用的是CI2.0框架,在看框架源码的时候有个地方让我楞了一下,于是有了这篇文章。

字符&的最早历史可以追溯到公元1世纪,最早是拉丁语et (意为and)的连写。

&是指逻辑上表示两者属于缺一不可的关系,还表示意思是一个人和另外一个人之意,与and同义。

&在PHP项目中是经常使用的一个操作符, 例如按位与丶逻辑操作丶引用变量丶引用传递丶引用返回。

按位与

$a & $b 将把 $a 和 $b 中都为1的位设为1.

奇偶数判断

整数与1进行按位与运算,运算结果为1表示为奇数, 运算结果为0表示为偶数。例如:

 

十进制二进制51011001

 

6和1进行按位与&, 得到结果为0。

 

十进制二进制61101001

 

但是项目中我们都不会这么写, 都是使用n % 2 == 0, 因为奇偶性判断使用%的效率比较高,也比较容易理解。

用户权限判断

假设有个系统中有用户权限分配模块, 其权限设置如下:

 

权限名称权限值查看1新增2修改4删除8

 

那么存储该用户的权限不需要存储逗号分割的字符串1,2,4,8, 只需要存储一个整形:15即可。

如果用户1拥有新增丶查看丶修改权限, 那么需要存储的权限值为: 1+2+4=7。

如果用户2拥有所有权限, 那么需要存储的权限值为:1+2+4+8=15。

检查用户1是否有修改权限:7 & 4结果为4, 表示拥有修改权限。

检查用户2是否有删除权限:15 & 8结果为8, 表示拥有删除权限。

条件操作符

$a && $b只有$a和$b均为真,结果才为真。

引用变量

PHP的引用允许你用两个变量来指向同一个内容。无论对哪个变量名的值进行了修改,其他变量名访问的内容也会随之改变。

与C语言中的指针是有差别的。C语言中的指针里面存储的是变量的内容,在内存中存放的地址。


<?php
$a = 10;
$b = &$a;
$a = 11;
var_dump($a, $b); // 输出11, 11
$b = 12;
var_dump($a, $b); // 输出12, 12

foreach循环时加&符号会有什么问题? 例如以下代码能正常输出期望值吗?


<?php
 
$values = ['Python', 'Php', 'Go'];
 
foreach ($values as &$value)
{
    $value = strtoupper($value);
}
 
foreach ($values as $value){
    echo $value . PHP_EOL;
}

预期结果是: ['PYTHON', 'PHP', 'GO'] 实际结果是['PYTHON', 'PHP', 'PHP']。

这是因为第一次foreach中使用了引用, 使$value成为了引用变量, 并且$arr[2]和$value指向了同一个地址空间(共享变量值), 第二次foreach时, 不断的将$values中的值赋给$value, 导致$arr[2]的值也被修改了。

引用传递

可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。


/**
 * 对传入的值进行平方
 * Author: ClassmateLin
 * Email: classmatelin.site@gmail
 * Site: classmatelin.top
 * @param $n
 */
function f(&$n)
{
    $n *= $n;
}
 
$n = 2;
f($n);
var_dump($n); // 输出4

按值传递是需要对变量进行拷贝, 引用传递是同一内存空间。

如果是大型字符串或对象,那么使用引用传递比按值传递可以节省一些内存, 但是使用引用传递代码可读性稍微低点。

引用返回

函数的引用返回,在方法前加&符号定义。同时需要接收返回值也需要&, 否则将不起作用, 例如:


<?php
 
class Foo {
 
    public $value = 10;
 
    /**
     * 返回value, 引用返回, 对返回的值修改会影响到该值。
     * Author: ClassmateLin
     * Wechat: ClassmateLin_
     * Email: classmatelin.site@gmail
     * Site: classmatelin.top
     * @return int
     */
    public function &getValue()
    {
        return $this->value;
    }
 
}
 
$foo = new Foo();
 
$val1 = $foo->getValue();
$val1 = 11; // $val1没有用&接收,不是引用, 修改不会影响实例$foo的值.
var_dump($val1, $foo->getValue()); // 输出11, 10
 
 
$val2 = &$foo->getValue(); // $val2是引用
$val2 = 13;
var_dump($val2, $foo->getValue()); // 输出13, 13

总结

到此这篇关于PHP中引用符号(&)的文章就介绍到这了,更多相关PHP引用符号&内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。

相关文章

PHP中强制类型转换的示例详解

前言学过静态语言开发的朋友对类型转换不会陌生,比如Java、C#、C++等。静态语言的好处就是变量强制必须指定类型,这也是编译的要求,所以大部分编译型的语言都会有强制变量类型的要求。而PHP据说也会在...

影响韩国多IP服务器租用的因素有哪些租用韩国多IP服务器地址是多少

影响韩国多IP服务器租用的因素很多,以下是一些常见的影响因素:成本:韩国多IP服务器的租用价格通常比单个IP服务器更高,因此成本可能成为租用决策的关键因素。需求:需要运行的应用程序和服务数量、流量大小...

GPU服务器的种类有哪些泉州GPU服务器如何选择

对GPU服务器的分类,首先需要确定一个角度(维度)来对GPU服务器做分类。1、按GPU服务器外形分类。分为塔式GPU服务器、机架式GPU服务器1)塔式GPU服务器塔式GPU服务器机箱比较大,服务器的配...

香港拨号vps的价格受哪些因素影响

影响香港拨号vps价格的因素有:1、机房配置环境,服务商知名度越高,机房配置越好,香港拨号vps租用价格相对贵一些;2、香港拨号vps的配置,主机配置越高,价格越贵;3、香港拨号vps带宽配置,选择独...

TikTok跨境直播网络推荐!

TikTok是一款全球流行的短视频社交应用程序,它允许用户拍摄、编辑和分享15秒到1分钟的短视频。与此同时,TikTok也提供了直播功能,让用户可以与观众实时互动。如果你想在TikTok上进行直播,需...

游戏服务器租用的好处和缺点?美国电信100G高防服务器租用有哪些优势?

游戏服务器租用的好处和缺点?游戏服务器租用对于游戏玩家来说是非常重要的,因为有了游戏服务器我们才能玩上自己喜爱的网络游戏。那么什么是游戏服务器呢?其实很简单就是提供游戏的平台。比如:魔兽世界、剑灵、地...