【问题标题】:Can PHP instantiate an object from the name of the class as a string?PHP 可以将类名中的对象实例化为字符串吗?
【发布时间】:2009-09-04 03:21:45
【问题描述】:

如果类名存储在字符串中,PHP 是否可以从类名实例化对象?

【问题讨论】:

    标签: php class object initialization


    【解决方案1】:

    是的,当然。

    $className = 'MyClass';
    $object = new $className; 
    

    【讨论】:

    • 酷,我应该在问嘿嘿之前测试一下。谢谢!
    • @user - 太对了。我想知道为什么我直接来SO而不是做最低限度的工作?大声笑
    • 其实并不是那么明显。我知道在Java中它是一种叫做反射的东西,但是相比之下这很简单。
    • 如果 clss 在命名空间中,使用这个 $class= 'PrintData\\' 。 $类;返回新的 $class();
    • 此外,正如 PHP 文档所述,如果您要实例化的类在命名空间内,那么您必须指定 FQN(完全限定名称)。例如,我自己位于“App\Http\Controllers”的命名空间中,并且我有一个字符串 $string = 'App\Models\Task';我认为如果我尝试实例化字符串它会中断,但实际上,你不需要在开头附加一个 \。
    【解决方案2】:

    如果您的班级需要参数,您应该这样做:

    class Foo 
    {
       public function __construct($bar)
       {
          echo $bar; 
       }
    }
    
    $name = 'Foo';
    $args = 'bar';
    $ref = new ReflectionClass($name);
    $obj = $ref->newInstanceArgs(array($args));
    

    【讨论】:

    • 我来这里寻找的东西。谢谢
    【解决方案3】:

    Yes it is

    <?php
    
    $type = 'cc';
    $obj = new $type; // outputs "hi!"
    
    class cc {
        function __construct() {
            echo 'hi!';
        }
    }
    
    ?>
    

    【讨论】:

      【解决方案4】:

      也是静态的:

      $class = 'foo';
      return $class::getId();
      

      【讨论】:

      • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
      • @Blackbam 相关相关补充回答。请仅在有用的情况下发表评论。
      • 没错,无论如何它基本上都可以工作,对您的答案进行一点解释会很好。问题是“PHP 可以实例化一个对象”,但访问静态成员函数不是对象访问。
      【解决方案5】:

      您可以通过将类名/方法存储在数据库等存储中来进行一些动态调用。 假设该类对错误具有弹性。

      sample table my_table
          classNameCol |  methodNameCol | dynamic_sql
          class1 | method1 |  'select * tablex where .... '
          class1 | method2  |  'select * complex_query where .... '
          class2 | method1  |  empty use default implementation
      

      等等。 然后在您的代码中使用数据库返回的字符串作为类和方法名称。您甚至可以为您的类存储 sql 查询,自动化程度取决于您的想象。

      $myRecordSet  = $wpdb->get_results('select * from my my_table')
      
      if ($myRecordSet) {
       foreach ($myRecordSet   as $currentRecord) {
         $obj =  new $currentRecord->classNameCol;
         $obj->sql_txt = $currentRecord->dynamic_sql;
         $obj->{currentRecord->methodNameCol}();
      }
      }
      

      我使用这种方法来创建 REST Web 服务。

      【讨论】:

      • 如果我设法用任意数量的类和方法注入您的数据库,我就拥有了您的整个其余 API .... 赞!请不要使用此代码,非常危险!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 2012-06-07
      相关资源
      最近更新 更多