PHP知識點總結3
PHP 函數
PHP 的真正威力源自於它的函數。
在 PHP 中,提供了超過 1000 個內建的函數。
<html> <body> <?php function 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 中該值總是小寫字母的。
<?php function test() { echo ‘函數名為:‘ . __FUNCTION__ ; } test(); ?>
- CLASS 類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。
在 PHP 4 中該值總是小寫字母的。類名包括其被聲明的作用區域(例如 Foo\Bar)。註意自 PHP 5.4 起 CLASS 對 trait 也起作用。當用在 trait 方法中時,CLASS 是調用 trait 方法的類的名字。
<?php class 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 方法又覆蓋了基類中的方法。
<?php class 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 新加)。返回該方法被定義時的名字(區分大小寫)
<?php function test() { echo ‘函數名為:‘ . __METHOD__ ; } test(); ?>
- NAMESPACE 當前命名空間的名稱(區分大小寫)。此常量是在編譯時定義的(PHP 5.3.0 新增)。
<?php namespace 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 代碼包括空白符都不能出現在命名空間的聲明之前。
<?php declare(encoding=‘UTF-8‘); //定義多個命名空間和不包含在命名空間中的代碼 namespace MyProject { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } namespace { // 全局代碼 session_start(); $a = MyProject\connect(); echo MyProject\Connection::start(); } ?>
以下代碼會出現語法錯誤:
<html> <?php namespace MyProject; // 命名空間前出現了“<html>” 會致命錯誤 - 命名空間必須是程序腳本的第一條語句 ?>
子命名空間
<?php namespace 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