php引用

php引用允许两个变量指向同一个内容。意思是,当这样做时

<?php

$a=&$b;

?>
意味着$a与$b指向同一变量,这并不是$a指向了$b或者相反,而是$a和$b指向了同一地方

如果对一个未定义的变量进行引用赋值、引用参数传递或引用返回,则会自动创建给变量

例子:

<?php

function foo(&$var){

        

}

var_dump(foo($a));//null引用赋值

$b=array();

foo($b['b']);

var_dump(array_key_exists('b',$b));//bool(true) 引用参数传递

?>

引用可以用在函数中。它返回引用,以及用在new运算符中

<?php

$foo=& myFunction($bar);

?>

 

注意:

如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免

例子:

<?php

$var1='hello';

$var2='';

 

function global_reference($globals){

         global $var1,$var2;

         if(!$globals){

                   $var2=& $var1;

         }else{

                   $GLOBALS['var2']=& $var1;

         }

}

//global_reference(false);

//echo "var2 is set to ".$var2;//var2 is set to global关键字只在函数内部全局

global_reference(true);

echo "var2 is set to".$var2;//var2 is set tohello $GLOBALS 变量全局使用

?>

如果在 foreach 语句中给一个具有引用的变量赋值,被引用的对象也被改变

 

<?php

$ref=0;

$row=& $ref;

foreach(array(1,2) as $row){

 

}

echo $ref;//2

?>

 

引用做的第二件事是:引用传递变量

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

function foo(&$var){

         $var++;

}

$a=4;

foo($a);

echo $a;//5

?>

注意在函数调用时没有引用符号——只有函数定义中有。光是函数定义就足够使参数通过引用来正确传递了

  1. 变量 例如上例 foo($a)
  2. new语句 例如 foo(new foobar())
  3. 从函数中返回的引用

任何其它表达式都不能通过引用传递,结果未定义

 

应用做的第三件事:引用返回

引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。不要用返回引用来增加性能,引擎足够聪明来自己进行优化。仅在有合理的技术原因时才返回引用!要返回引用,使用此语法:

例子:

<?php

class foo{

         public $value=42;

         public function &getValue(){

                   return $this->value;

         }

}

$a=new foo();

$myvalue=& $a->getValue();

$a->value=2;

echo $myvalue;//2

?>

和参数传递不同,这里必须在两个地方都用 & 符号——指出返回的是一个引用,而不是通常的一个拷贝,同样也指出 $myValue 是作为引用的绑定,而不是通常的赋值。

 

例子分析:

<?php

class foo{

         protected $name;

         function __construct($str){

                   $this->name=$str;

         }

 

         function __tostring(){

                   return 'my name shi:'.$this->name.' and I live in:'.__class__;

         }

 

         function setName($str){

                   $this->name=$str;

         }

}

 

class MasterOne{

         protected $foo;

 

         function __construct($f){

                   $this->foo=$f;

         }

         function __toString(){

                   return 'Master:'.__class__.' |foo:'.$this->foo;

         }

 

         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;

         }

 

         function setFooName($str){

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

         }

 

}

 

$bar = new foo('bar');

 

print("\n");

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

print( $bar ); //my name shi:bar and I live in:foo

 

print("\n");

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

$baz =& $bar;

print( $bar ); //my name shi:bar and I live in:foo

 

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 ); //Master:MasterOne |foo:my name shi:bar and I live in:foo

print( $m2 ); //Master:MasterTwo |foo:my name shi:bar and I live in:foo

 

print("\n");

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

$bar->setName('baz');

print( $bar ); //my name shi:baz and I live in:foo

print( $baz ); //my name shi:baz and I live in:foo

 

print("\n");

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

print( $m1 ); //Master:MasterOne |foo:my name shi:baz and I live in:foo

print( $m2 ); //Master:MasterTwo |foo:my name shi:baz and I live in:foo

 

print("\n");

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

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

print( $m1 ); //Master:MasterOne |foo:my name shi:MasterTwo's Foo and I live in:foo

print( $m2 ); //Master:MasterTwo |foo:my name shi:MasterTwo's Foo and I live in:fooAlso

 

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

print( $bar ); //my name shi:MasterTwo's Foo and I live in:foo

print( $baz ); //my name shi:MasterTwo's Foo and I live in:foo

