2012-12-18 42 views
7

Làm cách nào để tự động truy xuất không gian tên lớp?Nhận không gian tên lớp PHP động

Ma thuật var __NAMESPACE__ không đáng tin cậy vì các lớp con không được xác định chính xác.

Ví dụ:

class Foo\bar\A ->__NAMESPACE__ === Foo \ thanh

class Ping\pong\B extends Foo\bar\A ->__NAMESPACE__ === Foo \ bar (nó nên được Ping \ pong)

ps: Tôi nhận thấy cùng một hành vi sai khi sử dụng __CLASS__, nhưng tôi đã giải quyết bằng cách sử dụng get_called_class() ... có gì đó giống như get_called_class_namespace() không? Làm thế nào tôi có thể thực hiện chức năng như vậy?

UPDATE:
Tôi nghĩ rằng giải pháp là trong câu hỏi của riêng tôi, vì tôi nhận ra get_called_class() trả về tên lớp đầy đủ và do đó tôi có thể trích xuất các namespace từ nó: D ... Dù sao nếu có một hiệu quả hơn phương pháp tiếp cận cho tôi biết;)

+0

Giải pháp của bạn là những gì tôi phải làm trong mã cá nhân. http://codepad.viper-7.com/EgObtf –

+0

Những gì bạn mô tả không phải là hành vi sai trái. Xem những gì các hằng số thực hiện: http://php.net/language.constants.predefined - và khi bạn đã tìm thấy một giải pháp cho vấn đề của bạn, bạn có thể trả lời câu hỏi của riêng bạn. – hakre

+0

Kiểm tra điều này. Tôi nghĩ đây là ý của bạn: http://stackoverflow.com/questions/2317343/get-child-class-namespace-from-superclass-in-php/20193599#20193599 – Chris

Trả lời

9

Không gian tên của class Foo\Bar\AFoo\Bar, vì vậy, __NAMESPACE__ đang hoạt động rất tốt. Những gì bạn đang tìm kiếm có lẽ là namespaced classname mà bạn có thể dễ dàng nhận được bằng cách tham gia echo __NAMESPACE__ . '\\' . __CLASS__;.

Hãy xem xét ví dụ sau:

namespace Foo\Bar\FooBar; 

use Ping\Pong\HongKong; 

class A extends HongKong\B { 

    function __construct() { 
     echo __NAMESPACE__; 
    } 
} 

new A; 

sẽ in ra Foo\Bar\FooBar mà là rất đúng ...

Và thậm chí nếu bạn sau đó làm

namespace Ping\Pong\HongKong; 

use Foo\Bar\FooBar; 

class B extends FooBar\A { 

    function __construct() { 
     new A; 
    } 
} 

nó sẽ echo Foo\Bar\FooBar, mà một lần nữa rất chính xác ...

EDIT: Nếu bạn cần để có được không gian tên của lớp lồng nhau trong chính mà được làm tổ nó, chỉ cần sử dụng:

namespace Ping\Pong\HongKong; 

use Foo\Bar\FooBar; 

class B extends FooBar\A { 

    function __construct() { 
     $a = new A; 
     echo $a_ns = substr(get_class($a), 0, strrpos(get_class($a), '\\')); 
    } 
} 
+3

Họ đang sử dụng \ _ \ _ NAMESPACE \ _ \ _ trong lớp cha, nhưng họ muốn không gian tên của lớp con. –

+0

Ahaa, không nhận được nó từ câu hỏi ... – shadyyx

+0

@MaximilianRuta Vâng, cảm ơn bạn đã chỉnh sửa của bạn, nhưng xin vui lòng, trong tương lai chỉ sửa những gì cần thiết để được sửa chữa. Tất cả các lần xuất hiện của ** Bạn ** đã thay đổi thành ** bạn **? Đây là phong cách của tôi bằng văn bản và thể hiện một số sự lịch sự vì vậy nếu bạn không nhớ, hãy để tôi giữ phong cách của tôi thể hiện bản thân mình. Cảm ơn! Ngoài ra, cảm ơn những người đánh giá đã phê duyệt ** nhỏ ** đó và không yêu cầu chỉnh sửa ** đúng ** như vậy ... Tốt lắm! – shadyyx

9

Trong PHP 5.5, :: lớp có sẵn mà làm những điều 10X dễ dàng hơn. Ví dụ. A::class

+0

Ví dụ http://php.net/manual/en/language.oop5.constants.php#example-179 – Jekis

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