PHP引用传递与引用&一些用法介绍

 更新时间:2016年11月25日 15:01  点击:1364
在php中引用是使用&来做,下面我来给大家介绍在php引用一些用法与引用问题与事项实例,欢迎各位朋友进入参考。

引用是什么

在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是,引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的 hardlink。

引用做什么
PHP 的引用允许用两个变量来指向同一个内容。
当 $a =& $b; 时 $a 和 $b 指向了同一个变量。
提示:$a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方。

可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。语法如下:

 代码如下 复制代码

<?php
function foo(&$var)
{
    $var++;
}
 
$a=5;
foo($a);
echo $a;

// 输出的是:6


PHP引用符&

关于php的引用(就是在变量或者函数、对象等前面加上&符号)的作用,我们先看下面这个程序。

 代码如下 复制代码

   
<?php
$a = 100; //声明变量a
$b = &$a; //声明变量b,引用自变量a
echo "$a <br />"; 
echo "$b <br />";
$a++; //变量a自增1
echo "$a <br />";
echo "$b <br />";//查看变量b,也增加了1,说明使用的是同一存储单元
?>

程序运行结果:

100
100
101
101

很多人误解php中的引用跟C当中的指针一样,事实上并非如此,而且很大差别。C语言中的指针除了在数组传递过程中不用显式申明外,其他都需要使用*进行定义,而php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。

php默认为传值传递:

 代码如下 复制代码

 
<?php   
$a = 20;
$b = $a;
$a = $a + 10;
echo $a.' and '.$b;
?>

程序运行结果:

30 and 20

要是想变为地址传递需要加&,既:

 代码如下 复制代码

 
<?php
$a = 20;
$b = &$a;
$a = $a + 10;
echo $a.' and '.$b;
?>

程序运行结果:

就是说,&把$a的地址传给了$b,这样的话这两个变量现在共享一个内存的存储区域,就是说它们的值是一样的。

同样的语法可以用在函数中,它返回引用,以及用在 new 运算符中:

 代码如下 复制代码

view sourceprint?
1 <?php 

2 $bar =& new fooclass(); 

3 $foo =& find_var($bar); 

4 ?>

引用做的第二件事是用引用传递变量。这是通过在函数内建立一个本地变量,并且该变量在呼叫范围内引用了同一个内容来实现的。说的通俗点就是一个函数的参数是一个本地变量的引用。下面再举例说明一下:

 代码如下 复制代码

<?php
function foo(&$val1, $val2) {
 $val1 += 1;
 $val2 += 1;
}
$a=5;
$b=10;
foo($a,$b);
echo $a;
echo $b;
?>

运行这段代码是给函数传递两个参数,一个是引用$a的内容,一个是$b的值,在执行此函数后,发现$a的内容改变了,而$b的内容则没有变化。


PHP引用以及误区


PHP中的引用可以理解成变量的别名。由于PHP的变量名是存储在符号表(symbol table)中的,变量内容是存储在堆中,引用就是用符号表中的不同符号(symbol)名称来访问同一存储内容,和Unix文件系统中的hardlink是同一个概念,比如:

 代码如下 复制代码

<?php
$a = 1;
$b = &$a; //$a与$b指向同一内容
$b = 2;
echo $b; //2
echo $a; //2
传递引用
引用传递很简单,就是一个「&」符号,比如:

<?php
function foo(&$a) {
  $a = 2;
}

$b = 1;
foo($b);
echo $b; //2

返回引用
大多数情况下并不需要返回引用来提高性能,zend引擎会自己进行优化,但是如果你非得返回引用得话,可以按照以下方式来返回引用:

 代码如下 复制代码

<?php
class foo {
    public $value = 42;

    public function &getValue() { // 需要一个"&"
        return $this->value;
    }
}

$obj = new foo;
$myValue = &$obj->getValue(); // 还需要一个"&",$myValue是对class foo中的$value的引用
$obj->value = 2;              // 修改对象的$value属性
echo $myValue;                // 输出2,$myValue与class foo中的$value值相同

