Tek bir sonuç için yöntemler anahtarlama

5 Cevap php

Ben bazı verileri bulmak için farklı yöntemler ile PHP farklı nesneleri danışmak gerektiren bir durum var.

Soru gerçek bir programlama sorunu daha kod biçimlendirme hakkında daha fazla görüyor. Ne yapmaya çalışıyorum bu verileri gibi toplamak için if 'nin çeşitli kullanarak değil:

$data = obj->getData();
if (!isset($data)) $data = othObj->getThisData();
if (!isset($data)) $data = anothObj->getTheData();
if (!isset($data)) $data = anothOne->getAData();
...
process($data)

Ben başka yöntemler kullanılarak daha iyi bir yol foreach veya switch/case gibi olan ne varsa, bu durumda en iyi uygulamalar vardır merak ediyorum.

Teşekkürler!

5 Cevap

Eğer denemek istediğiniz olası nesnelerin bir dizi yapmak, sonra bir döngü çalıştırın. Daha rahat olabilir. Bu kod parametreleri içerir ve bunun yerine call_user_func_array kullanmak için modifiye edilebilir.

$dataCallback = array(
    array($othObj, 'getData'),
    array($othObj, 'getThisData'),
    array($anothObj, 'getTheData'),
    array($anothOne, 'getAData'),
);

for($i = 0, $t = count($dataCallback); !isset($data) && $i < $t; $i++) {
  $callback = $dataCallback[$i];
  $data = call_user_func($callback);
}

if (isset($data))
  process($data);
else
  //no valid data returned at all ...
  1. Bu öyle bir şekilde çok kötü görünmüyor.
  2. Eğer en iç içe olsaydı biraz daha verimli olabilir. örneğin

     if (!isset($data = othObj->getData()))
     if (!isset($data = othObj->getThisData()))
     if (!isset($data = anothObj->getTheData()))
     $data = anothOne->getAData()))
     // ...
     process($data)
    

    Orada (onlar zaten oldukça ucuz konum olsa da, yani bunu dert etmem) isset az aramalar beri.

Şahsen ben böyle bir şey yapmak istiyorum:

$data = null;

if (isset($obj->getData()) $data = $obj->getData();
else if (isset($othObj->getThisData()) $data = $othObj->getThisData();
else if (isset($anothObj->getTheData()) $data = $anothObj->getTheData();
else if (isset($anothOne->getAData()) $data = $anothOne->getAData();

process($data)

Önceki nesneler aslında bir şey dönerseniz, bu işlem süresi kazandırır. Bu veri bulur kez bir elseif kurulum olduğu için cümleleri eğer diğer işleme durdururuz.

Ben bir switch deyimi bu durumda uygun olacağını sanmıyorum. Anahtarlar ($ a = 1, 2, 3 veya 4). Bir değişkenin değerini test olma eğilimindedir

($data = $ob1->get()) || ($data = $ob2->get()) || ($data = $ob3->get());

Çalışacak, ama sen get fonksiyon NULL yerine boş bir dizi yanlış veya boş bir dize döndürür iseniz, bu veri aramaya devam edecek ...

Muhtemelen grup bir diziye veriler isteyecek nesneleri ederim:

$objArray = array($obj, $othObj, $anothObj, ... );

Ben veri vardı kadar Sonra bir süre döngü çalıştırın:

$i = 0;
do {
   $data = $objArray[$i]->getData();
   $i++;
} while(!isset($data) && $i < count($objArray));