欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解php中unset()

 更新時間:2021年04月19日 10:48:58   作者:貝倫醬  
這篇文章主要介紹了深入理解php中unset(),對unset感興趣的同學,可以參考下

概述

unset()經常會被用到,用于銷毀指定的變量,但它有自己的行為模式,如果不仔細的話可能會被中文解釋給迷惑:

先來看看官方文檔的說法:

unset  —— unset a given variable

void unset (mixed $var [,mixed $...]); 

parameters:

var:The variable to be unset.    //要unset的變量

...:Another variable ... //其他需要unset的變量

return Values:No value is returned.    //unset不返回值

Because this is a language construct and not a function,it cannot be called using variable functions.

//unset()是語言結構,不是函數,因此不能被函數變量調用,具體參照函數變量。

使用function_exists('unset')返回的false,以此證明unset并不是一個函數,所以無法使用$fun='unset';$fun()的方式調用unset()

It is possible to unset even object properties visible in current context.

//通用環(huán)境下unset可以銷毀對象或者對象的可見屬性(public)

It is not possible to unset $this inside an object method since PHP5

在php5之前unset無法銷毀對象中的$this方法

when using unset() on inaccessible  object properties,the __unset() overloading method will be called,if declare.

當unset()無法銷毀對象中的屬性,例如私有屬性,保護屬性,那么會自動加載對象中的__unset方法。

description:

unset() destroys the specified variables.     //unset()銷毀指定的變量

The behavior of unset() inside of a function can vary dependiing on what type of variable you are attempting to destroy.

//unset()的行為在函數內部可以根據你所指定銷毀的變量類型變化。

變化情況

情況一:

if a globalized variable is unset() inside of a function,only the local variable is destroyed.The variable in the calling environment will retain the same value as before unset() was called.

如果在函數內一個使用global使其全局化的變量,使用unset進行銷毀,那么只有局部的變量會被銷毀,在調用環(huán)境的變量將會保留沒有使用unset()銷毀之前的調用的變量值。

the example:

<?php
function destroy_foo() 
{
    global $foo;
    unset($foo);
}
$foo = 'bar';
destroy_foo();
echo $foo;
?>

the above example will output:bar

這是官方文檔的例子,可能這樣還是不太明顯,把上面的例子改成下面這樣,一切就很清晰了。

<?php 
function des(){
	global $foo;
	$foo='bars';
	unset($foo);
	echo $foo;
}
$foo='bar';
echo "The globalized variable is unset() inside of a function:";
des();
echo "<br/>";
echo "The variable in the calling environment:";
echo $foo;

上面的例子會返回如下結果:

可以看到函數內echo $foo會得到錯誤提示該變量沒有定義,因為unset將$foo在函數內的局部變量銷毀了。

而外部調用環(huán)境的$foo仍保留著沒有被unset進行銷毀,上面官方描述上寫了調用環(huán)境的$foo將保留的是在使用unset()前的變量值,因此echo出bars,而不是bar。

to unset() a global variable inside of a function,then use the $GLOBALS array to do so.

如果要用unset()銷毀函數中的全局變量,應該使用$GLOBALS數組形式

function destroy_foo(){
	unset($GLOBALS['foo']);
}
$foo = 'bar';
destroy_foo();
echo $foo;

the above example whill output: Notice: Undefined variable: foo in ...

延伸:

這里可以明確一點,函數內global修飾的變量$var會使其全局化,但和$GLOBALS['var']性質不同,雖然他們都是使用的外部調用環(huán)境的$var,但是函數內global $var里保存的只是外部環(huán)境調用變量$val的一個指針或者同名引用,而$GLOBALS['var']是外部調用環(huán)境$var本身,因此unset在函數內對兩者進行銷毀會產生上面例子的不同的原因,前者銷毀的只是保存同名引用或者指針的變量$var,后者銷毀的是外部調用變量$var本身。

情況二:

if a variable  that is PASSED BY REFERENCE is unset() inside of a function,only the local variable is destroyed.The variable in the calling environment will retain the same value as before unset() was called.

如果一個被引用的函數在函數內部使用unset()進行銷毀,那么只有函數內部的局部變量被銷毀,而調用環(huán)境變量仍然會保留unset()之前被調用的值。

<?php 
function foo(&$bar){
	unset($bar);
	$bar="blah";
}
$bar='something';
echo $bar."\n";
foo($bar);
echo $bar."\n";

The above example will output:something something

這個和上面global其實很相似,函數內部引用的變量$bar其實保存的是外部環(huán)境變量$bar的指針或者說外部變量$bar的引用,因此unset在函數內部銷毀的并不是外部環(huán)境調用的變量,因此外部環(huán)境調用的變量$bar還存在。

情況三:

if a static variable is unset() inside of a function,unset() destroys the variable only in the context of the rest of a function.Following calls will restore the previous value of a variable.

