本章說說變數的定義。
如果對於變數和常量的定義,你會注意幾個方面呢?你可能會想到:
分別講述吧。
1.如何定義變數,它和c# 等語言有什麼不同呢?
php 中的變數用乙個美元符號後面跟變數名來表示。變數名是區分大小寫的。例如:
<?php
$var='
jim'
;$var='
kimi;
echo "$var,$var";//輸出「jim,kimi"
?>
你可能還關心變數的命名,其實和大多數語言一樣。
2. 變數區分大小寫嗎?
如 1裡說的,區分大小寫。
注意,需要說明的一點是自php4以來,引入了引用賦值的概念,其實和多數語言的引用類似,不過我覺得最類似的是c/c++.因為它也用到了"&"符號。例如:
1php2
$foo='
bob'
;
//賦值'bob'給foo
3$bar=&
$foo
;
//通過$bar引用.注意&符號
4$bar="
my name is $bar
";
//修改 $bar
5echo
$bar;6
echo
$foo
;
//$foo 也修改了.
7?>
和其他語言一樣,只能對有變數名的變數才可以引用。
3. php其他重要點
預定義變數
預定義變數在php是乙個重要的概念。 php 提供了大量的預定義變數。由於許多這些變數依賴於執行的伺服器的版本和設定,及其它因素,所以並沒有詳細的說明文件。一些預定義變數在 php 以命令列形式執行時並不生效。
需要注意的是 在php 4.2.0 以及後續版本中,php 指令
register_globals 的預設值為
off。這是 php 的乙個主要變化。讓 register_globals 的值為
off將影響到預定義變數集在全域性範圍內的有效性。例如,為了得到
document_root 的值,將必須使用
$_server['document_root'] 代替
$document_root,又如,使用
$_get['id'] 來代替
$id 從 url
中獲取 id 值,亦或使用
$_env['home'] 來代替
$home 獲取環境變數 home 的值。
從 php 4.1.0 開始,php 提供了一套附加的預定陣列,這些陣列變數包含了來自 web 伺服器(如果可用),執行環境,和使用者輸入的資料。這些陣列非常特別,它們在全域性範圍內自動生效,例如,在任何範圍內自動生效。因此通常被稱為自動全域性變數(autoglobals)或者超全域性變數(superglobals)。(php 中沒有使用者自定義超全域性變數的機制。)超全域性變數羅列於下文中;而且,你也將注意到舊的預定義陣列(
$http_*_vars)仍舊存在。自 php 5.0.0 起,長格式的 php 預定義變數可以通過設定register_long_arrays來遮蔽。
下表是php的超全域性變數:
超全域性變數
描述
$globals
包含乙個引用指向每個當前指令碼的全域性範圍內有效的變數。該陣列的鍵名為全域性變數的名稱。從 php 3 開始存在 $globals 陣列。
$_server
變數由 web 伺服器設定或者直接與當前指令碼的執行環境相關聯。類似於舊陣列 $http_server_vars 陣列(依然有效,但反對使用)。
$_get
經由 url 請求提交至指令碼的變數。類似於舊陣列 $http_get_vars 陣列(依然有效,但反對使用)。
$_post
經由 http post 方法提交至指令碼的變數。類似於舊陣列 $http_post_vars 陣列(依然有效,但反對使用)。
$_cookie
經由 http cookies 方法提交至指令碼的變數。類似於舊陣列 $http_cookie_vars 陣列(依然有效,但反對使用)。
$_files
經由 http post 檔案上傳而提交至指令碼的變數。類似於舊陣列 $http_post_files 陣列(依然有效,但反對使用)
$_env
執行環境提交至指令碼的變數。類似於舊陣列 $http_env_vars 陣列(依然有效,但反對使用)。
$_request
經由 get,post 和 cookie 機制提交至指令碼的變數,因此該陣列並不值得信任。所有包含在該陣列中的變數的存在與否以及變數的順序均按照 php.ini 中的 variables_order 配置指示來定義。此陣列在 php 4.1.0 之前沒有直接對應的版本。參見import_request_variables()。
$_session
當前註冊給指令碼會話的變數。類似於舊陣列 $http_session_vars 陣列(依然有效,但反對使用)
變數的應用範圍
每個變數都有應用範圍,那麼php是怎麼定義的呢?還是先看看下面**吧: 1
php2
$var=0
;3function
test(
$index)4
8test(1);
9test(2)
10?>
你認為以上的**會顯示什麼結果呢?
如果你認為是下面:
結果1:
the
1number
is 1
the
2number
is 2
不好意思,你的結果是錯誤的。
其實正確的結果應該是:
結果2the
1number
is 1
the
2number
is 1
那麼你從其中發現了什麼呢?我們可以知道雖然第2行的**定義在外面,但第5行的變數和它是不一樣的。第5行的變數僅在這個函式裡使用。進一步的,如果我想呼叫第一行的變數而顯示結果2.**可以如下: 1
php2
$var=0
;3function
test(
$index)4
9test(1);
10test(2)
11?>
這個**段和上面的**段有何區別呢?注意第5行,多了乙個global關鍵字。明白了吧。
那麼還有沒有其他方法呢?答案是肯定的。
**如下: 1
php2
$var=0
;3function
test(
$index)4
9test(1);
10test(2)
11?>
**有什麼特殊的嗎?那就是用到了
$globals這個超全域性變數。
php也有靜態變數的說法。不過靜態變數一般用在函式裡,只能是區域性變數了。看看下面**吧: 1
php2
function
test()38
test();
9test();
10?>
結果為 1
2 php還有乙個相當令人興奮的特性:可變變數
所謂可變變數,就是乙個變數的變數名可以動態的設定和使用。
看看下面的例子: 1
php2$a=
"hello";
3$hello="
world";
4echo$a.
"".$
$a;5?>
輸出的結果居然是hello,world.太神奇了。$$a其實就是$hello,因為$a的值是hello。
變數就這多了。下面看看常量。
常量
php的常量是不是前面加const呢?讓我們看一看。
不是的。在php必須用下面的方式定義。
booldefine( string name, mixed value [, bool case_insensitive] )
name 為常量名,value為常量的值。case_insensitive]為大小寫敏感。預設為敏感。例如: 1
php2
define("
constant",
"hello world.");
3echo
constant
; //
outputs "hello world."
4echo
constant
; //
outputs "constant" and issues a notice.56
define("
greeting",
"hello you.",
true);7
echo
greeting;
//outputs "hello you."
8echo
greeting;
//outputs "hello you."910
?>
常量和變數不同:
PHP中的魔術常量 預定義常量和預定義變數
1.魔術常量 php中有八個魔術常量,它們的值會隨著它們在 中的位置的改變而改變。這些特殊的常量不區分大小寫。2.預定義常量 核心預定義常量 是在php的核心中就定義好了的常量。區分大小寫。php version 返回php的版本。php os 返回 執行php直譯器的作業系統名稱。php eol ...
php常量及變數定義方法
1.定義常量define constant hello world.常量只能包含標量資料 boolean,integer,float 和 string 呼叫常量時,只需要簡單的用名稱取得常量的值,而不能加 符號,如 echo constant 注 常量和 全域性 變數在不同的名字空間中。這意味著例如...
php預定義常量 變數
php中可以使用預定義常量獲取php中的資訊,常用的預定義常量如下表所示。常量名功能 file 預設常量,php程式檔名 line 預設常量,php程式行數 php version 內建常量,php程式的版本,如3.0.8 dev php os 內建常量,執行php解析器的作業系統名稱,如windo...