Sử dụng dấu ngoặc nhọn với tên biến động trong PHP


191

Tôi đang cố gắng sử dụng tên biến động (Tôi không chắc chúng thực sự được gọi là gì) Nhưng khá giống như thế này:

for($i=0; $i<=2; $i++) {
    $("file" . $i) = file($filelist[$i]);
}

var_dump($file0);

Sự trở lại là nullcho tôi biết nó không hoạt động. Tôi không biết cú pháp hay kỹ thuật tôi đang tìm kiếm ở đây là gì, điều này làm cho nó khó nghiên cứu. $filelistđược định nghĩa trước đó.


22
Đừng ! Không bao giờ có một lý do tốt để sử dụng chúng. Họ, một cách hiệu quả, chỉ là một mảng không gọn gàng. Sử dụng một mảng thích hợp thay thế.
Quentin

Được rồi, tôi xin lỗi, tôi chỉ quay lại và chọn một câu trả lời cho mỗi câu hỏi tôi đã hỏi cho đến nay. Điều tốt là nó chỉ có 7: P
user1159454

2
Và Quentin, tại sao họ thực hành xấu ?? Phải có một lý do chúng tồn tại bên cạnh các mảng tôi nghĩ
user1159454

@ user1159454 - Chúng là một mớ hỗn độn vô tổ chức mà không có tất cả các công cụ có thể được áp dụng cho các mảng có sẵn cho chúng. Chúng tồn tại vì lý do di sản cổ xưa và các trường hợp cạnh điên rồ.
Quentin

8
Trường hợp cạnh điên có thể chính xác là lý do tại sao một người nào đó muốn hỏi câu hỏi này.
Vincent

Câu trả lời:


511

Gói chúng vào {}:

${"file" . $i} = file($filelist[$i]);

Ví dụ làm việc


Sử dụng ${}là một cách để tạo các biến động, ví dụ đơn giản:

${'a' . 'b'} = 'hello there';
echo $ab; // hello there

4
Có phải cũng có thể tạo các mảng động với cùng logic không?
dtakis

Tôi có cùng nghi ngờ về @dtakis, bạn có thể giúp chúng tôi không? Nếu có thể, xin vui lòng xem câu hỏi này .
Marcio Mazzucato

Hãy cảnh báo nếu bạn đang sử dụng điều này để bao gồm một biến (cách hữu ích nhất IMHO) đừng quên sử dụng dấu ngoặc kép. ${'fixedTime$i'} = $row['timeInstance'];cung cấp cho bạn một thứ không hữu ích $fixedTime$ithay vì $fixedTime1, $fixedTime2vv (May mắn thay đã phát hiện ra nó gần như ngay lập tức.)
BeNice

81

Tổng quat

Trong PHP, bạn chỉ có thể đặt một phần bổ sung $trước một biến để biến nó thành một biến động:

$$variableName = $value;

Mặc dù tôi không khuyến nghị nhưng bạn thậm chí có thể xâu chuỗi hành vi này:

$$$$$$$$DoNotTryThisAtHomeKids = $value;

Bạn có thể nhưng không bị buộc phải đặt $variableNamegiữa {}:

${$variableName} = $value;

Việc sử dụng {}chỉ bắt buộc khi tên biến của bạn là một thành phần của nhiều giá trị, như sau:

${$variableNamePart1 . $variableNamePart2} = $value;

Tuy nhiên, luôn luôn nên sử dụng {}vì nó dễ đọc hơn.

Sự khác biệt giữa PHP5 và PHP7

Một lý do khác để luôn luôn sử dụng {}, đó là PHP5 và PHP7 có cách xử lý các biến động hơi khác nhau, dẫn đến kết quả khác nhau trong một số trường hợp.

Trong PHP7, các biến động, thuộc tính và phương thức động bây giờ sẽ được đánh giá đúng theo thứ tự từ trái sang phải, trái ngược với sự pha trộn của các trường hợp đặc biệt trong PHP5. Các ví dụ dưới đây cho thấy thứ tự đánh giá đã thay đổi như thế nào.

