PHP'de dinamik değişken isimleriyle kaşlı ayraç kullanma


191

Dinamik değişken adları kullanmaya çalışıyorum (aslında ne denir emin değilim) Ama hemen hemen böyle:

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

var_dump($file0);

Geri dönüş nullbana bunun işe yaramadığını söyler. Aradığım sözdiziminin veya tekniğin ne olduğu hakkında hiçbir fikrim yok, bu da araştırmayı zorlaştırıyor. $filelistdaha önce tanımlanır.


22
Yapma ! Bunları kullanmak için asla iyi bir neden yoktur. Bunlar, etkili bir şekilde, sadece düzensiz bir dizidir. Bunun yerine uygun bir dizi kullanın.
Quentin

Pardon, geri döndüm ve şu ana kadar sorduğum her soru için bir cevap aldım. İyi bir şey sadece 7: P
user1159454

2
Ve Quentin, neden kötü bir uygulama? Sanırım dizilerin yanında var olmalarının bir nedeni olmalı
user1159454

user1159454 - Kullanabildikleri dizilere uygulanabilecek tüm araçlar olmadan dağınık bir karmaşa. Eski miras nedenleri ve çılgın kenar davaları için varlar.
Quentin

8
Crazy edge vakaları tam olarak neden bu soruyu sormak isteyebilirsiniz.
Vincent

Yanıtlar:


512

Bunları sarın {}:

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

Çalışma Örneği


Kullanmak ${}dinamik değişkenler oluşturmanın bir yoludur, basit bir örnek:

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

4
Aynı mantıkla dinamik diziler oluşturmak da mümkün müdür?
dtakis

@Dtakis ile aynı şüphem var, bize yardım edebilir misin? Mümkünse, lütfen bu soruya bir göz atın .
Marcio Mazzucato

Bir değişken (IMHO) dahil etmek için bunu kullanıyorsanız bir uyarı Jut çift tırnak kullanmayı unutmayın. ${'fixedTime$i'} = $row['timeInstance'];Eğer çok kullanışlı değil verir $fixedTime$iyerine $fixedTime1, $fixedTime2vb (Neyse neredeyse bunu hemen farketti.)
Benice

82

genel bakış

PHP'de, $dinamik bir değişken yapmak için değişkenin önüne fazladan bir şey koyabilirsiniz :

$$variableName = $value;

Ben tavsiye etmem olsa bile, bu davranışı bile zincirleyebilirsiniz:

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

Sen ancak koymak zorunda değildir yapabilirsiniz $variableNamearası {}:

${$variableName} = $value;

{}Yalnızca değişkeninizin adı kendisi gibi birden çok değerin bir bileşimi olduğunda kullanmak zorunludur:

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

Yine de her zaman kullanılması tavsiye edilir {}, çünkü daha okunabilir.

PHP5 ve PHP7 arasındaki farklar

Her zaman kullanmanın başka bir nedeni {}, PHP5 ve PHP7'nin dinamik değişkenlerle başa çıkmanın biraz farklı bir yoluna sahip olmasıdır, bu da bazı durumlarda farklı bir sonuçla sonuçlanır.

PHP7'de dinamik değişkenler, özellikler ve yöntemler artık PHP5'teki özel durumların karışımından farklı olarak kesinlikle soldan sağa sırayla değerlendirilecektir. Aşağıdaki örnekler değerlendirme sırasının nasıl değiştiğini göstermektedir.

Dava 1 : $$foo['bar']['baz']

  • PHP5 etkileşimi: ${$foo['bar']['baz']}
  • PHP7 etkileşimi: ${$foo}['bar']['baz']

Durum 2: $foo->$bar['baz']

  • PHP5 etkileşimi: $foo->{$bar['baz']}
  • PHP7 etkileşimi: $foo->{$bar}['baz']

Durum 3: $foo->$bar['baz']()

  • PHP5 etkileşimi: $foo->{$bar['baz']}()
  • PHP7 etkileşimi: $foo->{$bar}['baz']()

Durum 4: Foo::$bar['baz']()

  • PHP5 etkileşimi: Foo::{$bar['baz']}()
  • PHP7 etkileşimi: Foo::{$bar}['baz']()

6
Şüpheli bir konuya iyi bir cevap. Gerçekten böyle bir kod hata ayıklamak zorunda değilim.
martinstoeckli

4
yargılamadan soruyu cevapladığı için en iyi cevap
Rid Iculous

2
Evet, eski kodlarla da sorun yaşadık. Üretim PHP5.5, Dev ortamı PHP7 idi. Bu soruyu destekliyorum.
Ogier Schelvis


5

Bunu bir sorgudan döndürülen sonuçlarda sık sık yaparım.

Örneğin

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

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

Şimdi $ MyQueryResult ['MyFieldname'] yerine $ MyFieldname (echo ifadelerinde daha kolay vb.)

Evet, muhtemelen tembel, ama hiç problem yaşamadım.


14
Hiç PHP extract () işlevini kullanmaya çalıştınız mı? php.net/manual/tr/function.extract.php
DarkSide

1
DB sonuç kümeleri için kullanışlı tek
satırlık

2

Tom diziniz varsa o diziyi nesneye dönüştürebilir ve şu şekilde kullanabilirsiniz:

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

0

i dinamik olarak oluşturulan değişken değeri için bir çözüm var ve bir değişken tüm değeri birleştirdi.

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

0

6 özdeş dizime sahip olduğum bir konumdaydım ve başka bir değişkene bağlı olarak doğru olanı seçip ona değer atamam gerekiyordu. Burada gösterilen durumda $ comp_cat 'a' idi, bu yüzden 'a' dizimi seçmem gerekiyordu (tabii ki 'b' - 'f' dizileri de vardı)

Dizideki değişkenin konumu için değerlerin kapanış ayracı sonrasında gittiğine dikkat edin.

$ {'comp_cat _'. $ comp_cat .'_ arr '} [1] [0] = "FRED BLOGGS";

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

echo 'İlk dizi değeri'. $ comp_cat_a_arr [1] [0]. ' ve ikinci değer. $ comp_cat_a_arr [1] [1];


0

() Yerine {} kullanmayı deneyin:

${"file".$i} = file($filelist[$i]);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.