2013-07-09 34 views
5

Theo http://www.php.net/manual/en/reserved.variables.globals.php:

Một mảng kết hợp có chứa tham chiếu đến tất cả các biến được quy định hiện hành trong phạm vi toàn cầu của kịch bản.

Vì vậy, sau mã phải hiển thị rằng $ GLOBALS var có _SERVER, _ENV (nếu nó được kích hoạt trong variables_order trong php.ini) và _REQUEST phím:

var_dump($GLOBALS); 

Kết quả là:

  • Dưới nginx + php-fpm: thiếu _SERVER, _ENV, _REQUEST
  • Dưới cli: thiếu _ENV, _REQUEST

Hmm .. có lẽ có tài liệu về hành vi này? Tôi đã nhìn qua từng trang cho mỗi biến:

Và tôi đã tìm thấy không có đề cập về hành vi như vậy. Tại sao nó hoạt động như thế?

Tôi đã cài đặt php bằng gói debian từ http://www.dotdeb.org/ repo (không có gì được biên dịch thủ công) ... Hiện đang chạy với nginx + php5-fpm. Đó có phải là lỗi php không?

+0

Và nếu bạn đã làm 'var_dump ($ _ SERVER);'? – HamZa

+1

Tôi không chắc chắn, nhưng nhìn vào ['biến_order'] (http://www.php.net/manual/en/ini.core.php#ini.variables-order) thiết lập ini –

+4

$ _SERVER cũng là một biến superglobal, tương tự như $ GLOBALS, đó là lý do tại sao nó không được lưu trữ trong $ GLOBALS: 'Đây là một biến 'superglobal', hoặc toàn cục tự động, biến. Điều này đơn giản có nghĩa là nó có sẵn trong tất cả các phạm vi trong suốt một kịch bản.Không cần phải thực hiện biến $ global; để truy cập nó trong các hàm hoặc phương thức.' và '$ _SERVER là một mảng chứa thông tin như tiêu đề, đường dẫn và vị trí tập lệnh. Các mục trong mảng này được tạo bởi máy chủ web. Không đảm bảo rằng mọi máy chủ web sẽ cung cấp bất kỳ máy chủ nào trong số này, máy chủ có thể bỏ qua một số hoặc cung cấp cho người khác không được liệt kê ở đây ... ' –

Trả lời

6

tôi đã tạo ra một lỗi trên trang web php.net, và nhóm nghiên cứu php trả lời: https://bugs.php.net/bug.php?id=65223

Tóm tắt:

Đây không phải là một lỗi. siêu globals (hay còn gọi là auto globals) không được thêm vào các bảng biểu tượng theo mặc định vì lý do hiệu suất trừ khi trình phân tích cú pháp thấy cần. tức là

<?php $_SERVER; print_r($GLOBALS); ?>

sẽ liệt kê danh sách. Bạn cũng có thể kiểm soát này sử dụng auto_globals_jit trong php.ini: http://www.php.net/manual/en/ini.core.php#ini.auto-globals-jit

Cảm ơn đội php để trả lời quá nhanh!

+0

Cảm ơn phản hồi – thibauts

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