Trường hợp 1 : $$foo['bar']['baz']

  • Sự can thiệp của PHP5: ${$foo['bar']['baz']}
  • Sự can thiệp của PHP7: ${$foo}['bar']['baz']

Trường hợp 2: $foo->$bar['baz']

  • Sự can thiệp của PHP5: $foo->{$bar['baz']}
  • Sự can thiệp của PHP7: $foo->{$bar}['baz']

Trường hợp 3: $foo->$bar['baz']()

  • Sự can thiệp của PHP5: $foo->{$bar['baz']}()
  • Sự can thiệp của PHP7: $foo->{$bar}['baz']()

Trường hợp 4: Foo::$bar['baz']()

  • Sự can thiệp của PHP5: Foo::{$bar['baz']}()
  • Sự can thiệp của PHP7: Foo::{$bar}['baz']()

6
Một câu trả lời tốt cho một chủ đề đáng ngờ. Tôi thực sự rất vui vì tôi không phải gỡ lỗi mã như vậy.
martinstoeckli

4
câu trả lời hay nhất vì nó chỉ trả lời câu hỏi mà không bị phán xét
Rid Iculous

2
Vâng, chúng tôi đã có một số rắc rối với một số mã di sản là tốt. Sản xuất là PHP5.5, môi trường Dev là PHP7. Tôi đang ủng hộ câu hỏi này.
Ogier Schelvis


5

Tôi làm điều này khá thường xuyên trên các kết quả được trả về từ một truy vấn ..

ví dụ

// $MyQueryResult is an array of results from a query

foreach ($MyQueryResult as $key=>$value)
{
   ${$key}=$value;
}

Bây giờ tôi chỉ có thể sử dụng $ MyFieldname (dễ dàng hơn trong các câu lệnh echo, v.v.) chứ không phải $ MyQueryResult ['MyFieldname']

Đúng, có lẽ là lười biếng, nhưng tôi chưa bao giờ gặp vấn đề gì.


14
Bạn đã bao giờ thử sử dụng hàm extract () của PHP chưa? php.net/manual/en/feft.extract.php
DarkSide

1
tiện ích một lớp lót cho các tập kết quả DB: foreach ($ row as $ k => $ v) {$$ k = $ v}
Thoát Iculous

2

Tom nếu bạn có mảng hiện có, bạn có thể chuyển đổi mảng đó thành đối tượng và sử dụng nó như thế này:

$r = (object) $MyQueryResult;
echo $r->key;

0

tôi có một giải pháp cho giá trị biến được tạo động và kết hợp tất cả giá trị trong một biến.

if($_SERVER['REQUEST_METHOD']=='POST'){
    $r=0;
    for($i=1; $i<=4; $i++){
        $a = $_POST['a'.$i];
        $r .= $a;
    }
    echo $r;
}

0

Tôi đã ở một vị trí mà tôi có 6 mảng giống hệt nhau và tôi cần chọn đúng mảng tùy thuộc vào một biến khác và sau đó gán giá trị cho nó. Trong trường hợp hiển thị ở đây $ comp_cat là 'a' vì vậy tôi cần chọn mảng 'a' của mình (tất nhiên tôi cũng có mảng 'b' đến 'f')

Lưu ý rằng các giá trị cho vị trí của biến trong mảng đi sau dấu ngoặc đóng.

$ {'comp_cat _'. $ comp_cat .'_ Array '} [1] [0] = "BLOG FRED";

$ {'comp_cat _'. $ comp_cat .'_ Array '} [1] [1] = $ file_tidy;

echo 'Giá trị mảng đầu tiên là'. $ comp_cat_a_arr [1] [0]. ' và giá trị thứ hai là. $ comp_cat_a_arr [1] [1];


0

Hãy thử sử dụng {} thay vì ():

${"file".$i} = file($filelist[$i]);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.