2016-02-29 80 views
2

快速問題,我正在玩HttpFoundation組件(Symfony),而且對我來說還不清楚。本教程我在看這個節目代碼Php命名空間vs要求

// framework/index.php 
require_once __DIR__.'/vendor/autoload.php'; 

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 

$request = Request::createFromGlobals(); 

$input = $request->get('name', 'World'); 

$response = new Response(sprintf('Hello %s', htmlspecialchars($input, ENT_QUOTES, 'UTF-8'))); 

$response->send(); 

現在,這個工作,沒有問題,但我試圖使它沒有「使用」關鍵字工作,所以包括(PHP需要)請求類本身,然後我得到一個未找到的類,這對我來說很奇怪,當我使用use關鍵字並使用命名空間時,找到類,但是當我包含類文件本身時,我找不到類。

所以來說明,這將返回一個 '類沒有發現' ..

// framework/index.php 
require_once __DIR__.'/vendor/autoload.php'; 
require_once __DIR__.'/vendor/symfony/http-foundation/Request.php'; 

$request = new Request(); 

燦任意子請給我清楚一點嗎? 在此先感謝!

P.S.我用紅色的關鍵字是不包括任何東西,只是聲明命名空間或什麼?所以它對我來說太奇怪了,因爲它甚至不包括文件,並且當我直接包含文件時它會返回一個'找不到類'...

回答

4

如果您使用use,您可以創建類似完全限定名(fqn)的基於文件的別名。所以如果你使用Symfony\Component\HttpFoundation\Request,你可以寫Request而不是fqn。如果您不想包含使用語句,則必須每次寫入整個班級名稱。

// framework/index.php 
require_once __DIR__.'/vendor/autoload.php'; 

$request = \Symfony\Component\HttpFoundation\Request::createFromGlobals(); 

$input = $request->get('name', 'World'); 

$response = new \Symfony\Component\HttpFoundation\Response(sprintf('Hello %s', htmlspecialchars($input, ENT_QUOTES, 'UTF-8'))); 

$response->send(); 

use -statement本身與類加載無關。類加載的東西是由自動加載器完成的,它解析了包含的php類的文件名。

要清除您的代碼有問題了:

// framework/index.php 
require_once __DIR__.'/vendor/autoload.php'; 
require_once __DIR__.'/vendor/symfony/http-foundation/Request.php'; 

$request = new Request(); 

\包含的Symfony \分量\ HttpFoundation \請求的類,但你要創建的類\請求,這是不同的東西的一個新對象。

3

命名空間不是關於加載類,而是關於命名。

<?php 
$response = new Response(); 

這裏我們告訴PHP使用\Response類。因此,如果目前沒有加載\Response類,則會出現錯誤。

<?php 

use Symfony\Component\HttpFoundation\Response; 

$response = new Response(); 

和這裏(用new Response()語句)我們告訴它使用一個Symfony\Component\HttpFoundation\Response類。所以如果目前沒有加載Symfony\Component\HttpFoundation\Response類,則會出現錯誤。

基本上use Some\Namespaced\ClassName意思是use Some\Namespaced\ClassName as ClassName,把它想象成文件上下文中的別名。

閱讀更多在http://php.net/manual/en/language.namespaces.basics.php

+0

這也幫助了我,謝謝你! – frederikvdbe

+0

@deceze顯然是爲了'新的Response()'語句。但我會更新,好的。 – ksimka

1

有兩個單獨的東西:

  1. 加載(包括,需要)實際的源代碼文件
  2. 混疊名稱

use專門建立的別名。
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Request as Request;速記,
這意味着它的唯一的事情就是它可以讓你在速記Request來引用類Symfony\Component\HttpFoundation\Request(這是階級的實際完全合格的名稱)。

第一次嘗試對類執行某些操作時(例如調用其上的方法或實例化),自動加載器會負責加載源代碼文件。

當你手動輸入require這個文件時,你已經加載了代碼(不必要的,因爲你也加載了自動加載器,這會爲你照顧),但是你並沒有用它的實際完全限定的名字,因此PHP不知道你在說什麼類。班級的名字是Symfony\Component\HttpFoundation\Request,而不是Request