【问题标题】:Instantiating a new PHP class with one or many arguments用一个或多个参数实例化一个新的 PHP 类
【发布时间】:2009-10-15 02:03:33
【问题描述】:

我有这个获取功能:

public static function fetch($class, $key)
{
    try
    {
        $obj = new $class($key);
    }
    catch(Exception $e)
    {
        return false;
    }
    return $obj;
}

它通过调用该类的构造函数并传入键来创建一个新实例。现在,我将如何做到这一点,以便我可以在 $key 中传递一个参数数组,并让它像:

$obj = new $class($key[0], $key[1]...);

所以它适用于一个或多个键?

希望这已经足够清楚了。

使用 PHP 5

【问题讨论】:

    标签: php


    【解决方案1】:

    这是一个有趣的问题。如果您尝试为其提供动态参数的不是构造函数,那么通常您可以使用call_user_func_array()。但是,由于涉及到 new 运算符,因此似乎没有一种优雅的方式来执行此操作。

    反思似乎是我能找到的共识。以下 sn-p 取自 call_user_func_array() 上的用户 cmets,并很好地说明了用法:

    <?php
    
    // arguments you wish to pass to constructor of new object
    $args = array('a', 'b');
    
    // class name of new object
    $className = 'myCommand';
    
    // make a reflection object
    $reflectionObj = new ReflectionClass($className);
    
    // use Reflection to create a new instance, using the $args
    $command = $reflectionObj->newInstanceArgs($args);
    
    // this is the same as: new myCommand('a', 'b');
    ?>
    

    为了根据您的情况缩短它,您可以使用:

    $reflectionObject = new ReflectionClass($class);
    $obj = $reflectionObject->newInstanceArgs($key);
    

    【讨论】:

      【解决方案2】:

      使用reflection:

      $classReflection = new ReflectionClass($class);
      $obj = $classReflection->newInstanceArgs($key);
      

      【讨论】:

        【解决方案3】:

        我的library 解决了这个this

        // Returns a new instance of a `$classNameOrObj`.
        function fuNew($classNameOrObj, $constructionParams = array()) {
            $class = new ReflectionClass($classNameOrObj);
            if (empty($constructionParams)) { return $class->newInstance(); }
            return $class->newInstanceArgs($constructionParams); }
        

        empty() 测试是必需的,因为如果你给它一个空数组,newInstanceArgs() 会抱怨,愚蠢的。

        【讨论】:

          【解决方案4】:

          类的构造函数是什么样的?它是否接受任意数量的参数?接受键数组而不是键参数列表可能会更好。

          call_user_func_array 可能会做你想做的事:

          $obj = new $object_class();
          call_user_func_array(array($obj, '__construct'), $args); 
          

          请注意,这会调用构造函数两次,这可能会产生负面影响。

          【讨论】:

          • 另请注意,这不适用于使用类名称作为构造函数名称而不是 __construct 的 PHP4 代码。
          • 取决于类,有些是 __construct($key) 有些是 __construct($key1, $key2)
          猜你喜欢
          • 2010-12-23
          • 1970-01-01
          • 1970-01-01
          • 2017-12-31
          • 2019-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-06
          相关资源
          最近更新 更多