关于php的引用

简介: 关于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']),所以,我们可以放心使用引用,该用就用

目录
相关文章
|
5月前
|
存储 安全 关系型数据库
安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用&后台模块&Session&Cookie&Token&身份验证&唯一性
安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用&后台模块&Session&Cookie&Token&身份验证&唯一性
|
6月前
|
PHP
PHP反序列化--引用
PHP反序列化--引用
|
PHP
PHP实现自制随机图片API- 调用文件夹和引用网络图片
PHP实现随机图片API- 调用文件夹和引用网络图片
202 0
|
11月前
|
PHP
今天遇到有趣的php引用题目
今天遇到有趣的php引用题目
33 0
|
11月前
|
PHP Python
关于python变量的再次折腾,没有PHP的引用赋值
今天,重看php文档的时候,发现了这样的讲法
35 0
|
数据库连接 PHP 数据库
PHP的引用操作符& 的使用及注意事项
PHP的引用操作符& 的使用及注意事项
PHP 中的引用赋值运算符
PHP 中的引用赋值运算符
|
存储 SQL 前端开发
PHP对象的引用及对象优化策略
当PHP5的出现面向对象思想,我们在构造PHP程序时候就有了对程序的新的总结,把对象特性封装到类,特别是当PHP框架应用到实际项目中,构造类的对象和调用类对象出现了很大的讲究。
|
Unix PHP
搞定PHP面试 - 深入了解引用
1. 什么是引用 在 PHP 中引用是指用不同的名字访问同一个变量内容。 PHP 中的变量名和变量内容是不一样的, 因此同样的内容可以有不同的名字。 最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的硬链接。 PHP 中的引用并不像 C 的指针:例如你不能对他们做指针运算。引用并不是实际的内存地址,而是符号表别名。
|
Serverless PHP 数据格式
函数计算PHP 变量不存在无法引用和判断的解决方案
最近研究了函数计算,很不错的服务,总结一个php存在的一个问题,为以后的小白们避免同样的错误。 <?php use RingCentral\Psr7\Response; function initializer($context) { echo 'initializing' .
15780 0