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 '';
}
}
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
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