PHP語法特點

李名赫發表於2016-04-22

我的主攻是C, C++,之前也學過 Python, Lua 指令碼語言,沒有接觸過PHP。這幾天在學習PHP,做個筆記。 

感覺PHP在語法上與C++特別相似。只要會C++,PHP基本上不用記什麼。 


語法上有這些特點: 

1. 資料型別

    null, bool, string, float, integer, array, object

    object 是 new 出來的物件

    轉換型別與 C 一樣。

2. PHP裡所有的變數名都是以 $ 開頭 

    在Shell裡,只有獲取變數的時候才需要加$符號,在PHP裡,所獲取還是設定都要加 $ 符號

$str = "hello";
echo $str;

3. PHP裡變數名區分大小寫,函式名不分

$str = "String
";
$STR = "This is STR
";
echo $str;
ECho $str;
echo $STR;

    結果輸出:

String

String

This is STR

4. PHP裡的註釋除了C++有的 // /**/ 外,還有指令碼常用的 #

// 註釋
/*
 * 註釋
 */
# 註釋

5. 定義變數時無需指明型別

    這點與 python, lua一樣,這也是大多資料指令碼的共性。

6. 資料組是 array

    用作陣列時:

$arr = array("C++", "C", "Java", "PHP");

    用作對映表時:

$map = array("John"=>"M", "Lily"=>"F");

  

如果不指定鍵值,那麼它就是數字 0,1,2,3…為鍵。如果指定了鍵值,那就以指定的鍵值為鍵。

    其功能非常類似於Lua的表。Lua的如下:

w = {x=0, y=0, label="console"}

  不過 Lua 的有點怪異,非得從1開始計數。

7. 邏輯語句與C++一樣

    if .. else if .. else, for, while, continue, break等與C++一樣。只不過,PHP還支援用 : … endXXX 來代替 { … }

if ($num == 0) {
    echo "num = " . $num;
}
# 也可以寫成如下
if ($num == 0) :
    echo "num = " . $num;
endif

    有 ++$i 與 $i++,與C++一樣。

8. 字串用 . 進行連線

    這一點跟 Lua 類似,Lua 是用 .. 進行字串拼接的。

9. 字串用單引號或雙引號界定

$name = `Peter`;
echo `My name is $name
`;
echo "My name is $name
";
echo "===="

My name is $name
My name is Peter

====

    在單引號裡 $name 與
都沒有被重新計算。而雙引號則會被替代。這點跟shell一樣。

10. 有 === (恆等)與 !== (不恆等)比較。恆等的意思是不僅值相等,型別還一樣

11. 函式的定義

function PrintName($name = "Unknow") {
    if (is_string($name)) {
        echo "My name is $name
";
        return TRUE;
    }
    return FALSE;
}
PrintName("Hevake");

    與 Lua 類似,也可以帶預設值

12. 常量

define("NAME", "hevake_lcj");    # 定義常量
echo constant("name");    # 取常量
if (defined("name")) {    # 檢查是否定義了常量 name
    echo "定義了 name";
}

13. 可變變數

<?php
$text="My Name";
$a = "text";
echo $$a;
echo `<br>`;
$b = `a`;
echo $$$b;
?>

   124459_zWNE_243525.png

    $text, $$a, $$$b的結果都是“My Name”。

    函式也可以這樣引用:

<?php
function come() {
    echo "I am coming. <br/>";
}
function back() {
    echo "I am back. <br/>";
}
$func = "come";
$func();
$func = "back";
$func();
?>

133739_6PNA_243525.png

14. 預定義環境變數

    $_SERVER, $_COOKIE, $_SESSION, $_POST, $_GET, $GLOBALS


15. 函式可以以引用傳參

<?php
function example(&$m) {
    $m = $m * 5 + 10;
}
$m = 1;
example($m);
echo "<p>在函式外:$m = $m</p>";
?>

131558_7qN4_243525.png

16. foreach迴圈

<?php
$map = array(`john`=>18, `licy`=>22);
foreach ($map as $key=>$value) {
    echo "$key=>$value, ";
}
echo `<br/>`;
?>

134725_tcmk_243525.png


17. 物件導向與Java類似

<?
#示例學生類
class Student
{
    #建構函式,沒有指定public, protected, private,預設為public
    function __construct($Name = "Unknow", $Age = 0)
    {  
        $this->mID = static::$sCount++; #注意靜態成員的引用方法
        echo "Student $this->mID construct<br/>";
        $this->mName = $Name;    #注意:是$this->mName,而不是$this->$mName
        $this->mAge = $Age;
    }
 
    function __destruct() 
    {
        echo "Student $this->mID destruct<br/>";
    }
 
    function __clone() 
    {
        $this->mID = static::$sCount++;
        echo "Student $this->mID cloned.<br/>";
    }
 
    function __get($name) 
    {
        if ($name == `Name`) {
            return $mName;
        } else if ($name == `Age`) {
            return $mAge; 
        } else {
            return null; 
        }
    }
 
    function __set($name, $value) 
    {
        if ($name == `Name`) {
            if (is_string($value)) {
                $this->mName = $value;
            }
        } else if ($name == `Age`) {
            if (is_int($value)) {
                $this->mAge = $value;
            }
        } else {
            throw new Exception("No attribute $name");
        }
    }
 
    function __ToString() 
    {
        $ret = `<hr/>Class: ` . __CLASS__ . `<br/>` . 
            "	Name: " . $this->mName . `<br/>` .
            "	Age: " . $this->mAge . `<br/><hr/>`;
        return $ret;
    }
 
    static private $sCount = 0;
    private $mID;
    private $mName;
    private $mAge;
}
 
function foo($s) {
    $s->Age = 30;
}
 
$s = new Student(); #例項化物件要加new,這不像Python,否則就被當成Student()函式了。
                    #在構造的過程中,Student::__construct()會被自動呼叫
 
$s->Name = "John";
 
try {
    $s->Sex = "male";   #Student並沒有Sex屬性,會拋異常
} catch (Exception $e) {
    echo `Exception occur!!<br/>`;
    echo $e;
}
 
foo($s);    /*將物件作為實參傳給函式時,其實轉的是這個物件的控制程式碼,就像傳的是指標一樣。
              在foo()中對$s物件的修改是有效的*/
echo $s;    #自動呼叫Student::__toString()
 
$s1 = clone $s; //clone物件
unset($s);
 
$s1->Name = "LiChunjun";
echo $s1;
?>

   可以重定義如下關鍵函式:

  • __get($name)    屬性獲取函式,$name為屬性名

  • __set($name, $value)    屬性設定函式

  • __construct()    建構函式

  • __destruct()    解構函式

  • __call($name, $params)    呼叫函式

  • __autoload()    類定義載入回撥函式

  • __tostring()    轉換字串函式


相關文章