php 引用传值学习笔记
引用是什么
在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是,引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的 hardlink。
一:变量的引用
代码如下 | 复制代码 |
<?php $a =100; $b = &$a; echo $b; //这里输出100 echo $a; //这里输出100 ,说明$a,和$b的值都是一百。 $b= 200; echo $a; //这里输出200 echo $b; //这里输出200,这就可以看出他们用的是同一个地址。改变一个,另一个也会跟着改变。 ?> |
二:函数中引用传值。
代码如下 | 复制代码 |
<?php |
三:对象的引用传值
对象的引用
代码如下 | 复制代码 |
<? class club{ var $name="real madrid"; } $b=new club; $c=$b; echo $b->name;//这里输出real madrid echo $c->name;//这里输出real madrid $b->name="ronaldo"; echo $c->name;//这里输出ronaldo ?> |
取消引用
当你 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:
代码如下 | 复制代码 |
<?php |
不会 unset $b,只是 $a。
例,引用传递
test1.php
代码如下 | 复制代码 |
<?php |
test2.php
代码如下 | 复制代码 |
<?php |
引用返回
引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。不要用返回引用来增加性能,引擎足够聪明来自己进行优化。仅在有合理的技术原因时才返回引用!要返回引用,使用此语法
代码如下 | 复制代码 |
<?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 这里将return $b中的 $b变量的内存地址与$a变量的内存地址 指向了同一个地方 $a=5; //已经改变了 return $b中的 $b变量的值 $a=test();//这条语句会输出 $b的值 为6 /** |
下面解释下:
通过这种方式$a=test();得到的其实不是函数的引用返回,这跟普通的函数调用没有区别 至于原因: 这是PHP的规定
PHP规定通过$a=&test(); 方式得到的才是函数的引用返回
至于什么是引用返回呢(PHP手册上说:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。) 这句狗屁话 害我半天没看懂
用上面的例子来解释就是
$a=test()方式调用函数,只是将函数的值赋给$a而已, 而$a做任何改变 都不会影响到函数中的$b
而通过$a=&test()方式调用函数呢, 他的作用是 将return $b中的 $b变量的内存地址与$a变量的内存地址 指向了同一个地方
即产生了相当于这样的效果($a=&$b;) 所以改变$a的值 也同时改变了$b的值 所以在执行了
$a=&test();
$a=5;
以后,$b的值变为了5
这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中
*/
?>
在举一个有意思的例子是在oschina上看到的:
代码如下 | 复制代码 |
<?php |
will result in:
ABE
BEN
BEN
Array
(
[0] => ABE
[1] => BEN
[2] => BEN
)
解释: 在第二个foreach中循环如下:
Array
(
[0] => ABE
[1] => BEN
[2] => ABE
)
Array
(
[0] => ABE
[1] => BEN
[2] => BEN
)
Array
(
[0] => ABE
[1] => BEN
[2] => BEN
)
因为没有unset($n),所以它始终指向数组的最后一个元素,第二个foreach里第一次循环把$n,也就是$a[2]改成了ABE,第二次循环改成了BEN,第三次就也是BEN了。
昨天还写了一篇关于数组合并的技术文章,那里我介绍的是一维数组合并,这里介绍一下php二维数组的合并方法,希望对各位同学会有所帮助哦。例1
自定义方法合并数组
先看一个二维数组:
代码如下 | 复制代码 |
<?php [0] => Array ( [A] => store_name [B] => 商店一 ) [1] => Array ( [A] => store_owner [B] => 小风 ) [2] => Array ( [A] => store_name [B] => 商店二 ) [3] => Array ( [A] => store_owner [B] => 小磊 ) ?> 大家会发现里面有两个 store_name 和 store_owner ,所以我想让他们合并成下面这样 <?php Array ( [0] => Array ( [A] => 商店一 [B] => 小风 ) [1] => Array ( [A] => 商店二 [B] => 小磊 ) ?> |
合并方法如下:
代码如下 | 复制代码 |
<?php ?> |
这样就可以得到上面的结果了!
为了让大家看的更清楚写 我把数据库表结构写出来 主要字段如下:
key value
store_name 网店一
store_owner 小风
store_name 网店二
store_owner 小磊
通过上面 的方法做过后 前台页面就可以以一排的方式显示了,如下
name owner
网店一 小风
网店二 小磊
例3
代码如下 | 复制代码 |
<?php 1 => array( |
常用的数据类型有字符串型、浮点型(单精度浮点型float、双精度浮点型double)、整形、布尔型
1 其他类型转化为整型
1.1 字符串型转化为整型
1.1.1 如果字符串全部为数字,则直接全部转换为整型,如果有小数点则会去除小数点后面的内容,如 '12' 跟 '12.3' 转换为整型后都为12
1.1.2 如果字符串以字母开头则不管中间或后面有多少数字或小数点,转换为整形后都为0。如'ab12.3c'转换为整型后为0
1.1.3 如果以数字开头,则会去掉数字后面的字符,如果有小数点则去除小数点后面的。如 '123.4abc' 、 '123abc' 转换为整形后都为123
1.2 浮点型转化为整型
1.2.1 如果浮点数含有小数点则去掉小数点后面的字符,如果没有则直接变为整型 。如:浮点数 12.6 转换为整形后为12
1.3 布尔型转化为整型
1.3.1 布尔型转换为整型时,true会转换为 1 false 会转换为 0其中NULL转换为整型后为0 所以如果要判断 if(NULL == 0){echo "NULL等于0";} 是会返回NULL等于0的
2 其他类型转化为字符串型
2.1 整型、浮点型转换为字符串型是直接在数字上加引号 如12 12.3 转换为字符串后为 "12" "12.3"
2.2 布尔型转换为字符串是,true会转换成字符串"1",false 跟NULL转换为字符串结果为空字符串,不会有输出
3 其他类型转化为浮点型
3.1 整型直接转化为浮点型,数值不变,字符串转换为浮点型跟字符串转换为整型基本上是一样的,只不过是当字符串之间有小数点时,小数点会保存。如 “12.3abc” 转换之后为 12.3 其他形式的是一样的方法
3.2 布尔型转换为浮点型是,true会转换成浮点型 1 ,false 跟NULL转换为浮点型结果为0
4 其他类型转化为布尔型
4.1 空字符串转换为 布尔型为FALSE,非空为TRUE;整型跟浮点型的0转换为布尔型为FALSE,其他为TRUE
4.2 NULL转换为布尔型后结果为FALSE
PHP的数据类型转换属于强制转换,允许转换的PHP数据类型有:
•(int)、(integer):转换成整形
•(float)、(double)、(real):转换成浮点型
•(string):转换成字符串
•(bool)、(boolean):转换成布尔类型
•(array):转换成数组
•(object):转换成对象
PHP数据类型有三种转换方式:
•在要转换的变量之前加上用括号括起来的目标类型
•使用3个具体类型的转换函数,intval()、floatval()、strval()
•使用通用类型转换函数settype(mixed var,string type)
第一种转换方式: (int) (bool) (float) (string) (array) (object)
代码如下 | 复制代码 |
1.<?php 2.$num1=3.14; 3.$num2=(int)$num1; 4.var_dump($num1); //输出float(3.14) 5.var_dump($num2); //输出int(3) 6.?> |
第二种转换方式: intval() floatval() strval()
代码如下 | 复制代码 |
1.<?php 2.$str=”123.9abc”; 3.$int=intval($str); //转换后数值:123 4.$float=floatval($str); //转换后数值:123.9 5.$str=strval($float); //转换后字符串:”123.9″ 6.?> |
第三种转换方式: settype();
代码如下 | 复制代码 |
1.<?php |
php 中可以使用shuffle函数实现数组随机排序功能。
代码如下 | 复制代码 |
<?php |
php 数组转xml
代码如下 | 复制代码 |
function array2xml($array, $xml = false){ |
php xml转数组
代码如下 | 复制代码 |
$s = <<<EOS |
相关文章
- 虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。下面通过实例代码给大家介绍c++中的循环引用,一起看看吧...2020-04-25
- 我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持。在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组。这...2016-11-25
- 1、简介Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目...2014-05-31
- 当我们在星际中开地图和几家电脑作战的时候,电脑的几个玩家相当于结盟,一旦我们出兵进攻某一家电脑,其余的电脑会出兵救援。 那么如何让各家电脑知道自己的盟友被攻击了...2016-11-25
- 举一个简单的date例子 我将使用echo命令把内容输出到我们的客户端(浏览器)。我将使用下面的代码做为基础代码。 代码如下 复制代码 <!DOCTY...2016-11-25
- 这篇文章主要给大家介绍了关于Swift中优雅的处理闭包导致的循环引用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Swift具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-30
- 这篇文章主要介绍了详解C++数组和数组名问题(指针、解引用),指针的实质就是个变量,它跟普通变量没有任何本质区别,指针本身是一个对象,同时指针无需在定义的时候赋值,具体内容详情跟随小编一起看看吧...2021-09-18
- 一篇Android学习笔记之多界面切换实例,希望对各位朋友有所帮助。 用过VB 、 VC#的朋友都知道,在VB或VC#里要进行窗口(界面)切换很容易 例如在VB、C#里: 有 Fom1、...2016-09-20
- 本篇文章主要介绍了Swift中如何避免循环引用的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-30
- 引用:意思是将原始对象在内存中的地址传递给目标对象,就相当于原始对象和目标对象指向的是同一个内存地址。此时,如果对目标对象或者原始对象进行修改,内存中的数据也会改...2016-11-25
- cURL是php中一个很强大的功能,可以模仿各种用户请求,如模仿用户登录,发送php cookie等等操作,下面我来整理一些相关的方法与各位同学看看 备注:使用curl_init函数,必须...2016-11-25
- 那些年学了ASP.NET后,才开始学习C#,说来也怪,怎么学了ASP.NET才来学习C#,其实没有什么的...2020-06-25
- CWidget是所有Widget的基类。CWidget是自包含组件,可以看出是MVC的简略版,CWidget相比Controller,既没有actions,也没有filters widget,英文意思为小工具,小挂件,在程序...2016-11-25
- 这篇文章主要介绍了python全局变量引用与修改过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-04-30
- Metasploit是一个免费的、可下载的框架,通过它可以很容易地获取、开发并对计算机软件漏洞实施攻击。它本身附带数百个已知软件漏洞的专业级漏洞攻击工具 nexpose安...2016-11-25
- asp.net 组件开发中的内嵌资源引用实现代码,需要的朋友可以参考下。...2021-09-22
- 本篇文章主要是对c#中调用Surfer软件,添加引用的具体操作方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助...2020-06-25
- PHP扩展开发不是所有开发者都会操作的一个东西,下面我来演示一个关于PHP扩展开发实现过程,各位同学有需要可进入参考。 我们先假设需要这样一个扩展,提供一个叫tao_s...2016-11-25
- 这篇文章主要介绍了C++中引用&与取地址&的区别,有助于C++初学者更好的掌握指针的概念及用法,需要的朋友可以参考下...2020-04-25
- 小编推荐的这篇文章介绍了Yii2学习笔记之汉化yii设置表单的描述,非常实用,有兴趣的同学快来看看吧。 一:汉化框架  框架汉化在这里设置,如果不生效,前台后...2017-07-06