?>

转载于:https://www.cnblogs.com/hylaz/archive/2012/11/26/2788889.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2018 年最受欢迎的 Python 库,你都用过吗?

全世界只有3.14 % 的人关注了数据与算法之美前段时间&#xff0c;数据科学网站 KDnuggets 评选出了顶级 Python 库 Top15&#xff0c;领域横跨数据科学、数据可视化、深度学习和机器学习。推荐阅读《Python3.0科学计算指南》上图&#xff1a;根据 GitHub star 和贡献评选出的 2…

登录服务器修改数据库吗,如何修改服务器登录数据库 sa

如何修改服务器登录数据库 sa 内容精选换一换为确保华为云关系型数据库服务发挥出最优性能&#xff0c;用户可根据业务需求对用户创建的参数模板中的参数进行调整。您可以修改用户创建的数据库参数模板中的参数值&#xff0c;但不能更改默认数据库参数模板中的参数值。以下是您…

用NSubstitute来mock

Moq在.net中比较出名的mock框架&#xff0c;NSubstitute也是属于这类框架&#xff0c;使用方式也如出一辙&#xff0c;是通过实现子类来达到mock的效果。下面的测试方法都是按照 UnitTest的三板斧Arrange Act Assert来展开的&#xff0c;代码具体如下。using Microsoft.VisualB…

ubuntu安装mysql_Ubuntu18.04下安装MySQL

提示&#xff1a;以下操作均在root用户下进行&#xff0c;如在普通用户&#xff0c;请自行加上sudo&#xff01;# 查看有没有安装MySQL&#xff1a;dpkg -l | grep mysql# 安装MySQL&#xff1a;apt install mysql-server安装完成之后可以使用如下命令来检查是否安装成功&#…

shell 赋值

${parametre-default}与{parameter:-default}的输出等效&#xff0c;只当parameter被声明但值为null时候&#xff0c;二者才有区别。//变量未声明、未赋值[rootinstructor ~]# echo $a[rootinstructor ~]# echo ${a-1}1[rootinstructor ~]# echo ${a:-1}1//变量声明、赋值为nul…

居家好物┃超好用的擦窗神器保护腰椎尾椎久坐不累的美臀坐垫

▲卢sir特别推荐点击上图进入玩酷屋春节即将来临&#xff0c;小木特地挑选了好几款超级好用的居家生活产品。第一款&#xff1a;擦外窗神器&#xff0c; 颠覆你擦窗方式&#xff01;双面长柄 可伸缩 可折叠 可旋转便携擦玻璃神器第二款&#xff1a;天然抗菌除螨毛巾&#xff0c…

ML.NET Cookbook:(12)我想看看模型的系数

通常&#xff0c;一旦一个模型被训练出来&#xff0c;我们也会对“它学到了什么”感兴趣。例如&#xff0c;如果线性模型为我们认为重要的特征赋予零权重&#xff0c;则可能表明建模存在一些问题。线性模型的权重也可用作对“特征重要性”的估计。这是我们可以从训练的模型中提…

【读书笔记】《编写高效的JavaScript程序》

为什么80%的码农都做不了架构师&#xff1f;>>> 看到一篇文章&#xff0c;http://www.csdn.net/article/2012-11-20/2811887-writing-fast-memory-efficient-javascript/2 里面有个网页针对 原型链&#xff0c;模块化&#xff0c;模块化加缓存&#xff0c;进行了比…

Cloudera将被私有化,Hadoop时代或将落幕

北京时间 6 月 1 日晚&#xff0c;据 TechCrunch 报道 [1]&#xff0c;KKR 和 CD&R 将以 53 亿美元收购 Cloudera&#xff0c;Cloudera 将被私有化。截止到本文发稿时&#xff08;11 点 49 分&#xff09;&#xff0c;Cloudera 股票报价 15.94 美元&#xff0c;涨幅 23.95%…

mysql group_concat去重_MySQL group_concat() 函数用法

MySQL group_concat() 函数用法在使用 group by对数据进行分组后&#xff0c;如果需要对 select 的数据项进行字符串拼接&#xff0c;这时就需要用到group_concat()函数。1、基本用法group_concat()完整语法如下&#xff1a;group_concat([DISTINCT] 要连接的字段 [Order BY AS…

