非限定名稱,或不包含首碼的類名稱,例如 $a=new foo(); 或 foo::staticmethod();。如果當前命名空間是 currentnamespace,foo 將被解析為 currentnamespace\foo。如果使用 foo 的代碼是全域的,不包含在任何命名空間中的代碼,則 foo 會被解析為foo。 警告:如果命名空間中的函數或常量未定義,則該非限定的函數名稱或常量名稱會被解析為全域函數名稱或常量名稱。
這個話什麼意思?我做實驗理解:
非限定名稱
就是調用function class $的時候不加任何首碼,
就是調用代碼自己所在檔案中的 class 或者 $ 或者 function,這樣理解對嗎?
回複內容:
非限定名稱,或不包含首碼的類名稱,例如 $a=new foo(); 或 foo::staticmethod();。如果當前命名空間是 currentnamespace,foo 將被解析為 currentnamespace\foo。如果使用 foo 的代碼是全域的,不包含在任何命名空間中的代碼,則 foo 會被解析為foo。 警告:如果命名空間中的函數或常量未定義,則該非限定的函數名稱或常量名稱會被解析為全域函數名稱或常量名稱。
這個話什麼意思?我做實驗理解:
非限定名稱
就是調用function class $的時候不加任何首碼,
就是調用代碼自己所在檔案中的 class 或者 $ 或者 function,這樣理解對嗎?
看源碼吧
namespace Project\Model; //本檔案隸屬命名空間Project\Model,如果沒有特別說明,以後出現的類名稱為該空間下的類,如 User表示\Project\Model\User,Table\User表示\Project\Model\Table\Useruse Zend\Table; //調用\Zend\Table這個類,使用該聲明之後再調用$table = new Table();時,這個Table是指\Zend\Tableuse Project\Model\Table PTable; //調用\Project\Model\Table這個類,並指定別名PTable,當調用$table = new PTable();時,這個PTable是指Project\Model\Table//在以上代碼中屬於聲明,不需要特別使用\開頭說明是絕對路徑class User extends \Project\Model { //User無特別聲明,所以該類全名為\Project\Model\User,而\Project\Model因為是反斜線開頭,指\Project\Model這個類(不能寫成extends Model,否則會被認為是\Project\Model\Model)}class \User extends Table\User { //使用了反斜線開頭,因此該類全名就是\User,後面的User沒有斜杠,則是指\Project\Model\Table\User}
由此可見,對於namespace和use語句,其中的類使用的是全名,而在其它地方必須使用反斜線開頭表示類的全名,否則其全名是 反斜線 + 當前的namespace + 類名
說通俗點: 命名空間就是一個檔案的 位置資訊(全域唯一)
比如
lib/pay/weixin.php lib/order/weixin.php
這兩個 weixin.php的空間就不同
命名空間就是為瞭解決class類名重複問題的
你趕緊別做實驗了,會把你繞暈的