2010-07-23 36 views
13

Có một lời giải thích hợp lý cho điều này?Đây có phải là lỗi biến biến php không?

<?php 
$$a = 'hello world'; 
echo $$a; //displays hello world 
echo $$aa; //displays hello world 
echo $$aaa; //displays hello world 
?> 
+0

Đây có lẽ là một php 5.3 hành vi – Dami

+0

Không nó không phải là, ông không nhận được nó ngay. – Sarfraz

+0

Cảm ơn tất cả. Điều này có ý nghĩa bây giờ, nói cách khác. echo $ {null}; cũng hợp lệ. – Dami

Trả lời

7

nếu bạn cố gắng

$$a = 'hello world'; 
echo $$a; //displays hello world 
echo $$aa; //displays hello world 
echo $$aaa; //displays hello world 


die("<pre>" . print_r(get_defined_vars(), true) . "</pre>"); 

bạn có thể thấy rằng nó đã registed một biến không có tên nên có, theo quy ước đặt tên của PHP, đây sẽ là một lỗi

+0

vì vậy trái với quy ước đặt tên php, một biến có thể là null, hoặc một chuỗi rỗng – Dami

+0

Tôi nghĩ rằng ông đề cập đến các quy ước đặt tên cho tên biến chính nó. '$ var' là một biến, nhưng' $ 'không phải là ... –

+0

Tôi không chắc chắn cái gì làm cho một lỗi này. Nó chắc chắn là không tốt thực hành, và tôi muốn PHP sẽ nâng cao cảnh báo về những thứ như thế này theo mặc định, nhưng hành vi là nhất quán. – Matchu

2

Tôi đặt cược rằng nó xác định biến là cái gì đó có hiệu lực là ${''} hoặc biến không có tên hoặc một thứ gì đó dọc theo các dòng đó.

Vì không phải $a cũng không $aa cũng không phải $aaa được xác định, tất cả đều trỏ đến cùng tên biến trống, trống khi được sử dụng trong ngữ cảnh biến biến.

1

Vâng, nếu $ a trống, thì bạn đang đặt tên biến trống thành = 'hello world' ... Vì vậy, mỗi lần bạn tham chiếu tên biến trống đó, bạn sẽ nhận được những gì được lưu trữ ở đó ..

. nó giống như

$a = ''; 
$$a = 'Foo Bar'; 
$b = ''; 
echo $$b; //Displays Foo Bar 
1

Bạn không nhận được điều đó đúng, xem xét việc này:

$a = 'hello'; 
$hello = "hello again"; 
echo $$a; 

Output:

hello again 

Trong trường hợp của bạn, bạn chưa thiết lập giá trị của các biến sau đây, vì vậy nó xuất ra tương tự.

Giải thích:

Khi bạn làm $$a, nó có nghĩa là:

$       $a; 
^       ^
$ used for php vars   means a's value that is hello 

Vì vậy, nó trở thành:

$hello 

của ai giá trị là:

hello again 
+0

Tôi hiểu biến biến, tôi chỉ thích thú rằng có thể có một biến không tên, hoặc một biến với null hoặc một chuỗi rỗng được đặt làm tên của nó. – Dami

12

Khi thực hiện

bạn đang nói lấy giá trị $a. Chuyển đổi nó thành chuỗi. Sử dụng String làm tên biến để gán 'foo' cho nó.Vì $a không xác định và trả về NULL, khi được nhập thành Chuỗi là '', bạn sẽ gán biến số ${''};

echo ${''}; // 'foo' 

Trớ trêu thay, bạn có thể làm

Và bạn có thể làm

${''} = function() { return func_get_arg(0); }; 
echo ${''}('Hello World'); 
// or 
echo $$x('Hello World'); 

đó sẽ kích hoạt một thông báo về $x được undefined nhưng sản lượng Hello World sau đó. Funny đủ, công việc doesnt sau:

${''} = function() { return func_get_arg(0); }; 
echo $x('Hello World'); 

Bởi vì nó gây nên Fatal error: Tên hàm phải là một chuỗi. Quirky: D

Kể từ khi hướng dẫn PHP nói

Variable names follow the same rules as other labels in PHP. A valid variable name starts with a letter or underscore, followed by any number of letters, numbers, or underscores.

Tôi muốn xem xét việc có thể để gán một biến có tên rỗng một lỗi thực sự.

Có một lỗi phần nào liên quan đã đệ đơn xin này đã:

+1

Bạn không chắc liệu điều đó có thật mỉa mai không, đó có phải là điều bạn mong đợi không? Điều đó không nói nhiều hơn đến cách trình phân tích cú pháp hoạt động, ở chỗ nó chỉ nhận ra các khai báo tường minh của một chuỗi rỗng. Disclaimer: Tôi không biết gì về php. – Grantismo

+0

@Grantismo Tôi mong đợi PHP ngăn không cho tôi thực hiện $ {''} = 'foo' khi tôi không thể thực hiện $ = 'foo' và hướng dẫn sử dụng nói rằng các biến phải có tên. Ngoài ra, cách phổ biến của việc gán biến là không có dấu ngoặc nhọn. Nhưng vâng, làm cho bạn tự hỏi về trình phân tích cú pháp :) – Gordon

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