php引用的意思

在PHP 中引用的意思是:不同的名字访问同一个变量内容。

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

1、变量的引用

PHP 的引用允许你用两个变量来指向同一个内容<?php

$a="ABC";

$b =&$a;

echo $a;//这里输出:ABC

echo $b;//这里输出:ABC

$b="EFG";

echo $a;//这里$a的值变为EFG 所以输出EFG

echo $b;//这里输出EFG

?>

2、函数的引用传递(传址调用)

传址调用我就不多说了 下面直接给出代码<?php

function test(&$a){

$a=$a+100;

}

$b=1;

echo $b;//输出1

test($b); //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了

echo "
";

echo $b;//输出101

?>

注意:上面的“ test($b); ” 中的$b前面不要加 & 符号,但是在函数“call_user_func_array”中,若要引用传参,就得需要 & 符号,如下代码所示:<?php

function a(&$b){

$b++;

}

$c=0;

call_user_func_array('a',array(&$c));

echo $c;

//输出 1

?>

3、函数的引用返回<?php

function &test(){

static $b=0;//申明一个静态变量

$b=$b+1;

echo $b;

return $b;

}

$a=test();//这条语句会输出 $b的值 为1

$a=5;

$a=test();//这条语句会输出 $b的值 为2

$a=&test();//这条语句会输出 $b的值 为3

$a=5;

$a=test();//这条语句会输出 $b的值 为6

?>

下面解释下:

通过这种方式$a=test();得到的其实不是函数的引用返回,这跟普通的函数调用没有区别 至于原因: 这是PHP的规定

PHP规定通过$a=&test(); 方式得到的才是函数的引用返回

至于什么是引用返回呢(PHP手册上说:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。)

4、对象的引用<?php

class a{

var $abc="ABC";

}

$b=new a;

$c=$b;

echo $b->abc;//这里输出ABC

echo $c->abc;//这里输出ABC

$b->abc="DEF";

echo $c->abc;//这里输出DEF

?>

在PHP5中 对象的赋值是个引用的过程。上列中$b=new a; $c=$b; 其实等效于$b=new a; $c=&$b;PHP5中默认就是通过引用来调用对象, 但有时你可能想建立一个对象的副本,并希望原来的对象的改变不影响到副本 . 为了这样的目的,PHP5定义了一个特殊的方法,称为__clone。

自 PHP 5 起,new 自动返回引用,因此在此使用 =& 已经过时了并且会产生 E_STRICT 级别的消息。

在php4中,对象的赋值是个拷贝过程,如:$b=new a,其中new a产生的是一个匿名的a对象实例,而此时的$b是对这个匿名对象的拷贝。同理$c=$b,也是对$b内容的一个拷贝。所以在php4中,为了节省内存空间,$b=new a 一般会改成引用的模式,即 $b=& new a。

下面再来个 官方 提供的例子:

在php5中,你不需要额外添加什么东西就可到达“对象引用”的功能:<?php

class foo{

protected $name;

function __construct($str){

$this->name = $str;

}

function __toString(){

return 'my name is "'. $this->name .'" and I live in "' . __CLASS__ . '".' . "\n";

}

function setName($str){

$this->name = $str;

}

}

class MasterOne{

protected $foo;

function __construct($f){

$this->foo = $f;

}

function __toString(){

return 'Master: ' . __CLASS__ . ' | foo: ' . $this->foo . "\n";

}

function setFooName($str){

$this->foo->setName( $str );

}

}

class MasterTwo{

protected $foo;

function __construct($f){

$this->foo = $f;

}

function __toString(){

return 'Master: ' . __CLASS__ . ' | foo: ' . $this->foo . "\n";

}

function setFooName($str){

$this->foo->setName( $str );

}

}

$bar = new foo('bar');

print("\n");

print("Only Created \$bar and printing \$bar\n");

print( $bar );

print("\n");

print("Now \$baz is referenced to \$bar and printing \$bar and \$baz\n");

$baz =& $bar;

print( $bar );

print("\n");

print("Now Creating MasterOne and Two and passing \$bar to both constructors\n");

$m1 = new MasterOne( $bar );

$m2 = new MasterTwo( $bar );

print( $m1 );

print( $m2 );

print("\n");

print("Now changing value of \$bar and printing \$bar and \$baz\n");

$bar->setName('baz');

print( $bar );

print( $baz );

print("\n");

print("Now printing again MasterOne and Two\n");

print( $m1 );

print( $m2 );

print("\n");

print("Now changing MasterTwo's foo name and printing again MasterOne and Two\n");

$m2->setFooName( 'MasterTwo\'s Foo' );

print( $m1 );

print( $m2 );

print("Also printing \$bar and \$baz\n");

print( $bar );

print( $baz );

?>

推荐视频教程:PHP视频教程

