久久精品水蜜桃av综合天堂,久久精品丝袜高跟鞋,精品国产肉丝袜久久,国产一区二区三区色噜噜,黑人video粗暴亚裔

PHP命名空間常見問題

2023-12-07 159

在PHP編程中,命名空間是一種非常重要的概念。它允許開發(fā)者將代碼組織成邏輯結構,避免類名和函數(shù)名之間的沖突。本篇教程將介紹一些PHP命名空間的常見問題,并提供相應的解決方案和實例。

一、常見問題

1、不用命名空間是否要關心它?

不需要。命名空間不影響現(xiàn)存的代碼,也不影響即將要寫下的不含命名空間的代碼。 想要的話可以在命名空間之外訪問全局類:

<?php
$a = new \stdClass;

以上等同于在命名空間之外訪問全局類:

<?php
$a = new stdClass;

2、如何在命名空間內使用一個全局/內置的類?

可以這樣在命名空間內訪問內置的類:

<?php
namespace?foo;
$a?=?new?\stdClass;

function?test(\ArrayObject?$parameter_type_example?=?null)?{}

$a?=?\DirectoryIterator::CURRENT_AS_FILEINFO;

//?擴展內置或全局的?class
class?MyException?extends?\Exception?{}
?>

3、如何在命名空間內訪問它自己的類、函數(shù)、常量?

在命名空間中訪問內置的類、函數(shù)、常量示例:

<?php
namespace?foo;

class?MyClass?{}

//?以當前命名空間中的?class?作為參數(shù)的類型
function?test(MyClass?$parameter_type_example?=?null)?{}
//?以當前命名空間中的?class?作為參數(shù)的類型的另一種方式
function?test(\foo\MyClass?$parameter_type_example?=?null)?{}

//?在當前命名空間中擴展一個類
class?Extended?extends?MyClass?{}

//?訪問全局函數(shù)
$a?=?\globalfunc();

//?訪問全局常量
$b?=?\INI_ALL;
?>

4、類似 \my\name 和 \name 這樣的名稱是如何解析的?

以 \ 開頭的名稱總是會解析成原樣, 因此 \my\name 實際上是 my\name, 而 \Exception 是 Exception。

完全限定名稱示例:

<?php
namespace foo;
$a = new \my\name(); // class "my\name" 的實例
echo \strlen('hi'); // 調用函數(shù) "strlen"
$a = \INI_ALL; // $a 的值設置成常量 "INI_ALL"
?>

5、類似 my\name 這樣的名稱是如何解析的?

類似 my\name 這樣包含反斜線的名稱,但不以反斜線開頭的名稱, 能夠以兩種不同的方式解析:

  • 如果有個導入語句,將其他名字設置別名為 my, 則導入別名會應用到 my\name 的 my 部分;
  • 如果沒有導入,就會追加當前的命名空間名稱為 my\name 的前綴。

限定名稱示例:

<?php
namespace?foo;
use?blah\blah?as?foo;

$a?=?new?my\name();?//?class?"foo\my\name"?的實例
foo\bar::name();?//?調用?class?"blah\blah\bar"?的靜態(tài)方法?"name"
my\bar();?//?調用函數(shù)?"foo\my\bar"
$a?=?my\BAR;?//?設置?$a?的值為?"foo\my\BAR"
?>

6、類似name這樣的非限定名稱是如何解析的?

類似 name 這樣不包含反斜線的名稱, 能夠以兩種不同的方式解析:

  • 如果有導入語句,設置別名為 name,就會應用導入別名;
  • 如果沒有,就會把當前命名空間添加到 name 的前綴。

非限定類名示例:

<?php
namespace?foo;
use?blah\blah?as?foo;

$a?=?new?name();?//?class?"foo\name"?的實例
foo::name();?//?調用?class?"blah\blah"?的靜態(tài)方法?"name"
?>

7、類似 name 這樣的非限定常量和函數(shù)名是如何解析的?

類似 name 這樣不包含反斜線的常量和函數(shù)名,能以兩種不同的方式解析:

  • 首先,當前命名空間會添加到 name 的前綴;
  • 然后,如果當前命名空間不存在函數(shù)和常量 name, 而全局存在,就會使用全局的函數(shù)和常量 name。

非限定函數(shù)和常量名示例:

