使用字符串创建PHP类实例

Joe*_*oel 204 php

我有两节课:

班级class ClassOne { }和班级class ClassTwo {}.我得到的字符串可以是"一个"或"两个".而不是使用如下的长开关语句:

switch ($str) {
    case "One":
        return new ClassOne();
    case "Two":
        return new ClassTwo();
}
Run Code Online (Sandbox Code Playgroud)

无论如何,我可以使用字符串创建实例,即 "One"

谢谢,

乔尔

Bob*_*ger 446

是的你可以!

$str = 'One';
$class = 'Class'.$str;
$object = new $class();
Run Code Online (Sandbox Code Playgroud)

使用名称空间时,请提供完全限定名称:

$class = '\Foo\Bar\MyClass'; 
$instance = new $class();
Run Code Online (Sandbox Code Playgroud)

你可以用php做的其他很酷的东西是:
变量变量:

$personCount = 123;
$varname = 'personCount';
echo $$varname; // echo's 123
Run Code Online (Sandbox Code Playgroud)

和可变的功能和方法.

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

$method = 'doStuff';
$object = new MyClass();
$object->$method(); // calls the MyClass->doStuff() method. 
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,您不能部分使用变量.例如.``$ my_obj = Package\$ class_name();```.相反,你必须```$ class_name ="Package \\".$ CLASS_NAME; $ my_obj = new $ class_name();``` (25认同)
  • 请注意使用命名空间时,必须提供完整路径:`$ className ='\ Foo\Bar\MyClass';``$ instance = new $ className();` (13认同)
  • 没有汤匙...只有php。 (4认同)
  • 但有一个问题.上述方法可用于创建新的类实例.如果我想静态调用现有类的方法怎么办?我尝试如下:`$ model = $ user_model :: find() - > All(); ``$ user_model`是包含被调用类的字符串的变量 (4认同)

Joh*_*ker 22

您只需使用以下语法创建一个新类(如果您正在创建工厂,这很方便):

$className = $whatever;
$object = new $className;
Run Code Online (Sandbox Code Playgroud)

作为(特别粗略的)示例工厂方法:

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.');
}
Run Code Online (Sandbox Code Playgroud)


Fre*_*die 12

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

$className = 'Foo';
$instance = new $className(); // Foo()
Run Code Online (Sandbox Code Playgroud)


Rem*_*ade 8

让我们说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;
    }

}
Run Code Online (Sandbox Code Playgroud)

使用 PHP 反射;

$str = "One";
$className = "Class".$str;
$class = new \ReflectionClass($className);
Run Code Online (Sandbox Code Playgroud)

创建一个新实例:

$instance = $class->newInstanceArgs(["Banana", "Apple")]);
Run Code Online (Sandbox Code Playgroud)

调用一个方法:

$instance->echoArgOne();
//prints "Banana"
Run Code Online (Sandbox Code Playgroud)

使用变量作为方法:

$method = "echoArgOne";
$instance->$method();

//prints "Banana"
Run Code Online (Sandbox Code Playgroud)

使用反射而不是仅使用原始字符串来创建对象可以让您更好地控制对象并更容易测试(PHPUnit 严重依赖反射)