Создание экземпляра класса PHP со строкой
У меня есть два класса, class ClassOne { }
и class ClassTwo {}
. Я получаю строку, которая может быть "One"
или "Two"
.
Вместо использования длинного оператора switch
, например:
switch ($str) {
case "One":
return new ClassOne();
case "Two":
return new ClassTwo();
}
Есть ли способ, которым я могу создать экземпляр, используя строку, т.е. new Class("Class" . $str);
?
Ответы
Ответ 1
Да, ты можешь!
$str = 'One';
$class = 'Class'.$str;
$object = new $class();
При использовании пространств имен укажите полное имя:
$class = '\Foo\Bar\MyClass';
$instance = new $class();
Другие интересные вещи, которые вы можете сделать в php:
Переменные переменные:
$personCount = 123;
$varname = 'personCount';
echo $$varname; // echo 123
И переменные функции и методы.
$func = 'my_function';
$func('param1'); // calls my_function('param1');
$method = 'doStuff';
$object = new MyClass();
$object->$method(); // calls the MyClass->doStuff() method.
Ответ 2
Вы можете просто использовать следующий синтаксис для создания нового класса (это удобно, если вы создаете фабрику):
$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.');
}
Ответ 3
см. пример 3 из http://www.php.net/manual/en/language.oop5.basic.php
$className = 'Foo';
$instance = new $className(); // Foo()
Ответ 4
ClassOne
определяется как:
public class ClassOne
{
protected $arg1;
protected $arg2;
//Contructor
public function __construct($arg1, $arg2)
{
$this->arg1 = $arg1;
$this->arg2 = $arg2;
}
public function echoArgOne
{
echo $this->arg1;
}
}
Использование PHP Reflection;
$str = "One";
$className = "Class".$str;
$class = new \ReflectionClass($className);
Создайте новый экземпляр:
$instance = $class->newInstanceArgs(["Banana", "Apple")]);
Вызвать метод:
$instance->echoArgOne();
//prints "Banana"
Используйте переменную как метод:
$method = "echoArgOne";
$instance->$method();
//prints "Banana"
Использование Reflection вместо использования исходной строки для создания объекта дает вам лучший контроль над вашим объектом и более легкую проверку (PHPUnit сильно зависит от Reflection)