2014-03-19 59 views
1

代碼示例1在加載類時,PHP的use語句會導致額外的工作嗎?

use Outline\Drawing; 
$var = new Drawing(); 

代碼示例2

$var = new Outline\Drawing(); 

問:

確實PHP使硬件更加努力地工作(查找多個文件或文件做更多的處理)如果我使用示例1中的代碼?我相信有一些事情可以完成,即使它是在某些代碼的層次上,它們會計算出哪個use行與哪個類匹配。我想找出究竟發生了什麼。

簡而言之:

  • 工作了使用use語句,它被認爲是一類之間的連接時,是什麼PHP做什麼?
  • 當涉及到這兩個代碼示例時,PSR-0/PSR-4自動加載器是否會影響它們的工作方式?
+2

你在這裏討論的是[標籤:微型優化]。除非你真的加載了數百萬個類,否則差異將會變得微不足道。 – GordonM

+0

我主要擔心的是「如果文件系統上存在一個名爲Drawing.php的文件,PHP會首先嚐試查找,如果不是,那麼它會查找Outline \ Drawing.php」這樣的系統調用會導致一些嚴重的性能問題,所以我會想象別的事情正在發生。 – Dennis

+0

儘管我同意這是微型優化,但AFAIK PHP加載類的方式是首先解析完整的名稱空間類名,然後嘗試加載它(如果它尚未加載)。您的代碼示例都將查找相同數量的文件,並且使用語句的額外處理量可以忽略不計。 – T0xicCode

回答

3

在確定使用use語句和它應該用於的類之間的連接時,PHP會做什麼?

use語句實際上並沒有將名稱空間/類加載到文件中。它只是設置一個別名列表來引用該名稱空間中的類。

當它遇到尚未聲明的類時,它將使用該別名列表嘗試完全限定類名(前綴替換)。如果它找不到類的別名,它將使用當前作用域的名稱空間來限定類名。

只有當類名完全合格時,php纔會嘗試自動加載該類(調用可能已定義的各種自動加載器)。

當涉及到這兩個代碼示例時,PSR-0/PSR-4自動加載器是如何影響他們工作的方式?

不,自動加載器的工作方式不會因代碼樣本的不同而受到影響,因爲php會以完全相同的參數完全相同的方式調用自動加載器。

相關問題