PHP: Как вернуть экземпляр объекта класса, учитывая имя класса? - PullRequest
1 голос
/ 08 декабря 2009

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

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 ]

12 голосов
/ 08 декабря 2009

return new $sModelName();

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

$func = "foobar";
$func("baz"); //foobar("baz")
3 голосов
/ 08 декабря 2009

Да, Кенания избил меня до этого. Должен печатать быстрее ...

Подробнее здесь: http://php.net/manual/en/language.oop5.php, см. первое примечание пользователя .

1 голос
/ 28 сентября 2011

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

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

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

0 голосов
/ 08 декабря 2009

Попробуйте:

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

}
...