2014-05-22 27 views
10

Tôi đang phải đối mặt với một vấn đề nghi ngờ cố gắng sử dụng như sau:instanceof và không gian tên

$object instanceof $class 

1/PHP 'instanceof' từ khóa và không gian tên làm việc tốt với nhau, như được giải thích in the official doc.

2/Đôi khi, tuy nhiên , dấu gạch chéo ngược thoát cho vào hành vi tinh tế hơn (tối nghĩa?), như Ben vui lòng giải thích trong this bài viết hay.

Một nơi nào đó sâu thẳm trong mã của tôi, y thiết lập một vài bãi như sau:

var_dump($object, $class); 
var_dump($object instanceof $class); 

mà mang lại cho tôi những kết quả sau khi chạy kịch bản của tôi:

class Tools\Tests\Entity\testObject#226 (2) { 
    private $var_one => 
    NULL 
    private $var_two => 
    NULL 
} 
string(36) "Tools\Tests\Entity\testObject" 
bool(false) 

Các lớp đầu tiên của tôi dump là hoàn toàn giống như chuỗi trong dump thứ hai của tôi. Tuy nhiên, cá thể của tôi trả về kết quả FALSE. Tại sao ?

Tôi đã chơi xung quanh với dấu gạch chéo ngược, không có may mắn. Có lẽ tôi đã sai lầm ở đâu đó với không gian tên? Vấn đề là tôi thực sự không biết cách khắc phục sự cố tiếp theo. Tôi nên thử cái gì?

+0

Oh, và tôi chỉ kiểm tra không có từ khóa php trong không gian tên của tôi ... – mika

+1

sử dụng dấu nháy đơn ... – Deadooshka

Trả lời

14

Bạn có thể kiểm tra các phiên bản bằng cách sử dụng không gian tên, nhưng sử dụng fully qualified class name.

Đối với thử nghiệm của bạn tôi sẽ làm điều này:

$class = "\\Tools\\Tests\\Entity\\testObject"; 
$object = new $class; 
var_dump($object instanceof $class); //bool(true) 

Bạn cũng có thể kiểm tra theo cách này sử dụng dấu nháy đơn và không lo lắng về việc thoát backslashes của bạn và tiết kiệm cho mình một vài tổ hợp phím.

$class = '\Tools\Tests\Entity\testObject'; 
$object = new $class; 
var_dump($object instanceof $class); //bool(true) 
+0

Tuyệt vời! Đây là một sự kết hợp của slashes tôi đã không cố gắng ... Và nó thực sự là sửa chữa :) – mika

+0

@mika Rất vui được giúp đỡ! Tôi kiểm tra tất cả các trường hợp của tôi theo cách này vì vậy tôi không lo lắng về việc duyệt qua phân cấp không gian tên không chính xác. – Crackertastic

+0

dấu gạch chéo ngược thoát là khoảng dấu ngoặc kép, khi bạn nhận '\ t' ở đó. Dấu nháy đơn không được phân tích cú pháp, do đó không cần phải thoát dấu gạch chéo ngược. – Deadooshka

3

tôi sử dụng biến thể đơn giản hơn

var_dump($object instanceof \Tools\Tests\Entity\testClass); 
+0

Điều này phù hợp hơn nếu bạn không phải đọc vùng tên và lớp từ một biến. Cũng làm việc chỉ bằng cách sử dụng tên lớp nếu không gian tên của nó đã được "sử dụng". +1 – Adambean

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