PHP Değişken fonksiyonlar ve değişken isimleri

5 Cevap php

PHP, bu gibi bazı kod var ki:

$infrastructure = mt_rand(0,100);
if ($infrastructure < $min_infrastructure) $infrastructure = $min_infrastructure;
//do some other stuff with $infrastructure
$country->set_infrastructure($infrastructure);

$education = mt_rand(0,100);
if ($education < $min_education) $education = $min_education;
//do some other stuff with $education
$country->set_education($education);

$healthcare = mt_rand(0,100);
if ($healthcare < $min_healthcare) $healthcare = $min_healthcare;
//do some other stuff with $healthcare
$country->set_healthcare($healthcare);

Gibi denebilecek bir işlevi içine talimatlar bu benzer setleri birleştirerek bazı yolu var mı:

change_stats("infrastructure");
change_stats("education");
change_stats("healthcare");

Temel olarak, can you use variables in PHP in other variable names and function names?

Şimdiden teşekkürler.

5 Cevap

PHP Bunu yapmak için "variable variables" dediği kullanabilirsiniz. Ben örnek biraz tuhaf görünüyor, yapmacık, ancak değişkenler ve nesneler küresel varsayarak, böyle name_pet () işlevi yazabilirsiniz umut:

function name_pet($type, $name)
{
    $class='the_'.$type;
    $var=$type.'_name';

    $GLOBALS[$class]->setName($name);
    $GLOBALS[$var]=$name;
}

EDIT, this answer refers to an earlier version of the question.

Evet, bu bir görünüm here bir tartışma ve here, bir öğretici almak mümkündür.

Sorunuzu yanıtlamak için: Evet, $ {$ değişken} sözdizimi kullanarak, değişken isimleri gibi değişkenleri kullanabilirsiniz.

Ancak, bu $ THE_ {$ petname} değişkenleri ayarlama gibi name_pet fonksiyonu kapsamında olmalarını gerektirir, burada yapmaya çalışıyoruz ne için uygun bir çözüm olarak görünmüyor.

Bunu yapmak için çalışıyoruz ne olduğunu biraz daha açar mısınız?

Bazı öneriler: $ fish_name = $ the_fish-> setName ("Goldie") yapmak, böylece hayvan sınıfı (veya ne olursa olsun kedi, köpek ve balık olmasıdır), set ediliyor adını döndürmek var;

Veya daha da iyisi, bu bilgiler artık nesnede saklanır beri ... sadece $ the_fish-> getName () diyebiliriz, tüm $ fish_name kullanmayın; Eğer $ the_fish kullanmak istiyorum burada.

Umarım bu yardımcı olur?

Ben bu işlevi hakkında emin değilim ama __ set kullanarak benzer bir şey yapabileceğini

$data;
function __set($key, $val) {
 $this->data["$key"] = $val;
}

Ve evet dinamik değişkenleri kullanabilirsiniz

$foo = "bar";
$dynamic = "foo";

echo $$dynamic; //would output bar
echo $dynamic; //would output foo

Bu bir ortak model ve üstlenmeden zaman dikkat etmek özellikle önemlidir, çünkü bu ilginç bir soru.

Tamamen fonksiyonel şekilde, bu gibi bazı kod kullanabilirsiniz:

function rand_or_min( $value, $key, $country ) {
  $rand = mt_rand(0,100);
  if ($rand < $value ) { $rand = $value; }
  // do something
  call_user_func( array( $country, 'set_' . $value ), array( $rand ) );
}

$arr = array('infrastructure' => 5,'education' => 3,'healthcare' => 80);
array_walk( $arr, 'rand_or_min', $country );

De yukarıdaki işleri rağmen, ben çok daha nesne yönelimli bir yol kullanmanızı tavsiye ederim. Eğer yukarıdaki gibi bir model görmek zaman, sınıflar ve alt sınıflar düşünme olmalıdır. Neden? Çoğaltılamaz davranış ve benzeri devlet (değişkenler) var çünkü.

Daha OOP şekilde, bu yüzden gibi de gerçekleştirilebilirdi:

class SomeBasicBehavior {

   function __construct( $min = 0 ) {
      $rand = mt_rand(0,100);
      if( $rand < $min ) { $rand = $min };
      return $rand;
   }

}

class Infrastructure extends SomeBasicBehavior {
}

class Education extends SomeBasicBehavior {
}

class Healthcare extends SomeBasicBehavior {
}

$country->set_infrastructure( new Infrastructure() );
$country->set_education( new Education() };
$country->set_healthcare( new Healthcare() };

Çok daha okunabilir olduğunu, ama aynı zamanda çok daha genişletilebilir ve test edilebilir değil sadece. Sizin "bir şey yok" kolayca her sınıfta üye işlevleri olarak uygulanabilir ve (SomeBasicBehavior sınıfını kullanarak) gerektiğinde paylaşılabilecek ya da ihtiyaç olarak kapsüllü gibi davranışları olabilir.