變量基礎

變量基礎

PHP中的變量用一個美元符號後面跟變量名來表示。變量名是區分大小寫的,並且出現中文可能也是合法的。

變量默認總是傳值賦值。PHP也提供了另外一種方式給變量賦值:引用賦值。這意味着新的變量簡單的引用(換言之,”成爲其別名” 或者 “指向”)了原始變量。改動新的變量將影響到原始變量,反之亦然。使用引用賦值,簡單地將一個&符號加到將要賦值的變量前(源變量)。注意,只有有名字的變量纔可以引用賦值。

預定義變量

PHP擁有大量預定義變量,許多變量依賴與服務器,某些預定義變量以命令行形式運行時並不生效。

PHP提供了一套附加的預定數組,這些數組變量包含了來自web服務器(如果可用),運行環境,和用戶輸入的數據,通常被稱爲自動全局變量(autoglobals)或者超全局變量(superglobals)。

變量範圍

這裏的變量範圍指的是,它定義的上下文背景,也就是它的生效範圍。變量的範圍包含了include和require引入的文件。

PHP的全局變量和C語言有一點點不同,在C語言中,全局變量在函數中自動生效,除非被局部變量覆蓋。PHP中全局變量在函數中使用時必須聲明爲global。

<?php $a = 'hello';function test() {
    var_dump($a);
}// test();include 'b.inc';

b.inc內容如下:

<?php echo 'hello';?>

該程序能夠正常輸出hello,但是被註釋掉的test()不能正常解析,因爲變量$a是未定義的。

使用全局變量

若在某個函數中想使用全局變量,可以通過下面兩種方式。

  1. global關鍵字

global $a, $b;

在函數中聲明全局變量後,對任一變量的所有引用都會指向其全局版本。

  1. $GLOBALS超全局變量數組

$GLOBALS['b'] = $GLOBALS['a'] + $BLOBALS['b'];

用法同global關鍵字相似。

靜態變量

靜態變量僅在局部函數域中存在,但當程序執行離開此作用域時,其值並不丟失。並且,只在聲明時初始化一次,每次調用函數並不會覆蓋靜態函數的值。

靜態變量在聲明中用表達式的結果對其賦值會導致解析錯誤,靜態聲明是在編譯時解析的。

<?php function test() {    static $cnt = 0;    echo $cnt;    $cnt++;    if($cnt < 10) {
        test();
    }    $cnt--;
}
test();

和C語言的static相似,下面這段C代碼也可以把0~9十個數字依次輸出。

#include <stdio.h>void test(void) {    static int cnt = 0;    printf("%d ", cnt);
    cnt++;    if(cnt < 10) {
        test();
    }
    cnt--;
}int main(void) {
    test();    return 0;
}

對於變量的static和global定義是以引用的方式實現的。

可變變量

可變變量是PHP語言中的一種特殊用法,不知其他語言存不存在。

簡而言之,可變變量就是,一個可變變量獲取了一個普通變量的值作爲這個可變變量的變量名。

<?php $a = 'hello';$$a = 'world';echo "$a $$a";  // hello $helloecho "$a ${$a}";  // hello world

當可變變量用於數組時,可能會出現模棱兩可的問題。比如,寫下$$a[1],編譯器會報錯的,你想要表達的意思需要用下面兩種方式替換掉。

${$a[1]}
$a[1]作爲一個變量

${$a}[1]
$$a作爲一個變量並取出變量中索引爲1的值。

表單變量

當表單提交給PHP腳本時,表單中的信息自動在腳本中可用,可以通過$_GET[]$_POST[]$_REQUEST[]訪問。

注意,變量名中的點和空格被轉換成下劃線。例如<input name="a.b">變成了$_REQUEST["a_b"],下面的示例中展示了表單中標識符的使用。

<form action="process.php" method="post"><input name="my.text" type="text"><input name="my text" type="text"><input name="my_text" type="text"><input type="submit"></form>

表單處理文件process.php

<?php var_dump(isset($_POST['my.text']));
var_dump(isset($_POST['mytext']));
var_dump(isset($_POST['my_text']));
var_dump($_POST['my_text']);

因爲句點不是PHP變量名中的合法字符,輸出結果如下所示。

