[英]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.