簡體   English   中英

PHP:如何在給定類名的情況下返回實例化的類對象?

[英]PHP: How to return an instantiated class object, given a class name?

他們說eval()是邪惡的 我想避免使用適當的PHP5功能使用eval()行。 給定靜態類方法中的類名,如何使其返回真實對象?

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;
  }
}

return new $sModelName();

您也可以通過動態名稱調用函數:

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

是的,Kenaniah擊敗了我。 打字速度更快...

此處的更多信息: http : //php.net/manual/en/language.oop5.php ,請參閱第一個用戶說明

我知道這是一個有2年歷史的問題,但我只想指出,你們都錯過了這里的問題! 您的所有函數都不會返回實例化的類,而是返回一個類。 這包括發問者發布的初始功能!

如果要返回實例化的類 ,則必須跟蹤數組中的類及其屬性,並在需要該類的實例而不是重新初始化的類時從那里返回它們。

如果您的類在構造時要進行大量處理,則此方法還可以節省大量處理時間。 除非您確實希望重新初始化類屬性,否則獲取實例總是比創建新類更好。 請注意!

嘗試:

$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;
    }
  }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM