2011-09-19 27 views
6

Tương đương với câu lệnh using Name.Space; của C# để làm cho tất cả các lớp của không gian tên đó có sẵn trong tệp hiện tại là gì? Điều này thậm chí có thể với PHP?Không gian tên PHP: tương đương với C# bằng cách sử dụng

Những gì tôi muốn (nhưng không hoạt động):

<?php 
# myclass.php 
namespace Namespace; 
class myclass { 
} 
?> 

<?php 
# main.php 
include 'myclass.php' 
use Namespace; 

new myclass(); 
?> 

Trả lời

8

Có ai sánh kịp. Trong PHP, trình thông dịch sẽ không biết tất cả các lớp có thể tồn tại (đặc biệt là do sự tồn tại của __autoload) do đó thời gian chạy sẽ chạy vào nhiều xung đột. Có một cái gì đó như thế này:

use Foo\*; // Invalid code 
throw new Exception(); 

Có thể có một Foo \ Ngoại lệ phải là __autoload ed - PHP không thể biết.

Những gì bạn có thể làm là nhập một phụ namespace:

use Foo\Bar; 
$o = new Bar\Baz(); // Is Foo\Bar\Baz 

hoặc với bí danh:

use Foo\Bar as B; 
$o = new B\Baz(); // Is Foo\Bar\Baz 
+0

Có thể PHP chỉ tự động tải một lớp nếu nó không được tìm thấy trong tất cả các không gian tên hiện có (và đã nhập). Nếu tôi nhập khẩu một không gian tên mỗi lớp đã được xác định đúng (bao gồm) với không gian tên đó nên được gọi. – knittl

+0

Điều này sẽ dẫn đến một số lượng lớn các cuộc gọi tự động tải tại phải gọi trình nạp tự động cho mỗi không gian tên được nhập cho mỗi tên lớp được tham chiếu. Giả sử một chức năng autoload là tương đối đắt tiền (nhìn vào hệ thống tập tin) điều này là khá đáng chú ý. – johannes

+0

Chưa kể, tôi có thể muốn tạo lớp chứa tệp _during_ script execution và sau đó bao gồm chúng để sử dụng (một trường hợp không chắc và có lẽ không rất khôn ngoan, nhưng PHP có thể làm điều đó) – Mchl

0

Như đã giải thích Johannes hoặc bạn có thể aliases lớp học của bạn

KÊ KHAI:

namespace myNamespace; 

class myClass { 
    public function __toString() 
    { 
     return "Hello world!"; 
    } 
} 

EXECUTION:

include 'namespace.class.php'; 

use myNamespace\myClass as myClass; 

echo new myClass(); 
+1

Không phải những gì tôi yêu cầu. Tôi biết tôi có thể nhập các lớp đơn (và bí danh chúng), nhưng đó không phải là vấn đề của tôi – knittl

+0

Ồ xin lỗi, tôi biết rằng bạn muốn sử dụng các không gian tên như trong C# (tôi cũng vậy!) Nhưng như đã giải thích johannes nó không thể cho bây giờ .. Tôi muốn đóng góp với bí danh lớp công nghệ thay vì không gian tên phụ. – corretge

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