PHP引用传递与引用&一些用法介绍
引用是什么
在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是,引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的 hardlink。
引用做什么
PHP 的引用允许用两个变量来指向同一个内容。
当 $a =& $b; 时 $a 和 $b 指向了同一个变量。
提示:$a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方。
可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。语法如下:
代码如下 | 复制代码 |
<?php // 输出的是:6 |
PHP引用符&
关于php的引用(就是在变量或者函数、对象等前面加上&符号)的作用,我们先看下面这个程序。
代码如下 | 复制代码 |
程序运行结果: 100 |
很多人误解php中的引用跟C当中的指针一样,事实上并非如此,而且很大差别。C语言中的指针除了在数组传递过程中不用显式申明外,其他都需要使用*进行定义,而php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。
php默认为传值传递:
代码如下 | 复制代码 |
|
程序运行结果:
30 and 20
要是想变为地址传递需要加&,既:
代码如下 | 复制代码 |
|
程序运行结果:
就是说,&把$a的地址传给了$b,这样的话这两个变量现在共享一个内存的存储区域,就是说它们的值是一样的。
同样的语法可以用在函数中,它返回引用,以及用在 new 运算符中:
代码如下 | 复制代码 |
view sourceprint? 2 $bar =& new fooclass(); 3 $foo =& find_var($bar); 4 ?> |
引用做的第二件事是用引用传递变量。这是通过在函数内建立一个本地变量,并且该变量在呼叫范围内引用了同一个内容来实现的。说的通俗点就是一个函数的参数是一个本地变量的引用。下面再举例说明一下:
代码如下 | 复制代码 |
<?php |
运行这段代码是给函数传递两个参数,一个是引用$a的内容,一个是$b的值,在执行此函数后,发现$a的内容改变了,而$b的内容则没有变化。
PHP引用以及误区
PHP中的引用可以理解成变量的别名。由于PHP的变量名是存储在符号表(symbol table)中的,变量内容是存储在堆中,引用就是用符号表中的不同符号(symbol)名称来访问同一存储内容,和Unix文件系统中的hardlink是同一个概念,比如:
代码如下 | 复制代码 |
<?php <?php $b = 1; |
返回引用
大多数情况下并不需要返回引用来提高性能,zend引擎会自己进行优化,但是如果你非得返回引用得话,可以按照以下方式来返回引用:
代码如下 | 复制代码 |
<?php public function &getValue() { // 需要一个"&" $obj = new foo; |
与指针的区别
引用与指针很像,但是其并不是指针,看如下的代码:
代码如下 | 复制代码 |
<?php $a = 0; $b = &a; echo $a; //0 unset($b); echo $a; //0 |
由于$b只是$a的别名,所以即使$b被释放了,$a没有任何影响,但是指针可不是这样的,看如下代码:
代码如下 | 复制代码 |
#include <stdio.h> printf("%in", a); //0 |
由于b是指向a的指针,所以释放了b的内存之后,再访问a就会出现错误,比较明显的说明了PHP引用与C指针的区别。
对象与引用
在PHP中使用对象的时候,大家总是被告知“对象是按照引用传递的”,其实这是个误区。PHP的对象变量存储的是此对象的一个标示符,在传递对象的时候,其实传递的就是这个标示符,而并不是引用,看如下代码:
代码如下 | 复制代码 |
<?php /* $c = new B; /* echo "object a: "; var_dump($a); //["testB"]=> string(15) "Changed Class B" |
如果对象是按照引用传递的,那么$a, $b, $c输出的内容应该一样,事实上结果并非如此。 看下面通过引用传递对象的列子:
代码如下 | 复制代码 |
<?php /* $cc = new B; /* echo "object aa: "; var_dump($aa); //["testB"]=>string(15) "Changed Class B" |
此时$aa,$bb,$cc三者内容完全一样,所以可以看出对象并不是按照引用传递,要尽快走出这个误区。
本文章来给大家介绍一篇简单的php入门实例,这里主要是讲述了php数组值的操作及函数以及数组遍历与数组排序的实例,各位同学可进入参考。数组值的操作
1. 值的析取
PHP中,用list来析取数组中的值,如list($a, $b) = $array。如果list中的值多于数组个数,list中多余的值会设为NULL。也可以用逗号来跳过数组中的值,如list($a, ,$b) = $array。
2.划分数组
如果想取得子数组,可以用array_slice(array, offset, length);来取得。它返回一个新的下标从0开始的数组。如果原数组的下标是字符串,好像是没有什么意义的,最好不要用,可以用array_splice来取得子串。
3.将数组分为多个数组
用array_chunk可以把数组分成一个二维数组。详细的可以通过链接看官方的说明。
4.键和值
array_keys($array),取得由数组索引组成的数组
array_value($array),取得由数组值组成的数组,索引从0开始重新分配。
array_key_exists($key, array),元素是否存在检查。
array_splice, 删除插入元素。
5.数组和变量之间的转换
extract(array) 把数组变成变量
compact() 把变量变成数组
6.数组的查找
in_array(array, ) 返回元素是否在数组中存在。
array_search() 返回被找到元素的索引。
7.整个数组函数
array_ sum() 计算数组的和。
array_ merge() 合并两个数组。
array_ diff() 两个数组之间的不同值。
array_ filter() 过滤元素
8.集合、堆栈、队列
array_ unique() 取两个数组的合集,如果值相同,保留前一个数组的索引。
array_ intersect() 取两个数级的交集,保留第一个数组的索引。
array_ push() 加入堆栈。
array_ pop() 弹出堆栈。
array_ shift() 加入队列。
array_ unshift() 弹出队列。
1.简单的遍历
PHP中,数组最简单的遍历方法莫过于for和foreach了。其中foreach有两种写法,一种只遍历值、另一种遍历索引和值。具体可以看如下代码。
代码如下 | 复制代码 |
$test01 = array('a', 'b', 'c'); // for for ($i = 0; $i < count($test01); $i++) { echo $test01[$i]; } // foreach value only foreach ($test01 as $value) { echo $value; } // foreach key and value $test01 = array('a' => 'aaaa', 'b' => 'bbbb', 'c' => 'cccc'); foreach ($test01 as $key => $value) { echo "$key => $value"; } |
2.迭代器遍历
PHP中,迭代遍历主要要用到以下函数。
current() 迭代的当前元素。
reset() 重新移动到第一个元素并返回它。
next() 移动到下一个元素并返回它。
prev() 移动到上一个元素并返回它。
end() 移动到最后一个元素并返回它。
each() 以数组的形式返回当前元素的索引和值,并移动到下一个迭代。
key() 返回当前的索引。
array_ walk() 为每一个元素调用函数。
array_ reduce() 为每一个元素依次计算。
代码如下 | 复制代码 |
$test02 = array(1, 2, 3, 4, 5); |
3.数组的排序
在PHP中,排序方式有三种,通过索引排序、通过值排序(不保留原索引)、通过值排序(保留原索引)。每种又分为升序、降序以及用户定义顺序三个函数。它们分别如下:
通过索引排序:①升序 ksort() ②降序 krsort() ③用户定义顺序 uksort()
不保留原索引值排序:①升序 sort() ②降序 rsort() ③用户定义顺序 usort()
保留原索引值排序:①升序 asort() ②降序 arsort() ③用户定义顺序 uasort()
在PHP中,也可以用array_multisort来一次排序多个数组,不过项目中可能用得比较少。
翻转数组,把数字索引翻转,索引重新从0开始:array_reverse()
把索引和值调换:array_flip()
随机顺序:shuffle()
引用文件是PHP在一大特特色之一,这个方法可以将常用的功能与函数放在一个文件之中,而其他页面需要用到这些功能或函数时,就直接通过引用这个文件来调用这些函数了。如果不引用的话,重新在那个页面上写上相同的函数会大大的加重开发者的工作量,也加大了程序的代码量,不利于后期的维护以及二次开发。
PHP引用文件的方法有两,分别利用到的函数是 require() 和 include() 。两种引用的效果是一样的,但这两个函数有不同之处:如果 require 引用文件时不反回任何值,出错就致命的错误,程序将终止继续执行;使用该函数进行引用时,你要确保代码都是正确的情况下使用。而当 include 引用文件时有反回值,出错时它仍继续执行后面代码。所以建议大家尽量使用第一个函数 require 来引用文件,它没有值反回,速度和效率上相对比 include 要快。而通常 require 会放在PHP程序的最前面,PHP 程序在执行前,就会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份。常用的函数,亦可以这个方法将它引入网页中。
代码如下 | 复制代码 |
<?php |
这时有人可能就会问,当某个页面引用多个文件时,而这些被引用的文件也都引用了其它一个或多个相同的文件,有时侯没必要引用那么多次,那么怎样才让PHP只引用一次就行了呢?当然,PHP也有对应的方法的,就是在原函数的基础上加上个“后缀”一样的声明,就是把函数分别变为 require_once()和 include_once(),如下示例:
代码如下 | 复制代码 |
<?php |
在PHP中的一个常量一旦被定义,就不能再改变或者取消定义;常量有预定义常量(内部常量),和PHP默认定义的常量,当然也可以自定义常量。
以下是其中几个预定义常量:(完整预定义常量,请参阅PHP手册)
TRUE ,该常量是真值(true),为真(成立)。
FALSE ,该常量是伪值(false),为假(不成立)。
PHP_VERSION ,该常量是当前PHP程序的版本号,如 “5.2.17”。
PHP_OS ,该常量是当前执行PHP程序解析器的操作系统名称,如 “Linux”。
DIRECTORY_SEPARATOR ,表示路径分隔符,在Windowns上为“”,Linux上为“/”。
以下是其中几个PHP默认常量:
E_ERROR ,这个常量指到最近的错误处。
E_WARNING ,这个常量指到最近的警告处。
E_PARSE ,这个常量为解析语法有潜在问题处。
E_NOTICE ,这个常式为发生不寻常但不一定是错误处。例如存取一个不存在的变量。
PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。
PHP有几个称为“魔术常量”的常量,它们的值随着它们在代码中的位置改变而改变。例如 “__LINE__ ”的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写(但一般作大写),如下
“__LINE__” 文件中该常量所在的行号。
“__FILE__” 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。__FILE__ 还包含了一个绝对路径(如果是符号连接,则是解析后的绝对路径)。
“__DIR__” 文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增)
“__FUNCTION__” 函数名称,自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。
“__CLASS__” 类的名称,自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。
“__METHOD__” 类的方法名,返回该方法被定义时的名字(区分大小写)。
“__NAMESPACE__” 当前命名空间的名称(大小写敏感),这个常量是在编译时定义的。
当然在程序写作时,以上的默认常量是不够用。define() 的功能可以让我们自行定义所需要的常量。见下例:
1234 <?php define('CONSTANT', '你好!'); echo CONSTANT; ?>
常量名和其它任何 PHP 标签遵循同样的命名规则。合法的常量名以字母或下划线开始,后面跟着任何字母,数字或下划线。
常量默认为大小写敏感,按照惯例常量标识符总是大写的,在脚本执行期间该值不能改变。
定义常量和定义变量的区别:
常量前面没有美元符号($)
常量只能用 define() 函数定义,而不能通过赋值语句
常量可以不用理会变量范围的规则而在任何地方定义和访问
常量一旦定义就不能被重新定义或者取消定义
常量的值只能是标量
PHP1到100求和方法集锦,有很多方法都可以实现,先讲一下最简单的几种方法,比如用FOR,WHILE等循环语句求和
FOR循环语句1到100求和方法
代码如下 | 复制代码 |
<?php $sum=0; for($i=1;$i<=100;$i++){ $sum+=$i.'<br/>'; } echo $sum; ?> |
WHILE循环语句1到100求和方法
代码如下 | 复制代码 |
<?php $i=1; $sum=0; while ($i<=100) { $sum = $sum +$i; $i++; } echo $sum; ?> |
DO-WHILE循环语句1到100求和方法
代码如下 | 复制代码 |
<?php $i=1; $sum=0; do{ $sum+=$i; $i++; } while ($i<=100); echo $sum; ?> |
相关文章
- using 指令有两个用途: 允许在命名空间中使用类型,以便您不必限定在该命名空间中使用的类型。 为命名空间创建别名。 using 关键字还用来创建 using 语句 定义一个范围,将在此...2020-06-25
- 最新版下载: http://www.csdn123.com/uploadfile/2015/0428/20150428062734485.zip 概要 iScroll 4 这个版本完全重写了iScroll这个框架的原始代码。这个项目的产生...2016-05-19
- 这篇文章主要介绍了C++中cin的用法详细,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 这篇文章主要介绍了C#中的try catch finally用法,以实例形式分析了try catch finally针对错误处理时的不同用法,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
- useState 通过在函数组件里调用它来给组件添加一些内部 state,React 会在重复渲染时保留这个 state,接下来通过一个示例来看看怎么使用 useState吧...2021-06-04
PHP中print_r、var_export、var_dump用法介绍
文章详细的介绍了关于PHP中print_r、var_export、var_dump区别比较以及这几个在php不同的应用中的用法,有需要的朋友可以参考一下 可以看出print_r跟var_export都...2016-11-25- 在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组。所以,这里主要探讨php输入流php://input。 下面的例子摘取的是wordpres...2016-11-25
- 这篇文章主要介绍了Delphi常用关键字用法,包括了各个常用的关键字及其详细用法,需要的朋友可以参考下...2020-06-30
- 1、声明主键的方法: 您可以在创建表的时候就为表加上主键,如: CREATE TABLE tbl_name ([字段描述省略...], PRIMARY KEY(index_col_name)); 也可以更新表结构时为表加上主键,如: ALTER TABLE tbl_name ADD PRIMARY KEY (in...2015-11-24
- 本文给大家汇总介绍了C#中的几种this用法,相信大家应该有用过,但你用过几种?以下是个人总结的this几种用法,欢迎大家拍砖,废话少说,直接列出用法及相关代码。...2020-06-25
- 目前在做window.onerror时上报js错误信息的事,整理下相关资料,需要的朋友可以参考下...2016-01-29
- 这篇文章主要介绍了C语言循环结构与时间函数用法,是C语言中非常重要的一个技巧,需要的朋友可以参考下...2020-04-25
- 本文章来给大家介绍一下在php中 ->与 ==>符号的用法与区别,有需要了解的朋友可尝试参考。 “->”(减号、右尖括号) 用于类中,访问类里的函数或对象,比如:...2016-11-25
- 这篇文章主要为大家介绍了JavaScript对象参数的引用传递的相关资料,感兴趣的小伙伴们可以参考一下...2016-01-15
- foreach()有两种用法 1: foreach(array as $value) { 表达式; } 这里的array是你要遍历的数组名,每次循环中,array数组的当前元素的值被赋给$value,...2016-11-25
- __FILE__在php是表示当前文件绝对路径哦,下面我们来看看简单的FILE的实例吧。 《?php echo __FILE__; ?> E:phpinfo.php 那么我们会看到很多cms中会这样写 dirname...2016-11-25
- sort() 方法用于对数组的元素进行排序。接下来通过本文给大家介绍Sort()函数的多种用法,对sort函数的用法相关知识感兴趣的朋友一起学习...2016-03-22
- 这篇文章主要给大家介绍了关于ES6学习教程之Promise用法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-23
- 这篇文章主要介绍了C#分屏控件用法实例,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了Python Parser的用法,文中有非常详细的代码示例,对正在学习python的小伙伴们有很好地帮助,需要的朋友可以参考下...2021-05-12