php引用是什么,php引用是什么相关推荐

  1. C++ 笔记(15)— 引用(声明引用、引用作为参数、引用作为函数返回值、const 用于引用)

    引用是变量的别名.也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量. 1. 创建引用 要声明引用,可使用引用运算符 & ,如下面的 ...

  2. java强引用弱引用_Java 的强引用、弱引用、软引用、虚引用

    1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object(); // 强引用 当内存空间 ...

  3. 2020-09-22C++学习笔记之引用1(1.引用(普通引用)2.引用做函数参数 3.引用的意义 4.引用本质5.引用结论 6.函数返回值是引用(引用当左值)7测试代码)

    2020-09-22C++学习笔记之引用1(1.引用(普通引用)2.引用做函数参数 3.引用的意义 4.引用本质5.引用结论 6.函数返回值是引用(引用当左值)7测试代码) 1.引用(普通引用) 变量 ...

  4. java 静态内部类 弱引用_Java基础 强引用、弱引用、软引用、虚引用

    前言 在ThreadLocal源码中,其中嵌套类ThreadLocalMap中的Entry继承了WeakReferenc.Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决 ...

  5. 15.赋值运算符为什么返回类的引用?不是引用怎么办?

    赋值运算符为什么返回类的引用?不是引用怎么办? class string{public:string(const char *str=NULL);string(const string& st ...

  6. java 软引用_Java中弱引用和软引用的区别以及虚引用和强引用介绍

    知道弱引用和软引用的概念与如何使用它们是两码事,引用类在垃圾回收工作的过程中有重要作用.我们都知道垃圾回收器会回收符合回收条件的对象的内存,但并不是所有的程序员都知道回收条件取决于指向该对象的引用类型 ...

  7. Visual studio那些破事。。。(生成静态库、生成动态库、引用静态库、引用动态库)

    共4个小步骤,每个小步骤你都可以新建个VS解决方案,自己跟着步骤跑一下,windows怎么[生成静态库.生成动态库.引用静态库.引用动态库]你就基本明白了@! 文章目录 1.导出静态库.lib(add ...

  8. java符号引用 直接引用_JVM的符号引用和直接引用

    [导读]在JVM中类加载过程中,在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用. 在JVM中类加载过程中,在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用 ...

  9. c++引用专题之常引用

    引用专题之常引用 常引用 使用变量初始化const引用 案例1 案例2 使用字面量常量初始化const引用 综合案例 const引用结论 综合练习 常引用 下面开始进入const引用难点 使用变量初始 ...

  10. c++引用专题之普通引用

    引用专题之普通引用 引用(普通引用) 引用概念 引用是C++的概念 引用做函数参数 引用的意义 引用本质思考 引用的本质 引用结论 函数返回值是引用(引用当左值) 指针引用 引用(普通引用) 变量名回 ...

最新文章

  1. NumPy — 创建全零、全1、空、arange 数组,array 对象类型,astype 转换数据类型,数组和标量以及数组之间的运算,NumPy 数组共享内存
  2. 批量修改所有服务器的dbmail配置
  3. Android开发之如何在debug模式下打出release正式包
  4. MySQL 批量生成 SQL 脚本语句解决实际的业务需求/如何拼接字符串/拼接字符串的 SQL 语句
  5. 如何升级Linux内核(RHEL/Fedora/CentOS升级内核 Debian/Ubuntu升级内核)
  6. SpringCloud工作笔记085---SpringBoot项目中防止跨站脚本攻击功能添加
  7. go 公众号 关注 监听_golang微信公众平台之消息接入
  8. 18.高性能MySQL --- 大文件传输
  9. 如何在Delphi TImageList 中使用 透明 png 图标
  10. Grails集成Quartz插件实现定时任务(Job)
  11. 2010年中国城市人均GDP排名
  12. 软件原型设计工具Axure
  13. Win7 没有声音的解决方法
  14. 云计算时代运维的出路在哪?
  15. ps怎么抠地图线路_用PS怎么抠地图?
  16. 友盟+全面解析ios 卡顿问题
  17. 与网友“阵春风”交流
  18. PHP - AES 加密解密
  19. Excel催化剂开源第31波-pdf相关功能实现及类库介绍
  20. CVPR 2018 论文解读集锦

热门文章

  1. 多功能监护系统开发与设计
  2. C++Primer:函数(参数传递:引用形参)
  3. [Medical Image Process] 3.2 GrayScale Morphology(灰阶图像形态学及基本运算)
  4. VirtualBox虚拟机中Ubuntu11.10安装Additions出现 读写错误的解决办法
  5. VS2008 ,TFS2008破解序列号
  6. 程序员面试系列——合并排序(递归实现)
  7. 汽车车牌识别系统实现(四)--字符识别+代码实现
  8. Hi3516A开发--RTC电路
  9. windows下部署oracle11,windows下配置oracle11g的dataguard
  10. oracle 日志的容量,oracle 11g 更改日志组大小