變量與常量 - PHP手冊筆記

變量基礎

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

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

預約義變量

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

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內容以下:cookie

<?php 
echo 'hello';
?>

該程序可以正常輸出hello,可是被註釋掉的test()不能正常解析,由於變量$a是未定義的。函數

使用全局變量

若在某個函數中想使用全局變量,能夠經過下面兩種方式。post

  1. global關鍵字ui

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 $hello
echo "$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 false

boolean false

boolean true

string '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個魔術常量的值隨着它們在代碼中的位置改變而改變。

(全文完)

相關文章
相關標籤/搜索