PHP 7:PHP變量和常量的定義
如果對于變量和常量的定義,你會注意幾個方面呢?你可能會想到:
◆ 如何定義變量,它和C# 等語言有什么不同呢?
◆ 變量區(qū)分大小寫嗎?
◆ PHP的變量還有其他重要的嗎?
◆ 常量和變量的定義一樣嗎?
分別講述吧。
1.如何定義變量,它和C# 等語言有什么不同呢?
PHP 中的變量用一個美元符號后面跟變量名來表示。變量名是區(qū)分大小寫的。例如:
- <?php
- $var='Jim';
- $VAR='Kimi;
- echo "$var,$VAR";//輸出“Jim,Kimi"
- ?>
你可能還關(guān)心變量的命名,其實和大多數(shù)語言一樣。
2. 變量區(qū)分大小寫嗎?
如 1里說的,區(qū)分大小寫。
注意,需要說明的一點是自PHP4以來,引入了引用賦值的概念,其實和多數(shù)語言的引用類似,不過我覺得最類似的是C/C++.因為它也用到了"&"符號。例如:
- <!--
- Code highlighting produced by Actipro CodeHighlighter (freeware)
- http://www.CodeHighlighter.com/
- -->1 <?php
- 2 $foo = 'Bob'; // 賦值'Bob'給foo
- 3 $bar = &$foo; // 通過$bar引用.注意&符號
- 4 $bar = "My name is $bar"; // 修改 $bar
- 5 echo $bar;
- 6 echo $foo; // $foo 也修改了.
- 7 ?>
和其他語言一樣,只能對有變量名的變量才可以引用。
3. PHP其他重要點
預(yù)定義變量
預(yù)定義變量在PHP是一個重要的概念。 PHP 提供了大量的預(yù)定義變量。由于許多這些變量依賴于運行的服務(wù)器的版本和設(shè)置,及其它因素,所以并沒有詳細的說明文檔。一些預(yù)定義變量在 PHP 以命令行形式運行時并不生效。
需要注意的是 在PHP 4.2.0 以及后續(xù)版本中,PHP 指令 register_globals 的默認值為 off。這是 PHP 的一個主要變化。讓 register_globals 的值為 off 將影響到預(yù)定義變量集在全局范圍內(nèi)的有效性。例如,為了得到DOCUMENT_ROOT 的值,將必須使用 $_SERVER['DOCUMENT_ROOT'] 代替 $DOCUMENT_ROOT,又如,使用 $_GET['id'] 來代替 $id 從 URL http://www.example.com/test.php?id=3 中獲取 id 值,亦或使用$_ENV['HOME'] 來代替 $HOME 獲取環(huán)境變量 HOME 的值。
從 PHP 4.1.0 開始,PHP 提供了一套附加的預(yù)定數(shù)組,這些數(shù)組變量包含了來自 web 服務(wù)器(如果可用),運行環(huán)境,和用戶輸入的數(shù)據(jù)。這些數(shù)組非常特別,它們在全局范圍內(nèi)自動生效,例如,在任何范圍內(nèi)自動生效。因此通常被稱為自動全局變量(autoglobals)或者超全局變量(superglobals)。(PHP 中沒有用戶自定義超全局變量的機制。)超全局變量羅列于下文中;而且,你也將注意到舊的預(yù)定義數(shù)組($HTTP_*_VARS)仍舊存在。自 PHP 5.0.0 起,長格式的 PHP 預(yù)定義變量可以通過設(shè)置 register_long_arrays 來屏蔽。
下表是PHP的超全局變量:
超全局變量 | 描述 |
$GLOBALS | 包含一個引用指向每個當(dāng)前腳本的全局范圍內(nèi)有效的變量。該數(shù)組的鍵名為全局變量的名稱。從 PHP 3 開始存在 $GLOBALS 數(shù)組。 |
$_SERVER | 變量由 web 服務(wù)器設(shè)定或者直接與當(dāng)前腳本的執(zhí)行環(huán)境相關(guān)聯(lián)。類似于舊數(shù)組 $HTTP_SERVER_VARS 數(shù)組(依然有效,但反對使用)。 |
$_GET | 經(jīng)由 URL 請求提交至腳本的變量。類似于舊數(shù)組 $HTTP_GET_VARS 數(shù)組(依然有效,但反對使用)。 |
$_POST | 經(jīng)由 HTTP POST 方法提交至腳本的變量。類似于舊數(shù)組 $HTTP_POST_VARS 數(shù)組(依然有效,但反對使用)。 |
$_COOKIE | 經(jīng)由 HTTP Cookies 方法提交至腳本的變量。類似于舊數(shù)組 $HTTP_COOKIE_VARS 數(shù)組(依然有效,但反對使用)。 |
$_FILES | 經(jīng)由 HTTP POST 文件上傳而提交至腳本的變量。類似于舊數(shù)組 $HTTP_POST_FILES 數(shù)組(依然有效,但反對使用) |
$_ENV | 執(zhí)行環(huán)境提交至腳本的變量。類似于舊數(shù)組 $HTTP_ENV_VARS 數(shù)組(依然有效,但反對使用)。 |
$_REQUEST | 經(jīng)由 GET,POST 和 COOKIE 機制提交至腳本的變量,因此該數(shù)組并不值得信任。所有包含在該數(shù)組中的變量的存在與否以及變量的順序均按照 php.ini 中的 variables_order 配置指示來定義。此數(shù)組在 PHP 4.1.0 之前沒有直接對應(yīng)的版本。參見 import_request_variables()。 |
$_SESSION | 當(dāng)前注冊給腳本會話的變量。類似于舊數(shù)組 $HTTP_SESSION_VARS 數(shù)組(依然有效,但反對使用) |
#p#
變量的應(yīng)用范圍
每個變量都有應(yīng)用范圍,那么PHP是怎么定義的呢?還是先看看下面代碼吧:
- <!--
- Code highlighting produced by Actipro CodeHighlighter (freeware)
- http://www.CodeHighlighter.com/
- --> 1 <?php
- 2 $var=0;
- 3 function test($index)
- 4 {
- 5 $var=$var+1;
- 6 echo "The ".$index." number is ".$var."<br>";
- 7 }
- 8 test(1);
- 9 test(2)
- 10 ?>
你認為以上的代碼會顯示什么結(jié)果呢?
如果你認為是下面:
結(jié)果1:
- <!--
- Code highlighting produced by Actipro CodeHighlighter (freeware)
- http://www.CodeHighlighter.com/
- -->The 1 number is 1
- The 2 number is 2
不好意思,你的結(jié)果是錯誤的。
其實正確的結(jié)果應(yīng)該是:
結(jié)果2
- <!--
- Code highlighting produced by Actipro CodeHighlighter (freeware)
- http://www.CodeHighlighter.com/
- -->The 1 number is 1
- The 2 number is 1
那么你從其中發(fā)現(xiàn)了什么呢?我們可以知道雖然第2行的代碼定義在外面,但第5行的變量和它是不一樣的。第5行的變量僅在這個函數(shù)里使用。進一步的,如果我想調(diào)用第一行的變量而顯示結(jié)果2.代碼可以如下:
- <!--
- Code highlighting produced by Actipro CodeHighlighter (freeware)
- http://www.CodeHighlighter.com/
- -->
- <?php
- $var=0;
- function test($index)
- {
- global $var;
- $var=$var+1;
- echo "The ".$index." number is ".$var."<br>";
- }
- test(1);
- test(2)
- ?>
這個代碼段和上面的代碼段有何區(qū)別呢?注意第5行,多了一個global關(guān)鍵字。明白了吧。
那么還有沒有其他方法呢?答案是肯定的。
代碼如下:
- <!--
- Code highlighting produced by Actipro CodeHighlighter (freeware)
- http://www.CodeHighlighter.com/
- -->
- <?php
- $var=0;
- function test($index)
- {
- $GLOBALS["var"]=$GLOBALS["var"]+1;
- echo "The ".$index." number is ".$GLOBALS["var"]."<br>";
- }
- test(1);
- test(2)
- ?>
代碼有什么特殊的嗎?那就是用到了$GLOBALS這個超全局變量。
PHP也有靜態(tài)變量的說法。不過靜態(tài)變量一般用在函數(shù)里,只能是局部變量了??纯聪旅娲a吧:
- <!--
- Code highlighting produced by Actipro CodeHighlighter (freeware)
- http://www.CodeHighlighter.com/
- -->
- <?php
- function Test()
- {
- static $a = 0;
- echo $a."<br>";
- $a++;
- }
- Test();
- Test();
- ?>
結(jié)果為
- <!--
- Code highlighting produced by Actipro CodeHighlighter (freeware)
- http://www.CodeHighlighter.com/
- -->1
- 2
PHP還有一個相當(dāng)令人興奮的特性:可變變量
所謂可變變量,就是一個變量的變量名可以動態(tài)的設(shè)置和使用。
看看下面的例子:
- <!--
- Code highlighting produced by Actipro CodeHighlighter (freeware)
- http://www.CodeHighlighter.com/
- --> <?php
- $a="hello";
- $hello="world";
- echo $a." ".$$a;
- ?>
輸出的結(jié)果居然是hello,world.太神奇了。$$a其實就是$hello,因為$a的值是hello。
變量就這多了。下面看看常量。
常量
PHP的常量是不是前面加const呢?讓我們看一看。
不是的。在PHP必須用下面的方式定義。
bool define ( string name, mixed value [, bool case_insensitive] )
name 為常量名,value為常量的值。case_insensitive]為大小寫敏感。默認為敏感。例如:
- <!--
- Code highlighting produced by Actipro CodeHighlighter (freeware)
- http://www.CodeHighlighter.com/
- -->
- <?php
- define("CONSTANT", "Hello world.");
- echo CONSTANT; // outputs "Hello world."
- echo Constant; // outputs "Constant" and issues a notice.
- define("GREETING", "Hello you.", true);
- echo GREETING; // outputs "Hello you."
- echo Greeting; // outputs "Hello you."
- ?>
常量和變量不同:
◆ 常量前面沒有美元符號($);
◆ 常量只能用 define() 函數(shù)定義,而不能通過賦值語句;
◆ 常量可以不用理會變量范圍的規(guī)則而在任何地方定義和訪問;
◆ 常量一旦定義就不能被重新定義或者取消定義;
◆ 常量的值只能是標(biāo)量。
原文:http://blog.csdn.net/jpr1990/article/details/7072281
【編輯推薦】