2017-06-22 106 views
0

通過「use」關鍵字訪問類或將其聲明爲「new」加上類的文件路徑有什麼區別?在PHP中使用關鍵字和New關鍵字

<?php 

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 

//if accessed using use keyword 
use App\Entity\User; 

class SampleController extends Controller 
{ 
    public function add(Request $request) 
    { 
     //if declared by "use" keyword above 
     $user = new User(); 

     //if not declared by "use" keyword 

     $user = new \App\Entity\User(); 
    } 
} 

如果我要使用User類的功能,結果是相同的,但什麼是在他們的聲明有何區別?

+1

嘗試刪除使用..你會很快看到一個錯誤。 'use'關鍵字kinda就像是一個require語句,它調用類,但直到調用纔會初始化類,但是,'use'不是必需的 - 您可以通過執行'new App \ Entity \用戶\用戶「,但想象一下,每次你想要的用戶類。這就是'use'用於簡化'new'和'new'的簡單方法 – ThisGuyHasTwoThumbs

+1

'use'只是爲命名空間類定義設置別名; 'new'實例化一個類的實例..非常不同(基本)的東西 –

+0

'use'基本上允許你定義2個具有相同名稱的類,只要它們在2個不同的名稱空間中聲明。在某些情況下,您需要在類名前面指定名稱空間,以確保使用好名稱空間。 – Kaddath

回答

2

use關鍵字產生的別名,一個類或命名空間。

as關鍵字引入了別名。如果沒有as,別名爲命名空間或類路徑的最後一個組件:

use App\Entity\User as OneUser; 

OneUser是一回事\App\Entity\User和到處都可以使用,而不是它在當前文件。

use App\Entity\User; 

在這裏,別名是User(的App\Entity\User最後成分)。它與(但短於)相同:

use App\Entity\User as User; 

別名用於寫少;代碼更容易閱讀這種方式。

別名在編譯時處理,它們僅在創建它們的文件中可見。 use聲明的存在沒有任何影響;它只爲類或名稱空間創建一個較短的名稱,但這個較短的名稱僅在編譯包含它的文件時有效。

別名類名不在字符串內部擴展。在編譯期間,它們只是文本。在運行期間,'User''App\Entity\User'不一樣。

因此,class_exists('User')返回FALSE,但class_exists('App\Entity\User')返回TRUE


有關PHP如何解決別名的更多見解,請閱讀"Using namespaces: Basics"文檔頁面。

+0

謝謝@axiac。現在對我來說更清楚了。 –