关于php的引用
前言
<?php
$arr =[3,4,5,12,8];
sort($arr);//对数组排序
var_dump($arr);//打印排序后的数组
$str ="仙士可牛逼!";
$str = mb_substr($str,0,3);//剪切字符串
var_dump($str);
以上代码,分别为数组排序以及字符串截取,它们之间毫无关联,放在一起的主要原因就在于:
sort不会返回处理后的数据,而是直接修改了变量的值,mb_substr 却需要返回值来获取函数处理后的值
大多数情况下,我们封装函数,都是使用的mb_substr的方式,返回处理结果
那么,sort是怎么实现的呢?
php引用
php引用,允许你使用多个变量访问同一部分内容,这个类似于c语言指针,但却不能做指针计算.通常使用&进行声明引用变量,例如:
<?php
$a = 1;
$b = &$a;//b的值为引用a的数据
$a=2;
var_dump($b);//b也变成了2
注意,$b = &$a 的意思不是$b指向了$a,而是$a和$b同时指向了同一内存
<?php
function &foo(){ //声明函数将返回一个引用值
return $GLOBALS['a'];//返回$GLOBALS['a']
}
$GLOBALS['a']=1;
$a = foo();
//$a = &foo();
$a = 2;
var_dump($GLOBALS['a']);
函数返回引用跟变量引用差不多,只是函数引用将返回一个变量,然后在声明时增加引用
php的类引用
在php5之后,php的类将自动返回引用,无需自动调用:
<?php
class test{
public $a;
public $b;
public function __construct($a,$b)
{
$this->a= $a;
$this->b= $b;
}
}
$testa = new test(1,2);
//$testa = &new test(1,2);
$testb = $testa;
$testb->a = 3;
$testb->b = 4;
var_dump($testa->a,$testa->b);//3,4
当你new一个对象之后,不管赋值多少个变量,所有变量都将指向于同一个对象.
如果你需要复制一个对象不再指向同一个,请使用clone方法进行克隆对象
销毁引用
可回去查看 php的垃圾回收机制
<?php
$a = 1;
$b = &$a;//引用
$b = 2;//赋值
unset($b);//unset,是引用计数-1,不会影响a的值
var_dump($a);//2
可看出,unset只会删除变量与变量值的关联,但不会真正销毁$a的数据,同理,如果unset($a),$b也不会受到影响
<?php
$a = 1;
$b = &$a;//引用
$b = 2;//赋值
$b = null;//直接更改内存数据为null,$a,$b都将释放原有内存
var_dump($a);//null
var_dump($b);//null
引用使用场景
在文章开头有提到过,sort是使用引用传递变量,直接修改数组数据,达到函数处理效果.
那么我们应该用引用吗?
引用并不会加快程序执行,还可能会使代码可读性降低,但如果你有类似于sort函数,对某些数据需要处理,并且处理前的数据没有任何使用意义时,可以使用引用.
当然,本身php类传递,就已经在用引用方案了,例如 $model->where(['xx'=>'xx']),所以,我们可以放心使用引用,该用就用
本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn
- 徐扬生:与机器人共建未来社会
- Aerospike在实时竞价广告中的应用
- objective-C 的Hello World!
- objective-C 的代码文件组织
- objective-C 的OOP(上)--类定义、继承及方法调用
- jQuery打造智能提示插件二(可编辑下拉框)
- Nicholas Christakis:朋友多是由基因决定的?
- WPF中的MatrixTransform
- kvm虚拟化管理平台WebVirtMgr部署-虚拟化环境安装-完整记录(0)
- ruby学习笔记(3)--语法层面的先见之明
- jQuery操作Select
- ruby学习笔记(11)--symbol与hash参数
- zabbix监控-基本原理介绍
- OpenStack构架知识梳理
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 读者问:小林怎么学操作系统和计算机网络呀?
- 用Python搭建一个简单的代理池
- 用Python模拟登陆GitHub并获取信息
- APUE学习手札 编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理
- Python教程 | 最标准的地图调用方式(国家测绘局提供数据)
- Python数据可视化:Python大佬有哪些?
- 新手一看就懂的线程池
- 「面试」破(B)站之旅
- 想过为你的应用加上skywalking(链路监控)吗?
- 结合注意力机制的UNet降水短临预报框架
- 用Python全自动下载抖音视频!
- 如何实现一个高效的启发式算法?
- Python数据可视化:豆瓣电影TOP250
- 容器化 FRP 使用方案
- 任意图像转素描:Python分分钟实现