与指针的区别
引用与指针很像,但是其并不是指针,看如下的代码:

 代码如下 复制代码
<?php
    $a = 0;
    $b = &a;
    echo $a; //0
    unset($b);
    echo $a; //0

由于$b只是$a的别名,所以即使$b被释放了,$a没有任何影响,但是指针可不是这样的,看如下代码:

 代码如下 复制代码

#include <stdio.h>
int main(int argc, char const *argv[]) {
    int a = 0;
    int* b = &a;

    printf("%in", a); //0
    free(b);
    printf("%in", a); //*** error for object 0x7fff6350da08: pointer being freed was not allocated
}

由于b是指向a的指针,所以释放了b的内存之后,再访问a就会出现错误,比较明显的说明了PHP引用与C指针的区别。

对象与引用
在PHP中使用对象的时候,大家总是被告知“对象是按照引用传递的”,其实这是个误区。PHP的对象变量存储的是此对象的一个标示符,在传递对象的时候,其实传递的就是这个标示符,而并不是引用,看如下代码:

 代码如下 复制代码

<?php
$a = new A;
$b = $a;   
$b->testA = 2;

/*
 * 此时$a,$b的关系:
 *        +-----------+      +-----------------+
 * $a --> | object id | ---> | object(Class A) |
 *        +-----------+      +-----------------+
 *                               ^
 *        +-----------+          |
 * $b --> | object id | ---------+
 *        +-----------+   
 *
 *
 */

$c = new B;
$a = $c;
$a->testB = "Changed Class B";

/*
 * 此时$a,$b,$c的关系:
 *        +-----------+      +-----------------+
 * $b --> | object id | ---> | object(Class A) |
 *        +-----------+      +-----------------+
 *                              
 *        +------------+         
 * $a --> | object id2 | -------------+
 *        +------------+              |
 *                                    v
 *        +------------+      +-----------------+
 * $c --> | object id2 | ---> | object(Class B) |
 *        +------------+      +-----------------+
 */

echo "object a: "; var_dump($a); //["testB"]=> string(15) "Changed Class B"
echo "object b: "; var_dump($b); //["testA"] => int(2)
echo "object c: "; var_dump($c); //["testB"]=> string(15) "Changed Class B"

如果对象是按照引用传递的,那么$a, $b, $c输出的内容应该一样,事实上结果并非如此。 看下面通过引用传递对象的列子:

 代码如下 复制代码

<?php
$aa = new A;
$bb = &$aa;  // 引用
$bb->testA = 2;

/*
 * 此时$aa, $bb的关系:
 *
 *         +-----------+      +-----------------+
 * $bb --> | object id | ---> | object(Class A) |
 *         +-----------+      +-----------------+
 *              ^                 
 *              |
 * $aa ---------+
 *
 *
 */

$cc = new B;
$aa = $cc;
$aa->testB = "Changed Class B";

/*
 * 此时$aa, $bb, $cc的关系:
 *
 *         +-----------+      +-----------------+
 *         | object id | ---> | object(Class A) |
 *         +-----------+      +-----------------+
 *             
 * $bb ---->-----+     
 *               |
 * $aa ---->-----+
 *               | 
 *               v  
 *         +------------+     
 *         | object id2 | --------------+
 *         +------------+               |
 *                                      v
 *         +------------+      +-----------------+
 * $cc --> | object id2 | ---> | object(Class B) |
 *         +------------+      +-----------------+
 */

echo "object aa: "; var_dump($aa); //["testB"]=>string(15) "Changed Class B"
echo "object bb: "; var_dump($bb); //["testB"]=>string(15) "Changed Class B"
echo "object cc: "; var_dump($cc); //["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 &lt; count($test01); $i++) {    
    echo $test01[$i];
}
// foreach value only
foreach ($test01 as $value) {
    echo $value;
}
// foreach key and value
$test01 = array('a' =&gt; 'aaaa', 'b' =&gt; 'bbbb', 'c' =&gt; 'cccc');
foreach ($test01 as $key =&gt; $value) {
    echo "$key =&gt; $value";
}

