2013-08-15 27 views
15

Khi các trạng thái tiêu đề, tôi thực sự muốn làm rõ điều này. Tôi đã đọc một vài bài báo và đăng ở đây về chủ đề này, một cái gì đó chỉ là không nhấp cho tôi. Tôi sẽ thêm một chút mới cho Php. OK, đây là điều tôi muốn hiểu;Php define() Các hằng số bên trong Làm rõ không gian tên

namespace Information; 
define('ROOT_URL', 'information/'); 
define('OFFERS_URL', ROOT_URL . 'offers/'); 

namespace Products; 
define('ROOT_URL', 'products/'); 
define('OFFERS_URL', ROOT_URL . 'offers/'); 

Tôi muốn các hằng số để được constructable, tức là, xây dựng hằng từ hằng số cơ bản (s), đó là lý do tại sao tôi đang sử dụng define ('NAME', giá trị) ;.

Câu hỏi của tôi là, giá trị của ROOT_URL có mang lại giá trị tương đối với không gian tên của nó không? Như thế này;

$info_offers_url = \Information\OFFERS_URL; ('information/offers/') 
$prod_offers_url = \Products\OFFERS_URL;  ('products/offers/') 

Hoặc xác định(); đặt ROOT_URL trong phạm vi toàn cầu, do đó tôi không nên làm điều này? Có cách nào tốt hơn không?

Tất cả trợ giúp đều được đánh giá cao.

+4

Trích dẫn từ namual: 'Giống như superglobals, phạm vi của một hằng số được global.' Họ không namespaced –

+0

@ Mark Baker, cảm ơn bạn rất nhiều. Làm cách nào để đánh dấu câu trả lời của bạn là câu trả lời và đánh dấu bạn? Chỉ muốn cung cấp cho bạn một số điểm rep hơn –

Trả lời

20

Nếu bạn muốn xác định hằng số trong không gian tên, bạn sẽ cần phải xác định không gian tên trong cuộc gọi của bạn để xác định(), ngay cả khi bạn đang gọi define() từ trong không gian tên. Các ví dụ sau mà tôi đã thử sẽ làm cho nó rõ ràng.

Mã sau sẽ xác định hằng số "CONSTANTA" trong không gian tên chung (tức là "\ CONSTANTA").

<?php 
namespace mynamespace; 
define('CONSTANTA', 'Hello A!'); 
?> 

nếu bạn muốn xác định liên tục cho một không gian tên bạn có thể định nghĩa như

<?php 
namespace test; 
define('test\HELLO', 'Hello world!'); 
define(__NAMESPACE__ . '\GOODBYE', 'Goodbye cruel world!'); 
?> 

Taken từ Manual

+8

Đối với những gì nó có giá trị, điều này là từ ý kiến ​​người dùng, không phải từ hướng dẫn thực tế. –

+0

Bạn cũng có thể nhập các hằng số không gian tên: 'sử dụng const Foo \ BAR'. Lưu ý _const_. – Bell

+0

Việc có thể nhập chúng cũng chứng tỏ đó là không gian tên thực như trái ngược với dấu gạch chéo ngược được cho phép trong tên. – Bell

9

Sử dụng hằng namespaced là khá dễ dàng nhưng bạn phải sử dụng const từ khóa.

Sau đó, bạn có thể trực tiếp gọi hằng số sử dụng dấu chéo ngược \:

namespace Dummy\MyTime; 
const MONTHS = 12; 
const WEEKS = 52; 
const DAYS = 365; 


namespace Test; 
use Dummy\MyTime; 

$daysPerWeek = MyTime\DAYS/MyTime\WEEKS; 
$daysPerMonth = MyTime\DAYS/MyTime\MONTHS; 

echo "Days per week: $daysPerWeek\n"; // 7.0192307692308 
echo "Days per month: $daysPerMonth\n"; // 30.416666666667 

Tôi nghĩ rằng đây là sạch hơn so với sử dụng define.

Có nói rằng, những gì bạn muốn (gán một biểu hiện vô hướng tới một hằng số) sẽ chỉ làm việc nếu bạn đang sử dụng PHP> = 5,6:

namespace Information; 
const ROOT_URL = 'information/'; 
const OFFERS_URL = ROOT_URL . 'offers/'; 

namespace Products; 
const ROOT_URL = 'products/'; 
const OFFERS_URL = ROOT_URL . 'offers/'; 

namespace Test; 
$info_offers_url = \Information\OFFERS_URL; // information/offers/ 
$prod_offers_url = \Products\OFFERS_URL; // products/offers/ 

Tôi hy vọng điều này sẽ giúp bạn.

Nguồn: http://php.net/manual/en/migration56.new-features.php

+1

Mặc dù câu trả lời này không trực tiếp về 'define()', nó rất hữu ích. – BlitZ

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