多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > PHP的可變變量名使用方法詳解

PHP的可變變量名使用方法詳解

來源:程序員人生   發布時間:2013-11-25 22:21:25 閱讀次數:3494次

有時候可變的變量名會給編程帶來很大的方便,也就是說變量名可以被動態的命名和使用,通常變量通過下面這樣的語句來命名,實例代碼如下:

  1. <?php  
  2. $a = 'hello';  
  3. ?> 

可變變量名指的是使用一個變量的值作為這個變量的名稱,在上面的例子中,通過使用兩個$符號,你可以把hello設置成一個變量的名稱,就像下面那樣,實例代碼如下:

  1. <?php  
  2. $$a = 'world';  
  3. ?> 

通過上面的兩個語句,有兩個變量被定義:變量$a,裝的內容是”hello” 以及變量$hello,裝的內容是 “world”,于是,下面的代碼:

  1. <?php  
  2. echo "$a ${$a}";  
  3. ?> 

跟下面的語句的輸出完全一致,代碼如下:

  1. <?php  
  2. echo "$a $hello";  
  3. ?> 

它們都輸出:hello world。

為了使用數組的可變變量名,你需要解決一個歧義問題,就是,如果你寫$$a[1],解析器需要明白究竟你的意思是要把$a[1]當成一個變量,還是要把$$a當成變量、[1]指的是這個變量的索引,解決這個歧義問題的語法是:第一種情況使用${$a[1]},第二種情況使用${$a}[1]。

類屬性也可以通過可變屬性名來訪問。可變屬性名從產生調用所在的變量的訪問范圍內獲取。例如,如果你的表達式是這樣的:$foo->$bar,那么運行時將會在本地變量范圍內尋找變量$bar,它的值將會做為$foo對象的一個屬性名。如果$bar是個數組也可以使用。

例1可變變量名,代碼如下:

  1. <?php  
  2.     class foo {  
  3.         var $bar = 'I am bar.';  
  4.     }  
  5.  
  6.     $foo = new foo();  
  7.     $bar = 'bar';  
  8.     $baz = array('foo''bar''baz''quux');  
  9.     echo $foo->$bar . "n";  
  10.     echo $foo->$baz[1] . "n";  
  11.     ?> 
  12. //上面的例子將會輸出下面的結果: 
  13. //I am bar. 
  14. //I am bar. 

警告:請注意,可變變量名不能用于PHP函數和類里的超級全局數組變量上,變量$this也是一個不能動態取名的特殊變量。

淺談PHP可變變量安全

變變量是PHP一個非常方便的特性,手冊里已經說了,可變變量的意思就是一個變量的變量名可以動態的設置!

那么變量的變量名可以動態設置會產生什么安全問題呢?下面來看看:

  1. <?php 
  2. $a = 'phpinfo'
  3. $a(); 
  4. ?> 

這段代碼很容易理解,變量的類型是字符型phpinfo,變量動態加上了(),于是變量變成了phpinfo函數動態執行了!

按照同樣的原理我們引用手冊中可變變量的例子:

  1. <?php 
  2. $a = 'phpinfo'
  3. ${$a()}; 
  4. ?> 
  5. $a() 

這個動態函數放入動態變量,當然我這個說法有點不專業,還是可變變量,我們會發現phpinfo函數還是執行了!

看過手冊還有我給出的這個例子的話,大家一定覺得這個一點都不神奇,這就是PHP的語法特性,然后我們把這個東西再進化縮成一行:

  1. <?php 
  2. $a = "${${phpinfo()}}"
  3. ?> 
這是一個2個嵌套的可變變量,我們只是按照上面一個例子將可變變量的內容自己填寫進去了,實際上就是把某個函數賦給某個變量,所以phpinfo函數最終執行了,也就化成了各種漏洞和webshell的原型!

看到這里大家應該知道了,為什么當初大牛們要我去看PHP手冊吧,然而本文到這里就結束了么,咱還漏了一點,大牛說了安全就是基礎,咱其實還沒把這個東西搞清楚,為什么前面例子的變量是用的單引號,而后面的最終的例子用的是雙引號,如果你想到了這個問題,我覺得你做安全肯定非常有潛力,以后保不準就是一大牛!

PHP中單引號和雙引號的區別還是和變量有關,來看下面的例子,代碼如下:

  1. <?php 
  2. $a = 'phpinfo()'
  3. echo $a//輸出phpinfo()字符串 
  4. echo '$a'//輸出$a字符串 
  5. echo "$a"//輸出phpinfo()字符串 
  6. ?> 

雙引號里的內容會再經過PHP的語法解析變量,而單引號里的內容就直接定性為字符串了!

所以本文到這里就真正結束了,于是大家應該也都明白了,當初牛人為什么和我說多看PHP手冊和安全就是基礎的深意。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 黑人又大又粗好爽好猛视频 | 久久成人亚洲 | 亚洲经典激情春色另类 | 操人视频免费 | 欧美乱性 | 国产精品久久亚洲一区二区 | 99久久免费国内精品 | 综合久久久久 | 最近免费中文字幕完整4 | 精品亚洲在线 | 欧美色交 | 俺也射| 综合免费一区二区三区 | 欧美亚洲天堂 | 欧美另类在线观看 | 国产视频一区二区在线观看 | 久久成人国产精品二三区 | 99久久中文字幕伊人 | 日本免费第一区二区三区 | 欧美黑人ⅹxxx片 | 亚洲视频一区二区在线观看 | 性激烈的欧美三级视频中文字幕 | 成片免费观看视频在线网 | 日本特级全黄一级毛片 | 久久欧美精品 | 免费人成激情视频在线观看冫 | 国产日韩一区 | 日韩天堂 | 亚洲精品视频久久久 | 亚洲视频在线网站 | 亚洲视频在线一区 | 亚洲视频精品在线 | 成人午夜在线观看 | 日韩一区二区久久久久久 | 欧美人与动人物xxxx9296 | 美国一级淫片 | 亚洲第3页 | 天堂最新| 男人看片网站 | 久久亚洲欧洲日产国码 | 亚洲a影院|