PHP引用传递与引用&一些用法介绍
在php中引用是使用&来做,下面我来给大家介绍在php引用一些用法与引用问题与事项实例,欢迎各位朋友进入参考。
引用是什么
在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是,引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的 hardlink。
引用做什么
PHP 的引用允许用两个变量来指向同一个内容。
当 $a =& $b; 时 $a 和 $b 指向了同一个变量。
提示:$a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方。
可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。语法如下:
代码如下 | 复制代码 |
function foo(&$var) // 输出的是: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 ?> |
引用做的第二件事是用引用传递变量。这是通过在函数内建立一个本地变量,并且该变量在呼叫范围内引用了同一个内容来实现的。说的通俗点就是一个函数的参数是一个本地变量的引用。下面再举例说明一下:
代码如下 | 复制代码 |
function foo(&$val1, $val2) { |
运行这段代码是给函数传递两个参数,一个是引用$a的内容,一个是$b的值,在执行此函数后,发现$a的内容改变了,而$b的内容则没有变化。
PHP引用以及误区
PHP中的引用可以理解成变量的别名。由于PHP的变量名是存储在符号表(symbol table)中的,变量内容是存储在堆中,引用就是用符号表中的不同符号(symbol)名称来访问同一存储内容,和Unix文件系统中的hardlink是同一个概念,比如:
代码如下 | 复制代码 |
$a = 1;
function foo(&$a) { $b = 1; |
返回引用
大多数情况下并不需要返回引用来提高性能,zend引擎会自己进行优化,但是如果你非得返回引用得话,可以按照以下方式来返回引用:
代码如下 | 复制代码 |
class foo { public function &getValue() { // 需要一个"&" $obj = new foo; |
与指针的区别
引用与指针很像,但是其并不是指针,看如下的代码:
代码如下 | 复制代码 |
$a = 0; $b = &a; echo $a; //0 unset($b); echo $a; //0 |
由于$b只是$a的别名,所以即使$b被释放了,$a没有任何影响,但是指针可不是这样的,看如下代码:
代码如下 | 复制代码 |
#include printf("%in", a); //0 |
由于b是指向a的指针,所以释放了b的内存之后,再访问a就会出现错误,比较明显的说明了PHP引用与C指针的区别。
对象与引用
在PHP中使用对象的时候,大家总是被告知“对象是按照引用传递的”,其实这是个误区。PHP的对象变量存储的是此对象的一个标示符,在传递对象的时候,其实传递的就是这个标示符,而并不是引用,看如下代码:
代码如下 | 复制代码 |
$a = new A; /* $c = new B; /* echo "object a: "; var_dump($a); //["testB"]=> string(15) "Changed Class B" |
如果对象是按照引用传递的,那么$a, $b, $c输出的内容应该一样,事实上结果并非如此。 看下面通过引用传递对象的列子:
代码如下 | 复制代码 |
$aa = new A; /* $cc = new B; /* echo "object aa: "; var_dump($aa); //["testB"]=>string(15) "Changed Class B" |
此时$aa,$bb,$cc三者内容完全一样,所以可以看出对象并不是按照引用传递,要尽快走出这个误区。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP でデータベースを操作するのは非常に簡単です。この章では、CRUD (作成、読み取り、更新、削除) 操作について理解します。

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP へのログインは非常に簡単な作業です。使用する関数は 1 つだけです。 cronjob などのバックグラウンド プロセスのエラー、例外、ユーザー アクティビティ、ユーザーが実行したアクションをログに記録できます。 CakePHP でのデータのログ記録は簡単です。 log()関数が提供されています

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、