2.迭代器遍历
PHP中,迭代遍历主要要用到以下函数。
current() 迭代的当前元素。
reset() 重新移动到第一个元素并返回它。
next() 移动到下一个元素并返回它。
prev() 移动到上一个元素并返回它。
end() 移动到最后一个元素并返回它。
each() 以数组的形式返回当前元素的索引和值,并移动到下一个迭代。
key() 返回当前的索引。
array_ walk() 为每一个元素调用函数。
array_ reduce() 为每一个元素依次计算。

 代码如下 复制代码


$test01 = array('a' =&gt; 'aaaa', 'b' =&gt; 'bbbb', 'c' =&gt; 'cccc');
while (list($key, $value) = each($test01)) {
    echo "$key =&gt; $value" . "n";
}
array_walk($test01, walk_test);
function walk_test($key, $value) {
    echo "walk: $key =&gt; $value" . "n";
}

$test02 = array(1, 2, 3, 4, 5);
echo array_reduce($test02, reduce_test);
function reduce_test($run_result, $current_value) {
    return $run_result + $current_value * $current_value;
}


3.数组的排序


在PHP中,排序方式有三种,通过索引排序、通过值排序(不保留原索引)、通过值排序(保留原索引)。每种又分为升序、降序以及用户定义顺序三个函数。它们分别如下:
通过索引排序:①升序 ksort() ②降序 krsort() ③用户定义顺序 uksort()
不保留原索引值排序:①升序 sort() ②降序 rsort() ③用户定义顺序 usort()
保留原索引值排序:①升序 asort() ②降序 arsort() ③用户定义顺序 uasort()
在PHP中,也可以用array_multisort来一次排序多个数组,不过项目中可能用得比较少。
翻转数组,把数字索引翻转,索引重新从0开始:array_reverse()
把索引和值调换:array_flip()
随机顺序:shuffle()

引用文件在php中与asp中引用文件有一定区别,下面我来介绍在php中利用require 与include引用文件实例吧。

引用文件是PHP在一大特特色之一,这个方法可以将常用的功能与函数放在一个文件之中,而其他页面需要用到这些功能或函数时,就直接通过引用这个文件来调用这些函数了。如果不引用的话,重新在那个页面上写上相同的函数会大大的加重开发者的工作量,也加大了程序的代码量,不利于后期的维护以及二次开发。

PHP引用文件的方法有两,分别利用到的函数是 require() 和 include() 。两种引用的效果是一样的,但这两个函数有不同之处:如果 require 引用文件时不反回任何值,出错就致命的错误,程序将终止继续执行;使用该函数进行引用时,你要确保代码都是正确的情况下使用。而当 include 引用文件时有反回值,出错时它仍继续执行后面代码。所以建议大家尽量使用第一个函数 require 来引用文件,它没有值反回,速度和效率上相对比 include 要快。而通常 require 会放在PHP程序的最前面,PHP 程序在执行前,就会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份。常用的函数,亦可以这个方法将它引入网页中。

 代码如下 复制代码

<?php
    require('sql.php'); // 该函数通常放在开头,例如:引用SQL数据库连接函数的文件
    echo '引用文件示范';
    include('hello-world.php'); // 该函数一般是放在流程控制的处理部分中
?>

这时有人可能就会问,当某个页面引用多个文件时,而这些被引用的文件也都引用了其它一个或多个相同的文件,有时侯没必要引用那么多次,那么怎样才让PHP只引用一次就行了呢?当然,PHP也有对应的方法的,就是在原函数的基础上加上个“后缀”一样的声明,就是把函数分别变为 require_once()和 include_once(),如下示例:

 代码如下 复制代码

<?php
    require_once('sql.php'); // 声明只引用sql.php文件一次
    echo '引用文件示范';
    include_once('hello-world.php'); //声明只引用hello-world.php文件一次
?>

