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

admin3年前PHP教程52

引言

最近接手了五六年前的老项目,用的是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方法参数的那一些事

前言在所有的编程语言中,方法或者函数,都可以传递一些参数进来进行业务逻辑的处理或者计算。这没什么可说的,但是在PHP中,方法的参数还有许多非常有意思的能力,下面我们就来说说这方面的内容。引用参数涉及到...

7款本地PHP服务器环境搭建工具推荐

通常在开发PHP程序时,需要用到服务器环境来调试自己的页面。有时候仅仅是为了学习PHP程序开发,如果是出于这样的理由去购买一个空间或者服务器是完全没必要的。本文推荐7款目前主流的PHP环境搭建工具,可...

浅谈Laravel中使用Slack进行异常通知

目录概述安装 maknz/slack-laravel 包配置调整 AppExceptionsHandler 类的 report 方法概述通常,我们可以依靠用户反馈、经常查看程序日志来发现程序存在的问题...

PHP解决高并发问题(opcache)

php高并发之opcache今天工作的时候接触到客户的一台服务器,业务逻辑比较简单 。估算pv在120w左右吧,用的是阿里云2c4g的服务器。一大早就开始卡顿了,登陆服务器后查看负载到了八九十。之后就...

韩国服务器租用哪个机房好用

韩国服务器租用哪个机房好用?选择一个好用的韩国服务器租用机房需要考虑多方面的因素,以下是一些可以参考的方法和指标:可靠性:选择一个可信赖的机房十分重要,因为如果机房出现故障或停电等问题,服务器将无法正...

台湾多ip服务器能建多少个网站

台湾多IP服务器能建立多少个网站取决于多种因素,例如服务器类型、服务器配置、网站类型和流量等级等。对于共享服务器和虚拟专用服务器,通常可以建立多个网站。具体数量取决于服务器的配置和流量限制。但是,建立...