2011-01-02 4 views
140

У меня есть два класса:Создание экземпляра класса PHP со строкой

класса ClassOne { } и класс ClassTwo {}. Я получаю строку, которая может быть либо «Один», либо «Два». Вместо того, чтобы использовать длинное заявление переключателя, такие как:

switch($str) { 
    case "One": 
     return new ClassOne(); 
    case "Two": 
     return new ClassTwo(); 
} 

Есть в любом случае, как я могу создать экземпляр, используя строку, т.е. new Class("Class" . $str);

Спасибо,

Joel

ответ

334

Да, ты можешь!

$str = "One"; 
$class = "Class".$str; 
$object = new $class(); 

Другие интересные вещи вы можете сделать в РНР:
Variable variables:

$personCount = 123; 
$varname = 'personCount'; 
echo $$varname; // echo's 123 

и переменные функции & методы.

$func = 'my_function'; 
$func('param1'); // calls my_function('param1'); 

$method = 'doStuff'; 
$object = new MyClass(); 
$object->$method(); // calls the MyClass->doStuff() method. 
+0

Спасибо за примеры! – Joel

+0

Отличный ответ, спасибо Bob –

+7

wtf !!!!!! mind blown –

17

Вы можете просто использовать следующий синтаксис для создания нового класса (это удобно, если вы создаете factory):

$className = $whatever; 
$object = new $className; 

В качестве (исключительно грубого) примера заводского метода:

public function &factory($className) { 

    require_once($className.'php'); 
    if(class_exists($className)) return new $className; 

    die('Cannot create new "'.$className.'" class - includes not found or class unavailable.'); 
} 
Смежные вопросы