如果是函數內部的靜態(tài)變量使用unset(),unset()銷毀掉函數內部的靜態(tài)變量,但是下次調用會恢復之前該靜態(tài)變量的值。
為了更明顯,下面的例子進行對比,這里對官方的范例進行了修改對比:

<?php 
function fun1(){
	static $count=0;
	$count++;
	echo "before:".$count." ";
	$count='2';
	echo "after".$count." ";
}
for($i=0;$i<5;$i++){
	fun1();
	echo "<br/>";
}

output: 

下面使用unset:

<?php 
function fun1(){
	static $count=0;
	$count++;
	echo "before:".$count." ";
	unset($count);
	$count='2';
	echo "after".$count." ";
}
for($i=0;$i<5;$i++){
	fun1();
	echo "<br/>";
}

output: 

兩個對比可以看出,unset只是將函數內部的靜態(tài)變量進行了銷毀,但沒有銷毀儲存在內存里的該靜態(tài)變量的值,因為在函數內部用static聲明的靜態(tài)變量存儲的僅僅是指向內存存儲該靜態(tài)變量的一個指針,因此unset()銷毀的時候也僅僅是銷毀了該指針,但存儲在內存里的靜態(tài)變量值沒有受到影響,因此再次調用該函數的時候,static該變量再次建立了與內存中該變量的指針關系,而上一次調用時unset()之前的該變量值依舊存在,因此會恢復該變量上一次的值,因此$count進行了遞增。

以上就是深入理解php中unset()的詳細內容,更多關于php unset()的資料請關注腳本之家其它相關文章!

相關文章

  • 網站用php實現paypal整合方法

    網站用php實現paypal整合方法

    雖然在中國paypal不是很流行,但如果把范圍擴大到世界的話,那paypal無疑就是老大了。
    2010-11-11
  • PHP iconv 函數轉gb2312的bug解決方法

    PHP iconv 函數轉gb2312的bug解決方法

    之前寫過一篇解決xajax庫中文亂碼的問題,說到可以用 iconv( "UTF-8", "gb2312" , $FormValues['a']) 來轉換,最近發(fā)現更好的寫法應該是。
    2009-10-10
  • PHP編程實現的TCP服務端和客戶端功能示例

    PHP編程實現的TCP服務端和客戶端功能示例

    這篇文章主要介紹了PHP編程實現的TCP服務端和客戶端功能,結合實例形式分析了php基于socket實現TCP服務器端與客戶端通信功能的相關配置、定義與使用技巧,需要的朋友可以參考下
    2018-04-04
  • PHP獲取時間戳等相關函數匯總

    PHP獲取時間戳等相關函數匯總

    PHP是一種廣泛使用的服務器端腳本語言,具有豐富的時間戳相關函數。本文介紹了PHP中獲取時間戳的常用函數,包括time()、strtotime()、date()等,并提供了使用示例。同時,還介紹了PHP中其他與時間相關的函數,如mktime()、microtime()等。
    2023-06-06
  • 使用PHP訪問RabbitMQ消息隊列的方法示例

    使用PHP訪問RabbitMQ消息隊列的方法示例

    這篇文章主要介紹了使用PHP訪問RabbitMQ消息隊列的方法,結合實例形式分析了RabbitMQ消息隊列的相關擴展安裝、隊列建立、隊列綁定、消息發(fā)送、消息接收等相關操作技巧,需要的朋友可以參考下
    2018-06-06
  • PHP以指定字段為索引返回數據庫所取的數據數組

    PHP以指定字段為索引返回數據庫所取的數據數組

    本文與大家分享幾個使用得PHP編程技巧,有些技巧是在看別人代碼的時候學來的,有些是自己總結的,下面為大家介紹下以特定字段為索引,返回數據庫取的數據數組,感興趣的朋友可以了解下哈
    2013-06-06
  • discuz目錄文件資料匯總

    discuz目錄文件資料匯總

    這篇文章主要介紹了discuz目錄文件資料匯總,需要的朋友可以參考下
    2014-12-12
  • php通過header增加Key、Sign和Timestamp實現鑒權機制的流程步驟

    php通過header增加Key、Sign和Timestamp實現鑒權機制的流程步驟

    在現代Web應用程序中,鑒權是確保只有合法用戶能夠訪問資源的關鍵部分,在PHP中,你可以通過在HTTP請求的Header中添加Key、Sign和Timestamp來實現鑒權機制,需要的朋友可以參考下
    2023-10-10
  • 使用Zookeeper分布式部署PHP應用程序

    使用Zookeeper分布式部署PHP應用程序

    今天小編就為大家分享一篇關于使用Zookeeper分布式部署PHP應用程序,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • PHP終止腳本執(zhí)行的實例代碼

    PHP終止腳本執(zhí)行的實例代碼

    在本篇文章里小編給大家整理的是關于PHP終止腳本執(zhí)行的實例代碼,需要的朋友們可以學習參考下。
    2020-03-03

最新評論