使用字符串创建PHP类示例

9w11ddsr  于 2023-05-27  发布在  PHP
关注(0)|答案(6)|浏览(373)

我有两个类,class ClassOne { }class ClassTwo {}。我得到一个字符串,它可以是"One""Two"
而不是使用长switch语句,例如:

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

有没有一种方法可以使用字符串创建一个示例,即new Class("Class" . $str);

qnyhuwrf

qnyhuwrf1#

你可以的!

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

使用命名空间时,请提供fully qualified name

$class = '\Foo\Bar\MyClass'; 
$instance = new $class();

你也可以动态调用变量函数和方法。

$func = 'my_function';
$parameters = ['param2', 'param2'];
$func(...$parameters); // calls my_function() with 2 parameters;

$method = 'doStuff';
$object = new MyClass();
$object->$method(); // calls the MyClass->doStuff() method. 
// or in one call
(new MyClass())->$method();

PHP也可以创建variables with a string,但这是一个非常糟糕的做法,应该尽可能避免。考虑使用数组代替。

lf3rwulv

lf3rwulv2#

您可以简单地使用以下语法来创建一个新类(如果您正在创建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.');
}
uujelgoq

uujelgoq3#

看一下http://www.php.net/manual/en/language.oop5.basic.php的示例3

$className = 'Foo';
$instance = new $className(); // Foo()
vfh0ocws

vfh0ocws4#

假设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反射;

$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)

5anewei6

5anewei65#

// Way #1
$className = "App\MyClass";
$instance = new $className();

// Way #2
$className = "App\MyClass";
$class = new \ReflectionClass($className);

// Create a new Instance without arguments:
$instance = $class->newInstance();

// Create a new Instance with arguments (need a contructor):
$instance = $class->newInstanceArgs(["Banana", "Apple"]);
pgccezyw

pgccezyw6#

如果你在文件的顶部有一个命名空间。
在当前文件的顶部导入所需的类:

use \Foo\Bar\MyClass; 

// Assign the class namespace to a variable. 
$class = MyClass::class; 

// Create a new instance
$instance = new $class();

::class将返回所需类的整个命名空间

相关问题