2011-12-22 9 views
10

PHP에서 네임 스페이스의 사용을 연구했지만 얼마 전에 use 키워드를 사용한 프로젝트를보고 네임 스페이스가없는 정상적인 것처럼 네임 스페이스 개체에 액세스했습니다. 내 질문은이것은 PHP에서 네임 스페이스를 사용하는 좋은 방법입니다

는, 올바른 아래의 코드, 그것은 파일 index.php을 HS하고 그 다음에 가져 use을 사용 MyLibrary\Base 네임 스페이스를 사용 \MyLibrary\Registry\MyLibrary\User\MyLibrary\Request

그런 다음 거기에 넣지 않고 이러한 개체에 액세스 할 수 있습니다 네임 스페이스 앞에 있기 때문에 use 섹션 아래의 실제 코드는 일반적인 네임 스페이스 PHP 파일과 유사합니다.

네임 스페이스 사용 방법을 묻는 중입니다. 또는 나는 무엇인가 놓치고 있냐?

파일 :

<?php 
namespace MyLibrary\Base; 

use \MyLibrary\Registry; 
use \MyLibrary\User; 
use \MyLibrary\Request; 


class Base 
{ 
    public $registry; 

    function __construct($registry) 
    { 
     $this->registry = $registry; 
     $this->user = New User; 
     $this->request = new Request; 
     # code... 
    } 
} 
?> 

파일의 index.php : registry.class.php

<?php 
namespace MyLibrary\Registry; 

class Registry 
{ 
    public $user; 

    function __construct($user) 
    { 
     $this->user = $user; 
     # code... 
    } 
} 
?> 

답변

5

예. use -statement는 class 또는 namespace-name을 현재 범위로 가져옵니다. 그 훨씬 짧은, Vendor_Package_Foo_Bar_XyzClass보다와 b) 당신이 사용하는 클래스를 교환 할 수 있기 때문에, 모든 것을 더 읽기 쉽게

namespace MyFirstNamespace { 
    class Foo {} 
} 
namespace MySecondNamespace { 
    use \MyFirstNamespace\Foo as Bar; 
    $foo = new Bar; 
} 

A)), 단기는 PHP-의 devs 네임 스페이스를 구현하는 이유는, 모든 것을 작성하려면 매우 빠릅니다.

# use \MyFirstNamespace\Foo as Bar; // I don't like Foo anymore 
use \MyFirstNamespace\SimilarToFoo as Bar; 
+1

내 코드 전체에 걸쳐 악의적 인 '\\'구분 기호를 처리해야한다고 생각했기 때문에 이것은 정말 놀랍기 때문에 지금은 네임 스페이스를 사용하고 싶습니다. 이것은 파이썬을 생각 나게합니다. 라이브러리를 가져 오는 방법은 – JasonDavis

+0

사실 저는 C#처럼 사용하고 있습니다 ... using System; using System.Collections.Generic; 그들이 네임 스페이스를 가져 왔음을 깨닫지 못했습니다. 또한 NS 구분 기호로 도트/마침표를 사용하면 얼마나 좋을지 알 수 있습니다. – JasonDavis

+0

Bar처럼'use \ MyFirstNamespace \ Foo '를 게시 한 것처럼 빠른 질문을합니다. 이름을 바꿀 수 있다는 것을 알고 있지만, 본 코드에서 내 예제처럼 ...'use \ MyFirstNamespace \ Foo ; 그리고'Foo '를 사용하여 액세스 할 수 있습니까? 내가 다른 것을 설정하지 않았거나 'use \ MyFirstNamespace \ Foo as Foo;'와 같이 설정하겠습니까? – JasonDavis

3

네임 스페이스는 많은 장점이 있습니다.

처음에는 다른 네임 스페이스 내에 존재하는 경우 메서드 이름과 클래스 이름을 다시 사용할 수 있습니다. 예 :

namespace \myNamespace\data\postgres; 

class DataBase extends \PDO 
{ 
} 

namespace \myNamespace\data\mysql; 

class DataBase extends \PDO 
{ 
} 
당신도 함께 이름에 대해 걱정할 필요없이
namespace \myNamespace\dir; 

