广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >你真的了解PHP中的引用符号(&)吗
  • 334
分享到

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

2024-04-02 19:04:59 334人浏览 独家记忆
摘要

引言 最近接手了五六年前的老项目,用的是CI2.0框架,在看框架源码的时候有个地方让我楞了一下,于是有了这篇文章。 字符&的最早历史可以追溯到公元1世纪,最早是拉丁语et

引言

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

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

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

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

按位与

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

奇偶数判断

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

十进制 二进制
5 101
1 001

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

十进制 二进制
6 110
1 001

但是项目中我们都不会这么写, 都是使用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]的值也被修改了。

引用传递

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



function f(&$n)
{
    $n *= $n;
}

$n = 2;
f($n);
var_dump($n); // 输出4

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

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

引用返回

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


<?php

class Foo {

    public $value = 10;

    
    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引用符号&内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 你真的了解PHP中的引用符号(&)吗

本文链接: https://www.lsjlt.com/news/125755.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 你真的了解PHP中的引用符号(&)吗
    引言 最近接手了五六年前的老项目,用的是CI2.0框架,在看框架源码的时候有个地方让我楞了一下,于是有了这篇文章。 字符&的最早历史可以追溯到公元1世纪,最早是拉丁语et ...
    99+
    2022-11-12
  • C++的运算符你真的了解吗
    目录前言1 算术运算符2 赋值运算符3 比较运算符4 逻辑运算符总结前言 运算符的作用:用于执行代码的运算 主要有: 1 算术运算符 用于处理四则运算 对于前置递增:将递增运算前...
    99+
    2022-11-13
  • C 语言的弱符号与弱引用你了解吗
    目录C语言中的__attribute__((weak)) 与 attribute ((weakref())弱符号弱符号的作用与示例弱引用测试代码1:测试代码2:总...
    99+
    2022-11-13
  • 你真的了解Go语言的索引吗?
    Go语言是一门由Google开发的编程语言,它具有高效、简洁、并发等特性,被广泛应用于Web开发、云计算、网络编程等领域。在Go语言中,索引是一个常用的操作,它可以帮助我们快速定位到某个元素,提高程序运行效率。但是,在本文中,我们将深入探讨...
    99+
    2023-08-23
    索引 unix bash
  • 你真的了解Java中NumPy的索引机制吗?
    Java中的NumPy是一种非常强大的数组处理工具,它可以帮助我们高效地处理大量的数据。在Java中,NumPy的索引机制是非常重要的一个概念,它可以帮助我们快速地定位和获取数组中的数据。本文将深入探讨Java中NumPy的索引机制,帮助读...
    99+
    2023-05-26
    numy numpy 索引
  • C++重载运算符你真的了解吗
    目录1.重载运算符的必要性2.重载运算符的形式与规则3.重载运算符的运算4.转义运算符总结运算符实际上是一个函数,所以运算符的重载实际上是函数的重载,。编译程序对运算符的重载的选择,...
    99+
    2022-11-13
  • C++字符串类的封装你真的了解吗
    目录字符串类的封装常规代码头文件函数实现文件Test文件重载左移>>重载右移<<重载赋值=重载中括号[ ]重载加号+重载==总结字符串类的封装 常规代码 头文...
    99+
    2022-11-13
  • 你真的了解Java实时重定向索引吗?
    Java实时重定向索引是一种高效的数据结构,其可以让我们在不停止应用程序的情况下,快速地更新和查询数据。然而,很多开发者并不了解这个特性,下面我们就来深入了解一下Java实时重定向索引。 什么是Java实时重定向索引? Java实时重定...
    99+
    2023-09-21
    实时 重定向 索引
  • Golang中的泛型你真的了解吗
    目录什么是泛型为什么需要泛型泛型语法类型参数类型集类型推断总结Golang 在 1.18 版本更新后引入了泛型,这是一个重要的更新,Gopher 万众瞩目,为 Golang 带来了更...
    99+
    2023-05-20
    Golang泛型用法 Golang泛型学习 Golang泛型 Go 泛型
  • python的运算符与表达式你真的了解吗
    目录一、表达式二、运算符1、算术运算符2、赋值运算符3、比较运算符4、逻辑运算符5、成员关系运算6、对象实例测试7、位运算8、一元运算 :三、python运算符优先级 1、...
    99+
    2022-11-12
  • 你真的了解 PHP 面试和 JavaScript npm 吗?
    PHP和JavaScript是两种广泛应用于前端和后端的编程语言。由于其强大的功能和灵活性,它们在现代Web开发中已成为不可或缺的部分。在这篇文章中,我们将深入探讨PHP面试和JavaScript npm,以帮助您更好地了解它们的特点和用法...
    99+
    2023-09-17
    面试 javascript npm
  • 你真的了解 Python 在 Linux 中的应用吗?
    Python 是一种高级编程语言,被广泛应用于各种软件开发和数据科学领域。在 Linux 操作系统中,Python 更是成为了必不可少的工具。在本文中,我们将探讨 Python 在 Linux 中的应用,并演示一些常见的代码示例。 Pyth...
    99+
    2023-09-07
    linux shell leetcode
  • 你真的了解IP地址吗?
    本文已收录于专栏 ⭐️ 《计算机网络》⭐️ 学习指南: IP协议基本认识分类地址多播地址 无分类地址划分方式子网掩码 IP 分片与重组IPv6基本认识IPv4 首部与 ...
    99+
    2023-09-09
    tcp/ip 网络 服务器 网络协议 ip
  • 你真的需要了解Bash吗?
    Bash是一种强大的命令行解释器,它是Linux和macOS操作系统上的默认Shell。尽管它是如此重要,但很多人并不了解Bash的实际用途。在本文中,我们将探讨Bash的重要性以及它如何帮助我们更好地管理和控制计算机系统。 Bash是什么...
    99+
    2023-08-15
    path bash http
  • java的泛型你真的了解吗
    目录泛型的概述和优势自定义泛型类自定义泛型方法自定义泛型接口泛型通配符、上下限总结泛型的概述和优势 泛型概述 泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检...
    99+
    2022-11-13
  • 关于Java Object你真的了解了吗
    导读: 在平时的coding中hashCode()和equals()的使用的场景有哪些?clone深复制怎么实现?wait()和notify()有什么作用?finalize()方法干嘛的?看似coding中使用的不多,不重要,但是有没有跟我...
    99+
    2023-05-31
    java object ava
  • C++中的函数你真的理解了吗
    目录1 概述2 函数的定义及调用3 值传递4 函数的常见形式5 函数的声明6 函数的分文件编写作用:让代码结构更加清晰1.2.3.4.总结1 概述 作用:将一段经常使用的代码进行封装...
    99+
    2022-11-13
  • C++中的数组你真的理解了吗
    目录1 概述2 一维数组2.1 一维数组定义方式2.2 一维数组组名2.3 冒泡排序3 二维数组3.1 二维数组定义方式3.2 二维数组数组名3.3二维数组应用举例总结1 概述 所谓...
    99+
    2022-11-13
  • python3中的类继承你真的了解吗
    目录(1)首先使用直接继承的方式(2)在子类中定义属性(3)如果想要继承父类中的属性,一般使用super方法:(4)如果需要在子类的__init__中传入参数则可以这样使用:&nbs...
    99+
    2022-11-13
  • 你真的了解 PHP 关键字 API 容器吗?
    PHP 是一种广泛使用的服务器端脚本语言,由于其易学易用的特性,它已经成为了众多 Web 开发者的首选语言。而在 PHP 中,有一些关键字,比如 API 和容器,它们在开发中也扮演着非常重要的角色。本文将详细介绍这两个关键字,帮助读者更好地...
    99+
    2023-10-25
    关键字 api 容器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作