2012-02-14 21 views
11

Tôi có một tập tin mà require() 'sa namespace, như vậy:PHP: Namespaces trong một tập tin duy nhất với một namespace toàn cục

<?php 
require_once('Beer.php'); // This file contains the Beer namespace 

$foo = new Beer\Carlsburg(); 
?> 

Tôi muốn đưa không gian tên Bia trực tiếp trong cùng một tập tin, như ví dụ này (không hoạt động):

<?php 
namespace Beer { 
    class Carlsburg {} 
} 

$foo = new Beer\Carlsburg(); 
?> 

Tuy nhiên, thông dịch viên PHP phàn nàn rằng No code may exist outside of namespace. Do đó, tôi có thể bọc tờ khai $foo trong một không gian tên, nhưng sau đó tôi cũng phải bọc Bia trong không gian tên đó để truy cập nó! Dưới đây là một ví dụ làm việc của những gì tôi đang cố gắng để tránh:

<?php 
namespace Main\Beer { 
    class Carlsburg {} 
} 

namespace Main { 
    $foo = new Beer\Carlsburg(); 
} 
?> 

Có cách nào để bao gồm các mã cho Beer namespace trong file, nhưng không quấn khai $foo trong không gian tên riêng của mình (để lại nó trong không gian tên chung)?

Cảm ơn.

+0

Bạn nên có Heineken như namespace! – marko

Trả lời

15

Bạn nên sử dụng không gian tên toàn cầu:

<?php 
namespace Beer { 
    class Carlsburg {} 
} 


namespace { // global code 
    $foo = new Beer\Carlsburg(); 
} 
?> 

Xem ở đây ->http://php.net/manual/en/language.namespaces.definitionmultiple.php

+0

Điều này sẽ không hoạt động trừ khi bạn viết '$ foo = new Main \ Beer \ Carlsburg(); ' –

+0

@skwee oops ... xin lỗi - được cập nhật để khớp câu hỏi – ManseUK

+2

Hoặc tận dụng' use', xem http: // stackoverflow. com/a/9274472/367456 – hakre

2

Hãy thử đặt một dấu chéo ngược trước tên namespace:

$beer = new \Beer\Carlsberg(); 

Các xuyệc ngược ban đầu được phiên dịch sang "toàn cầu namespace". Nếu bạn không đặt dấu gạch chéo ngược hàng đầu, tên lớp được dịch sang không gian tên hiện tại.

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