secureCRT常用设置

1、光标颜色 默认为黑色&#xff0c;非常不便&#xff0c;设置为白色。 Options–> Session Options –> Appearance –> Cursor –> 勾选use color选择白色 2、设置超时 Session Options –> Send protocol NO-OP every 输入60。 3、设置鼠标右键复制 Global O…

请问:如何写出没有BUG的代码?

全世界只有3.14 % 的人关注了数据与算法之美1947年9月9日&#xff0c;美国海军准将 Grace Hopper 在哈佛学院计算机实验室里使用 Mark II 和 Mark III 计算机进行研究工作。她的团队跟踪到 Mark II 上的一个错误&#xff0c;操作人员发现是由于一只飞蛾钻到了 Mark II 的继电器…

非常适合新手的redis cluster搭建过程

Redis集群演进过程Redis单节点主从复制&#xff1a;复制主要实现了数据的多机备份&#xff0c;以及对于读操作的负载均衡和简单的故障恢复。故障恢复无法自动化&#xff1b;写操作无法负载均衡&#xff1b;存储能力受到单机的限制。哨兵&#xff08;Sentinel&#xff09;&#…

mysql innodb事务中_MySQL InnoDB如何保证事务特性示例详解

前言如果有人问你“数据库事务有哪些特性”&#xff1f;你可能会很快回答出原子性、一致性、隔离性、持久性即ACID特性。那么你知道InnoDB如何保证这些事务特性的吗&#xff1f;如果知道的话这篇文章就可以直接跳过不看啦(#^.^#)先说结论&#xff1a;redo log重做日志用来保证事…

各类环境渗透测试简述

2019独角兽企业重金招聘Python工程师标准>>> 各类环境渗透测试简述 一、渗透测试概念 渗透测试 (penetration test)并没有一个标准的定义&#xff0c;国外一些安全组织达成共识的通用说法是&#xff1a;渗透测试是通过模拟恶意黑客的攻击方法&#xff0c;来评估计算…

预售┃一张纸一幅图,竟然提高了10倍的学习和工作效率!?

▲卢sir特别推荐点击上图进入玩酷屋人类大脑的容量远远超出一般人的想象&#xff0c;时到21世纪的今天&#xff0c;我们对大脑的运用远远不够。大脑机能的使用率基于我们的思维模式&#xff0c;而思维导图正是开发大脑中最有效的利器&#xff01;之前小木给大家推荐了一套基于少…

入门K8s:一键脚本搭建Linux服务器集群

前言好久没有写系列博客了&#xff0c;本文主要是对网上文章的总结篇&#xff0c;主要是将安装和运行代码做了一次真机实验&#xff0c;亲测可用。文章内包含的脚本和代码&#xff0c;多来自于网络&#xff0c;也有我自己的调整和配置&#xff0c;文章末尾对参考的文献做了列举…

数据库系统原理及mysql应用教程第二版_数据库系统原理及MySQL应用教程(第2版十三五普通高等教育规划教材)...

导语内容提要本书共19章&#xff0c;全面地讲述了数据库技术的基本原理和应用。主要内容包括&#xff1a;数据库概述、信息与数据模型、关系代数与关系数据库理论、数据库设计方法、MySQL的安装与使用、MySQL存储引擎与数据库操作管理、MySQL表定义与完整性约束控制、MySQL数据…

Eclipse 安装配置总结(WST WTP)(转)

为什么80%的码农都做不了架构师&#xff1f;>>> Eclipse 安装配置总结(WST WTP)(转) Eclipse 是最流行的功能强大的java IDE&#xff0c;有丰富的插件&#xff0c;配合插件可以作为j2ee、c、c、.net等开发工具。需要安装插件才能支持Web开发和其他应用的开发&#…

2019最佳年会,新东方6名员工冒着离职的风险,在年会上怒怼老板

全世界只有3.14 % 的人关注了数据与算法之美今天早上&#xff0c;数据汪打开微信朋友圈一看&#xff0c;发现大家都在疯传昨晚北京新东方学校年会节目《释放自我》。新东方员工们把歌曲《沙漠骆驼》的歌词给改编过后&#xff0c;把许多奋战在一线的员工心声都给唱出来了&#x…