<?php
namespace?foo;
use?blah\blah?as?foo;

const?FOO?=?1;

function?my()?{}
function?foo()?{}
function?sort(&$a)
{
????sort($a);
????$a?=?array_flip($a);
????return?$a;
}

my();?//?調用?"foo\my"
$a?=?strlen('hi');?//?由于?"foo\strlen"?不存在,所以調用全局的?"strlen"
$arr?=?array(1,3,2);
$b?=?sort($arr);?//?調用函數(shù)?"foo\sort"
$c?=?foo();?//?未導入,調用函數(shù)?"foo\foo"

$a?=?FOO;?//?未導入,設置?$a?為常量?"foo\FOO"?的值
$b?=?INI_ALL;?//?設置?$b?為全局常量?"INI_ALL"?的值
?>

二、命名空間實例

1、在同一個文件中,導入名稱不能和定義的類名發(fā)生沖突

允許以下腳本中的組合:

file1.php

<?php
namespace my\stuff;
class MyClass {}
?>

another.php

<?php
namespace another;
class thing {}
?>

file2.php

<?php
namespace?my\stuff;
include?'file1.php';
include?'another.php';

use?another\thing?as?MyClass;
$a?=?new?MyClass;?//??class?"thing"?的實例來自于命名空間?another
?>

盡管在 my\stuff 命名空間中存在 MyClass, 因為類定義在了獨立的文件中,所以不會發(fā)生名稱沖突。 不過,接下來的例子中,因為 MyClass 定義在了 use 語句的同一個文件中, 所以發(fā)生了名稱沖突,導致了 fatal 錯誤。

<?php
namespace my\stuff;
use another\thing as MyClass;
class MyClass {} // fatal error: MyClass conflicts with import statement
$a = new MyClass;
?>

2、不允許嵌套namespace

PHP 不允許嵌套 namespace

<?php
namespace?my\stuff?{
????namespace?nested?{
????????class?foo?{}
????}
}
?>

實際上,它看上去像是這樣:

<?php
namespace?my\stuff\nested?{
????class?foo?{}
}
?>

3、動態(tài)命名空間名稱(引號標識)應該轉義反斜線

重要的是,字符串中反斜線是一個轉義字符,因此在字符串中使用時,必須要寫兩遍。 否則就會在無意中造成一些后果:

在雙引號字符串中使用命名空間的危險性示例:

<?php
$a?=?new?"dangerous\name";?//?在雙引號字符串中,\n?是換行符!
$obj?=?new?$a;

$a?=?new?'not\at\all\dangerous';?//?這里沒有問題
$obj?=?new?$a;
?>

在單引號字符串中,使用反斜線是安全的。 但在最佳實踐中,我們仍然推薦為所有字符串統(tǒng)一轉義反斜線。

4、引用一個未定義的、帶反斜線的常量,會導致 fatal 錯誤并退出

像 FOO 這樣的非限定名稱常量,如果使用的時候還沒定義, 會產生一個 notice。PHP 會假設該常量的值是 FOO。 如果沒有找到包含反斜線的常量,無論是完全或者不完全限定的名稱,都會產生 fatal 錯誤。

未定義的常量示例:

<?php
namespace bar;
$a = FOO; // 產生 notice - undefined constants "FOO" assumed "FOO";
$a = \FOO; // fatal error, undefined namespace constant FOO
$a = Bar\FOO; // fatal error, undefined namespace constant bar\Bar\FOO
$a = \Bar\FOO; // fatal error, undefined namespace constant Bar\FOO
?>

5、不能重載特殊常量:NULL、TRUE、FALSE、ZEND_THREAD_SAFE、ZEND_DEBUG_BUILD

在命名空間內定義特殊的內置常量,會導致 fatal 錯誤。未定義的常量示例:

<?php
namespace bar;
const NULL = 0; // fatal error;
const true = 'stupid'; // 也是 fatal error;
// etc.
?>
  • 廣告合作

  • QQ群號:4114653

溫馨提示:
1、本網站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享網絡內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。郵箱:2942802716#qq.com(#改為@)。 2、本站原創(chuàng)內容未經允許不得轉裁,轉載請注明出處“站長百科”和原文地址。
PHP命名空間常見問題
下一篇: PHP命名空間