本文章来给大家总结一下关于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求和各种实例程序,希望对大家有所帮助。

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;
?>
[!--infotagslink--]

相关文章

  • C#中using的三种用法

    using 指令有两个用途: 允许在命名空间中使用类型,以便您不必限定在该命名空间中使用的类型。 为命名空间创建别名。 using 关键字还用来创建 using 语句 定义一个范围,将在此...2020-06-25
  • iscroll.js 用法介绍

    最新版下载: http://www.csdn123.com/uploadfile/2015/0428/20150428062734485.zip 概要 iScroll 4 这个版本完全重写了iScroll这个框架的原始代码。这个项目的产生...2016-05-19
  • C++中cin的用法详细

    这篇文章主要介绍了C++中cin的用法详细,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C#中的try catch finally用法分析

    这篇文章主要介绍了C#中的try catch finally用法,以实例形式分析了try catch finally针对错误处理时的不同用法,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 示例详解react中useState的用法

    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
  • php中php://input的用法详细

    在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组。所以,这里主要探讨php输入流php://input。 下面的例子摘取的是wordpres...2016-11-25
  • Delphi常用关键字用法详解

    这篇文章主要介绍了Delphi常用关键字用法,包括了各个常用的关键字及其详细用法,需要的朋友可以参考下...2020-06-30
  • MySQL中的主键以及设置其自增的用法教程

    1、声明主键的方法: 您可以在创建表的时候就为表加上主键,如: CREATE TABLE tbl_name ([字段描述省略...], PRIMARY KEY(index_col_name)); 也可以更新表结构时为表加上主键,如: ALTER TABLE tbl_name ADD PRIMARY KEY (in...2015-11-24
  • C#中this的用法集锦

    本文给大家汇总介绍了C#中的几种this用法,相信大家应该有用过,但你用过几种?以下是个人总结的this几种用法,欢迎大家拍砖,废话少说,直接列出用法及相关代码。...2020-06-25
  • window.onerror()的用法与实例分析

    目前在做window.onerror时上报js错误信息的事,整理下相关资料,需要的朋友可以参考下...2016-01-29
  • C语言循环结构与时间函数用法实例教程

    这篇文章主要介绍了C语言循环结构与时间函数用法,是C语言中非常重要的一个技巧,需要的朋友可以参考下...2020-04-25
  • php中 ->与 ==>符号的用法与区别

    本文章来给大家介绍一下在php中 ->与 ==>符号的用法与区别,有需要了解的朋友可尝试参考。 “->”(减号、右尖括号) 用于类中,访问类里的函数或对象,比如:...2016-11-25
  • JavaScript对象参数的引用传递

    这篇文章主要为大家介绍了JavaScript对象参数的引用传递的相关资料,感兴趣的小伙伴们可以参考一下...2016-01-15
  • foreach()有两种用法

    foreach()有两种用法 1: foreach(array as $value) { 表达式; } 这里的array是你要遍历的数组名,每次循环中,array数组的当前元素的值被赋给$value,...2016-11-25
  • php __FILE__用法

    __FILE__在php是表示当前文件绝对路径哦,下面我们来看看简单的FILE的实例吧。 《?php echo __FILE__; ?> E:phpinfo.php 那么我们会看到很多cms中会这样写 dirname...2016-11-25
  • Sort()函数的多种用法

    sort() 方法用于对数组的元素进行排序。接下来通过本文给大家介绍Sort()函数的多种用法,对sort函数的用法相关知识感兴趣的朋友一起学习...2016-03-22
  • ES6学习教程之Promise用法详解

    这篇文章主要给大家介绍了关于ES6学习教程之Promise用法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-23
  • C#分屏控件用法实例

    这篇文章主要介绍了C#分屏控件用法实例,需要的朋友可以参考下...2020-06-25
  • Python Parser的用法

    这篇文章主要介绍了Python Parser的用法,文中有非常详细的代码示例,对正在学习python的小伙伴们有很好地帮助,需要的朋友可以参考下...2021-05-12