function makedir() 
{ 
    if (// some condition is true) 
    { 
     \makedir(); 
    } 
} 

이 모든

는 쉽게 다른 소스 코드를 사용할 수 있도록하기위한 것입니다 일반적으로 PHP 기능을 위해 예약 된 이름을 다시 사용할 수

갈등. 프로그래머가 몇 가지 간단한 규칙을 준수 할만큼 정중하게 제공한다면 이름 충돌의 가능성은 크게 줄어 듭니다. 사실, 이름 충돌을 피하기 위해 신경 써야 할 유일한 규칙은 네임 스페이스의 첫 번째 수준을 직접 만드는 것입니다. 예를 들어 회사 이름이나 네임 스페이스의 첫 번째 수준 인 고유 한 공급 업체로 사용자를 식별하는 다른 방법을 사용하면 모든 것이 좋을 것입니다.

예를 들어 내가 쓰는 모든 코드에서 루트 네임 스페이스로 \ gordian을 사용합니다. 다른 루트 네임 스페이스를 선택한 사람과 충돌하지 않고 마음에 드는 그 네임 스페이스 아래에서 클래스를 호출 할 수 있습니다.

그렇다면 PEAR 협약의 문제점은 무엇입니까? 널리 사용되는 Zend 프레임 워크를 포함하여 많은 프로젝트가 진행되고 있습니다.

답변은 이름이 매우 빠르게 다루기 힘들어집니다. 예를 들어, Zend는 PEAR 규칙을 따르기 때문에 일종의 의사 네임 스페이스를 사용합니다. 컬렉션의 모든 클래스는 Zend_로 시작하고 클래스 hierachy의 각 레벨과 함께 이름에 추가 부분을 추가합니다.
Ze 결과적으로 Zend_Db_Adaptor_Abstract 및 Zend_Dojo_Form_Decorator_TabContainer와 같은 클래스 이름이 생깁니다.

Zend는 네임 스페이스를 사용하기 위해 프레임 워크를 업데이트해야합니다 (Zend Framework 2.0에서 발생한다고 말하면됩니다). 그러면 Zend Framework는 \ Zend \ Db \ Adapter \ Abstract 및 \ Zend \ Dojo \ Form \ Decorator \ TabContainer를 대신 사용하십시오. 그럼 뭐라 구요? 대답은 이미 본 것처럼 Use 키워드를 사용하여 더 짧은 이름으로 별칭을 지정할 수 있다는 것입니다. 즉, 전체 클래스 이름을 계속 작성하지 않아도되지만 별칭을 작성한 경우에만 사용할 수 있습니다.

use \Zend\Dojo\Forn\Decorator as Dec; 

$a = new Dec\TabContainer; // Not easy to do without namespaces! 

더욱 더 주어진 네임 스페이스에 이미 있다면이 자동으로 발생하는대로, 당신은 심지어 짧은 이름으로 같은 네임 스페이스 내의 다른 항목에 액세스하기 위해 사용하는 키워드를 사용할 필요가 없습니다 너는 그럴거야. 프레임 워크 작성자의 경우 시간이 많이 절약됩니다.

예를 들어, Zend Framework 2에서 followign과 같은 것을 볼 수 있습니다 (어떤 방식 으로든 작업하지 않으므로 이것은 순수 ZF2 소스가 아닌 순전히 하나의 예입니다). 다른 혜택은 (제공 한 이름 공간 구조가 사용자의 파일 시스템 디렉토리 구조에 정확하게 매핑) 만들 자동 로더 엄청나게 간단하게 같은, 너무있다

namespace \Zend\Db\Adaptor; 

class Postgres extends Abstract // We don't need to use \Zend\Db\Adaptor\Abstract here because it's in the same namespace already anyway 
{ 
} 

있습니다.

네임 스페이스는 실제로별로 중요하지 않거나 전혀 이해가되지 않는 기능 중 하나처럼 보일 수 있지만, 조금만 사용하면 그 유용성이 갑자기 매우 분명해질 것입니다.

관련 문제