2009-12-08 4 views
1

Говорят, что eval() is evil. Я хочу, чтобы избежать использования линии eval(), используя надлежащую функциональность PHP5. Учитывая имя класса в методе статического класса, как мне заставить его вернуть реальный объект?PHP: Как вернуть экземпляр объекта класса, учитывая имя класса?

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

ответ

12

return new $sModelName();

Вы можете вызывать функции динамическим именем, а также:

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

Try:

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

} 
+1

Просто обратите внимание: вам не нужно хранить свой объект в переменной перед его возвратом. В любом случае, это функционально эквивалентно. – Kenaniah

1

Я знаю, что это 2-летний вопрос, но я просто хочу подчеркнуть, вы все пропустили вопрос здесь! Все ваши функции не возвращенный экземпляр класса, но новый класс. Это включает в себя начальную функцию, отправленную из опроса!

Если вы хотите вернуть 3 экземпляр класса, вы должны отслеживать свои классы и их свойства в массиве и возвращать их оттуда, когда вам нужен экземпляр класса, вместо повторной инициализации класс.

Этот метод также экономит много времени на обработку, если ваши классы выполняют большую обработку при их создании. Всегда лучше получить экземпляр, чем создать новый класс, если вы действительно не хотите, чтобы свойства класса повторно инициализировались. Обращать внимание!

Смежные вопросы