2013-08-13 44 views
5

Một lưu ý quan trọng: $GLOBALS bẩn và cái ác. Không sử dụng chúng. Không bao giờ. Không bao giờ.
Hãy tập trung vào thực tế là nó không hoạt động và không lý do tại sao bạn sẽ làm điều này ở nơi đầu tiên, nó hoàn toàn là một câu hỏi lý thuyết về một bài tập kỹ thuật.

Đây là một điều khá lạ. Tôi đang cố gắng xây dựng một biến biến bằng cách sử dụng một chuỗi có tên là $GLOBALS.

Từ phạm vi toàn cầu

Hãy xem những gì chúng tôi nhận được khi var_dump() ing này trong phạm vi toàn cầu.

$g = sprintf('%s%s%s%s%s%s%s', chr(71), chr(76), chr(79), chr(66), chr(65), chr(76), chr(83)); 
var_dump($$g); 

Kết quả là một chuỗi các biến toàn cục, bạn có thể xem here. Tuyệt quá! Vì vậy, hãy thử điều này trong một hàm.

Từ một phạm vi chức năng

Đầu tiên, chúng ta hãy chỉ cần đảm bảo rằng chúng tôi thực sự có thể chạy một kiểm tra $GLOBALS trong một hàm.

function globalAllTheThings() 
{ 
    var_dump($GLOBALS); 
} 

globalAllTheThings(); 

Kết quả là: nó hoạt động !! Bạn có thể thấy điều này here.

Bây giờ, hãy thử thử nghiệm đầu tiên mà chúng tôi đã sử dụng trong phạm vi toàn cầu, bên trong hàm và xem điều gì xảy ra.

function globalAllTheThings() 
{ 
    $g = sprintf('%s%s%s%s%s%s%s', chr(71), chr(76), chr(79), chr(66), chr(65), chr(76), chr(83)); 
    var_dump($$g); 
} 

globalAllTheThings(); 

Để đơn giản

Bạn cũng có thể thử mà không obfuscation lạ này (đừng hỏi).

function globalAllTheThings() 
{ 
    $g = 'GLOBALS'; 
    var_dump($$g); 
} 

globalAllTheThings(); 

trả NULL. Nó là về cái gì vậy?? Tại sao nó trả lại NULL và tôi có thể làm gì để làm việc này. Lý do tại sao bạn hỏi? Vì mục đích giáo dục, và cho khoa học!

ALL THE THINGS, SRSLY

+2

Vì lợi ích của sự đơn giản, bạn không thể viết '$ g = 'GLOBALS'' thay vì' sprintf-chr' kỳ lạ của bạn? Nó không ảnh hưởng đến kết quả. Nếu nó đã làm, đó sẽ là giá trị một câu hỏi toàn bộ 'nother. – deceze

+3

Vì là PHP. –

+2

Vì '$ {'string'}' tìm biến trong phạm vi đã cho. – Leri

Trả lời

4

Bởi vì hướng dẫn nói như vậy:

Cảnh báo

Xin lưu ý rằng các biến biến không thể được sử dụng với mảng superglobal PHP trong chức năng hoặc các phương pháp lớp. Biến số $this cũng là một biến đặc biệt không thể tham chiếu động.

http://php.net/manual/en/language.variables.variable.php

Nó chỉ đơn giản "đặc biệt". PHP là "đặc biệt". Superglobals không chơi theo các quy tắc giống như các biến thông thường để bắt đầu. Ai đó đã quên hoặc quyết định không làm cho chúng tương thích với các biến biến trong các hàm. Giai đoạn.

+0

Chà, tìm đẹp. Tôi đã làm "RTFM" về điều này nhưng phải bỏ lỡ điều đó. Thật là thất bại. – Jimbo

+3

... trong đó "đặc biệt" được sử dụng theo nghĩa chính trị không chính xác cao. – DaveRandom

+0

@Dave PHP là ngôn ngữ trong số các ngôn ngữ lập trình mà chủ yếu được xác định bởi ngoại lệ của nó, không phải là quy tắc của nó ...;) – deceze

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