PHP nasıl şartlı sınıf özellik değişkenleri atamak için

6 Cevap php

Ben php sınıfları, diziler, vb yeniyim, bu yüzden doğru terminolojiyi kullanmak istemiyorsanız lütfen beni bağışlayın. Ne arıyorum "eğer" ifadeleri bağımlı kalmadan kolayca sınıftan özellikleri değerleri atamak nasıl.

Örneğin:

Ben bir sınıf test bir örneği var, ve "test" bir özelliği olan "çalışan" vardır (bu aramak için doğru yoldur umut) ve çalışan bir karmaşık türü olduğunu varsayalım.

Yani, böyle bir şey var:

$test -> employee = array('Age' => '30', 'Sex' =>$sex, 'nationality'=>$nationality, 'maritalstatus'=>$status, etc, etc)

Burada var sorun ne 'Yaş ",' Seks ',' Uyruk ', vb her zaman mevcut değildir ve ben sadece when they have something assigned onlara değer atamak istiyorum, ve ben istemiyorsanız Boş olmayan değerler her bir kombinasyon için ise kullanalım ... (bu bir kısa örnek, ama bu niteliklerin çok veya ne olursa olsun denir ve çok sayıda kombinasyon çok dağınık "eğer" olan var) ...

Ben bir sabun istek olarak daha sonra bu değerleri yolluyorum ve herhangi bir boş xml etiketleri istemiyorum ...

Özür dilerim, benim terminoloji doğru değil, ama ben bana yardımcı olmak için orada birisi için yeterince açık oldum umut varsa!

Thanks in advance, Pablo

6 Cevap

Buna ne dersiniz:

$array = array('Age' => '30' , 'Sex' => $sex, 'nationality' => $nationality, 'maritalstatus' => $status);
foreach ($array as $key => $value) { 
    if (is_null($value) || $value=="") { 
        unset($array[$key]); 
    } 
}
$test->employee = $array;

Bu durumda neler yapabileceğini:

  • Çalışan bir özel nitelik yapmak
  • Sağlanacak tüm argümanlar gerektiren bir "setter" yöntemi setEmployee tanımlayın.

İşte bazı örnek kod; Bu deneyin:

    <?php

    class test{

        private $employee;

        public function setEmployee($age,$sex,$nationality,$maritalstatus){
            $this->employee=array('Age'=>$age,
                            'Sex'=>$sex,
                            'Nationality'=>$nationality,
                            'MaritalStatus'=>$maritalstatus);
        }

        public function getEmployee(){
            return $this->employee;
        }
    }


    $t=new test();
    $t->setEmployee('32','M','American','Married');

    print_r($t->getEmployee());
    ?>

Kısa bir üçlü çözüm düşündünüz mü?

'Sex' => ( isset($sex) ? $sex : "n/a" )

Bu aslında if-else mantık gerçekleştirirken, ama yaklaşık olarak ayrıntılı değildir. Bizim durumdur isset($sex). Eğer bu doğruysa, biz başka biz "n/a" return, $sex return. İdeal döndürülür 'Sex' değeri olur.

Bu yeterli değilse, ben örnekleme sırasında geçerli değerler gerektiren için teşvik edecek. Kullanıcı uygun ve beklenen değerlerini sağlamak değilse, sınıfın örneğinin reddediyorum.

$temp_array = array('Age' => '30', 'Sex' =>$sex, 'nationality'=>$nationality, 'maritalstatus'=>$status, etc, etc);

foreach($temp_array as $key => $val){
 if(!$temp_array[$key]){
  unset($temp_array[$key];
 }
}

Eğer bir değer olarak FALSE kabul etmek gerekiyorsa, o zaman bunun yerine kullanabilirsiniz:

$temp_array = array('Age' => '30', 'Sex' =>$sex, 'nationality'=>$nationality, 'maritalstatus'=>$status, etc, etc);

foreach($temp_array as $key => $val){
 if($temp_array[$key] !== NULL){
  unset($temp_array[$key];
 }
}

edit: bu non-null veya olmayan falsey değerleri final dizisinde bulunur ile emin sadece anahtarları yapar.

Tek yönlü bir dizi olası anahtarlarını saklamak olurdu - o zaman tekrarlayabilirsiniz sadece her dizi için kontrol kodu bir dizi gerekir:

$keys = array('Age', 'Sex', 'Nationality');

foreach ($keys as $key) {
  if ( isset($inputs[$key]) )
    $test->employee[$key] = $inputs[$key];
}

Senin sorunun üzerinde karıştı biraz duyuyorum. Böyle $ cinsiyet, milliyet $, ve benzeri her zaman tanımlı değil gibi değişkenler ya da sadece bazen null ayarlanır? Bu değişkenlerin her zaman yoksa, ilk kendi varlığı için kontrol şarttır ve etrafında hiçbir yolu yoktur - Daha önce kod refactor sürece.

Ben değişkenler var mı küstah yaşıyorum ve sadece NULL davaları kaydetmek istemiyorum.

Böyle bir durum için ortak bir seçim - Bir OOP yaklaşımı, veri encapsulation kullanmak olabilir. Bu değişiklikler aşağıdaki test sınıfına yapılmalıdır.

class test {

  protected $employee = array();

  public function getEmployee() {
    return $this->employee;
  }

  public function setEmployee($employee) {
    foreach ($employee as $key => $value) {
      if ($value !== null) {  // or any value it should not be
        $this->employee[$key] = $value;
      }
    }
  }

...

Başka bir yaklaşım kendi nesnesi olarak çalışan tanıtmak olabilir, ve boş değerleri atlamak için kendi nesne mekanizmalarını kullanmak istiyorsunuz. Yine veri encapsulation kullanmak, __ set geçersiz olabilir, argümanlar inşa __ almak, ya da başka çözümler çeşitli.