PHP: Nasıl örneklenmiş sınıf nesneyi döndürmek için, bir sınıf adı verilir?

4 Cevap php

Onlar eval () olduğunu söylüyorlar evil. Ben düzgün PHP5 işlevselliğini kullanarak eval () hattının kullanımını önlemek istiyoruz. Statik bir sınıf yöntemi bir sınıf adı verilen, nasıl ben gerçek bir nesneyi döndürmek yapabilirim?

class Model {
  public static function loadModel($sModelPath) {
    if (!(strpos(' ' . $sModelPath, '/')>0)) {
      $sModelPath .= '/' . $sModelPath;
    }
    $sModelName = str_replace('/','_',$sModelPath);
    // P is a global var for physical path of the website
    require_once(P . '_models/' . $sModelPath . '.php');
    eval("\$oObject = new $sModelName" . '();');
    return $oObject;
  }
}

4 Cevap

return new $sModelName();

Siz de dinamik bir ismiyle işlevleri çağırabilirsiniz:

$func = "foobar";
$func("baz"); //foobar("baz")

Evet, Kenaniah ona beni yendi. Gotta daha hızlı yazın ...

Burada daha fazla bilgi: http://php.net/manual/en/language.oop5.php, bkz the first user note.

Ben bu 2 yaşındaki bir soru olduğunu biliyorum ama ben sadece işaret etmek istiyorum, hepiniz buradan soru cevapsız! Tüm fonksiyonlar do not örneklenmiş sınıf, ama bir new sınıfı dönmek. Bu soru soran deftere ilk fonksiyonu içerir!

Eğer dönmek isterseniz, bir instantiated class, bir dizide sınıflar ve onların özelliklerini takip ve sınıfının bir örneğini gerektiğinde yerine yeniden başlatılmak sınıfı, oradan onları geri dönmek zorunda .

Onlar inşa zaman sınıfları işleme bir sürü eğer bu yöntem de işlem çok zaman kazandırır. Eğer gerçekten sınıf özelliklerini yeniden başlatıldı istediğiniz sürece, yeni bir sınıf oluşturmak için daha bir örneğini almak her zaman iyidir. Dikkat!

Deneyin:

$m = new Model();
$m = $m->makeModel();

class Model {
  public static function loadModel($sModelPath) {
    if (!(strpos(' ' . $sModelPath, '/')>0)) {
      $sModelPath .= '/' . $sModelPath;
    }
    $sModelName = str_replace('/','_',$sModelPath);
    // P is a global var for physical path of the website
    require_once(P . '_models/' . $sModelPath . '.php');
    function makeModel(){
      $model = new $sModelName;
      return  $model;
    }
  }

}