boolean falseboolean falseboolean truestring 'h3' (length=2)

magic_quotes_gpc配置指令影響到get/post/cooie的值,這個特性已經廢棄移除,輸入中的單引號、雙引號、反斜槓和NULL字符都不會被轉義。若需要轉義可使用addslashes(),若需要反引用一個引用的字符串需要使用stripslashes()

PHP也懂得表單變量上下文中的數組,下面的例子使用了更復雜的表單變量,並將表單post給自己並在提交時顯示數據。

<?php if(isset($_POST['action'])) {
    var_dump($_POST);
} else {    $page = $_SERVER['PHP_SELF'];    $s = <<<STR
<form action="{$_SERVER['PHP_SELF']}" method="post">
<input type="text" name="personal[name]">
<input type="text" name="personal[detail]">
<select multiple name="option[]">
    <option value="a">a</option>
    <option value="b">b</option>
    <option value="c">c</option>
</select>
<input type="hidden" name="action" value="submitted">
<input type="submit" name="submit">
</form>
STR;
    echo $s;
}

在heredoc中含有複雜變量時要格外小心,上面這段代碼$_SERVER['PHP_SELF']不加花括號會在運行時報錯。

array (size=4)  'personal' => 
    array (size=2)      'name' => string 'hello' (length=5)      'detail' => string 'world' (length=5)  'option' => 
    array (size=2)      0 => string 'a' (length=1)      1 => string 'c' (length=1)  'action' => string 'submitted' (length=9)  'submit' => string '提交查詢內容' (length=12)

IMAGE提交

當提交表單時,可以用一張圖片代替標準的提交按鈕。第一次使用,真的好神奇。

<?php if(isset($_POST['action'])) {
    var_dump($_POST);
} else {    $s = <<<STR
<form action="{$_SERVER['PHP_SELF']}" method="post">
<input type="hidden" name="action" value="1">
<input type="image" src="go.jpg" name="sub">
</form>
STR;
    echo $s;
}

對於上面這段程序,當用戶點擊圖片某處時,表單會傳送到服務器,並加上兩個變量sub_xsub_y,包含了用戶點擊圖片的座標。

array (size=3)  'action' => string '1' (length=1)  'sub_x' => string '334' (length=3)  'sub_y' => string '282' (length=3)

cookies

PHP可以用setcookie()函數設定cookies,cookies是HTTP信息頭的一部分,因此必須在向瀏覽器發送任何輸出之前調用。

cookie的相關使用如下所示。

<?php if(isset($_COOKIE['cnt'])) {    $cnt = $_COOKIE['cnt'] + 1;    
    echo $cnt;
} else {    $cnt = 1;
}
setcookie('cnt', $cnt, time() + 3600);

cookie數據在相應的cookie數組中可用,如果將多個值賦給一個cookie變量,必須將其賦成數組。

常量語法

常量在腳本執行期間其值不能改變。常量大小寫敏感,傳統上常量標識符總是大寫。常量一旦定義就不能被重新定義或取消定義,常量的值只能是標量。

可以用define()函數來定義常量,也可以使用const關鍵字在類定義之外定義常量。自定義常量不要以雙下劃線開頭,可能會與魔術常量衝突。

define('FOO', 'something');const FOO = 'something';

使用const關鍵字定義常量必須處於最頂端的作用區域,因爲用此方法是在編譯時定義的。常量的範圍是全局的,不用管作用區域,就可以在腳本的任何地方訪問常量。

魔術常量

魔術常量值能變,但它其實不是常量。

__LINE__  // 文件中的當前行號__FILE__  // 文件的完整路徑和文件名,絕對路徑__DIR__  // 文件所在的目錄,除非根目錄,否則不包括末尾斜槓,等價於dirname(__FILE__)__FUNCTION__  // 函數名稱,區分大小寫__CLASS__  // 類的名稱,包括其被聲明的作用區域__TRAIT__  // Trait的名字,包括其被聲明的作用區域__METHOD__  // 類的方法名__NAMESPACE__  // 當前命名空間的名稱

PHP向它運行的任何腳本提供了大量的預定義常量,上面8個魔術常量的值隨着它們在代碼中的位置改變而改變。

原站地址:http://www.phpthinking.com/archives/1282

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章