2011-08-30 30 views
17

example1:Không gian tên PHP - tăng cấp độ?

namespace Inori \ Test;

lớp MainTest {}

Ví dụ 2:

namespace Inori \ Test \ thi này;

Lớp SubTest mở rộng ???? {}

Câu hỏi: là có một cách để nhanh chóng đi lên một cấp độ trong không gian tên để thi này có thể kéo dài MainTest? một cái gì đó như "../MainTest"? Hay tôi bị kẹt với \Inori\Test\MainTest?

+3

Namespaces trong PHP không thể được lồng vào nhau: không có hệ thống phân cấp mỗi nói. Mỗi không gian tên được khai báo độc lập với nhau, không có mối quan hệ cha-con giữa các không gian tên (chưa). 'Foo \ Bar' là một không gian tên hoàn toàn khác với' Foo \ Bar \ Baz'. – netcoder

+0

Vì vậy, tôi đã xem qua điều này và nhận ra rằng tôi đã không chính xác cần không gian tên cha mẹ, tôi có thể làm những gì tôi cần từ không gian tên toàn cầu nhưng không biết làm thế nào để đạt được điều đó. Nó chỉ ra tất cả những gì bạn cần làm là bắt đầu không gian tên với một dấu gạch chéo ngược và nó sẽ không sử dụng không gian tên lồng nhau. Vì vậy, nếu bạn đang ở trong không gian tên 'Foo \ Bar' và gọi' new Baz \ Bat() ', nó sẽ nằm trong không gian tên' Foo \ Bar \ Baz \ Bat() '. Tuy nhiên, nếu bạn gọi 'new \ Baz \ Bat()', nó sẽ nằm trong namespace 'Baz \ Bat()'. – TorranceScott

Trả lời

19

Không gian tên tương đối không được hỗ trợ. Có một yêu cầu cho nó mặc dù: https://bugs.php.net/bug.php?id=52504

Nếu bạn nhập các lớp học của bạn ở đầu tệp thì nó không phải là một giao dịch lớn.

namespace Inori\Test\SubTest; 
use Inori\Test\MainTest; 

class SubTest extends MainTest { } 
+0

Đó là 'use' được gọi là aliasing/import, có thể được sử dụng theo 5 cách: http://php.net/manual/en/language.namespaces.importing.php –

1

Xem câu trả lời được chấp nhận đã được cung cấp. Tuy nhiên, dưới đây là mã bạn có thể sử dụng để tận dụng các không gian tên tương đối (lưu ý: vui lòng sử dụng mã bên dưới miễn phí và tham chiếu đến tác giả trong mã của bạn là không bắt buộc, không có bảo lãnh nào được cung cấp bởi tác giả và việc sử dụng mã có nguy cơ riêng).

cập nhật: mã có thể được sử dụng bên trong lớp học của bạn để tự động và nhanh chóng tải các lớp khác thông qua không gian tên tương đối. Người khởi xướng chủ đề này đang tìm cách mở rộng lớp học sang lớp khác thông qua không gian tên tương đối, mà vẫn không thể cũng không có với mã này.

Trong lớp học của bạn chỉ cần thêm đoạn mã sau:

public function TestRelativeNamespace() 
{ 
    // (e.g., param1 = site\lib\firm\package\foo, param2 = .\..\..\different) 
    $namespace = $this->GetFullNamespace(__NAMESPACE__, '.\\..\\..\\different'); 

    // will print namespace: site\lib\firm\different 
    print $namespace; 

    // to create object 
    $className = $namespace . '\\TestClass'; 
    $test = new $className(); 
} 

public function GetFullNamespace($currentNamespace, $relativeNamespace) 
{ 
    // correct relative namespace 
    $relativeNamespace = preg_replace('#/#Di', '\\', $relativeNamespace); 

    // create namespace parts 
    $namespaceParts = explode('\\', $currentNamespace); 

    // create parts for relative namespace 
    $relativeParts = explode('\\', $relativeNamespace); 

    $part; 
    for($i=0; $i<count($relativeParts); $i++) { 
     $part = $relativeParts[$i]; 

     // check if just a dot 
     if($part == '.') { 

      // just a dot - do nothing 
      continue; 
     } 
     // check if two dots 
     elseif($part == '..') { 

      // two dots - remove namespace part at end of the list 
      if(count($namespaceParts) > 0) { 

       // remove part at end of list 
       unset($namespaceParts[count($namespaceParts)-1]); 

       // update array-indexes 
       $namespaceParts = array_values($namespaceParts); 
      } 
     } 
     else { 

      // add namespace part 
      $namespaceParts[] = $part; 
     } 
    } 

    if(count($namespaceParts) > 0) { 
     return implode('\\', $namespaceParts); 
    } 
    else { 
     return ''; 
    } 

} 
+0

Điều này thực sự không giúp với câu hỏi gốc về cái gì viết vào vị trí của các dấu chấm hỏi trong 'lớp con mở rộng ???? {...} 'trong đó con kế thừa từ không gian tên ở một cấp ở trên. –

Các vấn đề liên quan