標籤:空白 聲明 代碼 new t 區分大小寫 使用者 cti 字母 變數
PHP 函數
PHP 的真正威力源自於它的函數。
在 PHP 中,提供了超過 1000 個內建的函數。
<html><body><?phpfunction writeName(){echo "Kai Jim Refsnes";}echo "My name is ";writeName();//函數傳參function writeName($fname,$punctuation){echo $fname . " Refsnes" . $punctuation . "<br>";}echo "My name is ";writeName("Kai Jim",".");echo "My sister‘s name is ";//函數傳回值function add($x,$y){$total=$x+$y;return $total;}echo "1 + 16 = " . add(1,16);?></body></html>
魔術變數
有八個魔術常量它們的值隨著它們在代碼中的位置改變而改變。
- _LINE__
檔案中的當前行號。
- FILE
檔案的完整路徑和檔案名稱。如果用在被包含檔案中,則返回被包含的檔案名稱。
- DIR
檔案所在的目錄。如果用在被包括檔案中,則返回被包括的檔案所在的目錄。
- FUNCTION
函數名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該函數被定義時的名字(區分大小寫)。在 PHP 4 中該值總是小寫字母的。
<?phpfunction test() {echo ‘函數名為:‘ . __FUNCTION__ ;}test();?>
- CLASS 類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。
在 PHP 4 中該值總是小寫字母的。類名包括其被聲明的作用地區(例如 Foo\Bar)。注意自 PHP 5.4 起 CLASS 對 trait 也起作用。當用在 trait 方法中時,CLASS 是調用 trait 方法的類的名字。
<?phpclass test {function _print() {echo ‘類名為:‘ . __CLASS__ . "<br>";echo ‘函數名為:‘ . __FUNCTION__ ;}}$t = new test();$t->_print();?>
- TRAIT Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 實現了代碼複用的一個方法,稱為 traits。
Trait 名包括其被聲明的作用地區(例如 Foo\Bar)。
從基類繼承的成員被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆蓋。其行為 MyHelloWorld 類中定義的方法一致。優先順序是當前類中的方法會覆蓋 trait 方法,而 trait 方法又覆蓋了基類中的方法。
<?phpclass Base { public function sayHello() { echo ‘Hello ‘; }}trait SayWorld { public function sayHello() { parent::sayHello(); echo ‘World!‘; }}class MyHelloWorld extends Base { use SayWorld;}$o = new MyHelloWorld();$o->sayHello();?>
- METHOD 類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)
<?phpfunction test() {echo ‘函數名為:‘ . __METHOD__ ;}test();?>
- NAMESPACE 當前命名空間的名稱(區分大小寫)。此常量是在編譯時間定義的(PHP 5.3.0 新增)。
<?phpnamespace MyProject;echo ‘命名空間為:"‘, __NAMESPACE__, ‘"‘; // 輸出 "MyProject"?>
命名空間
PHP 命名空間(namespace)是在PHP 5.3中加入的,如果你學過C#和Java,那命名空間就不算什麼新事物。 不過在PHP當中還是有著相當重要的意義。
PHP 命名空間可以解決以下兩類問題:
- 使用者代碼與PHP內部的類/函數/常量之間的名字衝突。
- 建立別名(或簡短)的名稱,提高原始碼的可讀性。
預設情況下,所有常量、類和函數名都放在全域空間下,就和PHP支援命名空間之前一樣。
如果一個檔案中包含命名空間,它必須在其它所有代碼之前聲明命名空間
< ?php // 定義代碼在 ‘MyProject‘ 命名空間中 namespace MyProject; // ... 代碼 ... //也可以在同一個檔案中定義不同的命名空間代碼namespace MyProject1; // MyProject1 命名空間中的PHP代碼 namespace MyProject2; // MyProject2 命名空間中的PHP代碼 // 另一種文法namespace MyProject3 { // MyProject3 命名空間中的PHP代碼 } ?>
在聲明命名空間之前唯一合法的代碼是用於定義源檔案編碼方式的 declare 語句。所有非 PHP 程式碼封裝括空白符都不能出現在命名空間的聲明之前。
<?phpdeclare(encoding=‘UTF-8‘); //定義多個命名空間和不包含在命名空間中的代碼namespace MyProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ }}namespace { // 全域代碼session_start();$a = MyProject\connect();echo MyProject\Connection::start();}?>
以下代碼會出現語法錯誤:
<html><?phpnamespace MyProject; // 命名空間前出現了“<html>” 會致命錯誤 - 命名空間必須是程式指令碼的第一條語句?>
子命名空間
<?phpnamespace MyProject\Sub\Level; //聲明分層次的單個命名空間//建立了常量 MyProject\Sub\Level\CONNECT_OK,//類 MyProject\Sub\Level\Connection //和函數 MyProject\Sub\Level\Connect。const CONNECT_OK = 1;class Connection { /* ... */ }function Connect() { /* ... */ }?>
命名空間使用
PHP 命名空間中的類名可以通過三種方式引用:
非限定名稱,或不包含首碼的類名稱,例如 $a=new foo(); 或 foo::staticmethod();。如果當前命名空間是 currentnamespace,foo 將被解析為 currentnamespace\foo。如果使用 foo 的代碼是全域的,不包含在任何命名空間中的代碼,則 foo 會被解析為foo。 警告:如果命名空間中的函數或常量未定義,則該非限定的函數名稱或常量名稱會被解析為全域函數名稱或常量名稱。~~無命名空間首碼的引用,預設在當前命名空間尋找,然後到全域命名空間找
限定名稱,或包含首碼的名稱,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果當前的命名空間是 currentnamespace,則 foo 會被解析為 currentnamespace\subnamespace\foo。如果使用 foo 的代碼是全域的,不包含在任何命名空間中的代碼,foo 會被解析為subnamespace\foo。 ~~帶相對命名空間首碼的(類似相對路徑)引用,自動在開頭添加調用代碼所處的命名空間
完全限定名稱,或包含了全域首碼操作符的名稱,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在這種情況下,foo 總是被解析為代碼中的文字名(literal name)currentnamespace\foo。~~帶絕對命名空間首碼的引用(類似絕對路徑) 引用路徑已明確 不用尋找
PHP知識點總結3