【问题标题】:Passing arguments to the Class Constructor将参数传递给类构造函数
【发布时间】:2009-04-23 00:59:59
【问题描述】:

如何使用下面定义的 Object() 函数将任意数量的参数传递给类构造函数?

<?php

/*
./index.php
*/

function Object($object)
{
    static $instance = array();

    if (is_file('./' . $object . '.php') === true)
    {
        $class = basename($object);

        if (array_key_exists($class, $instance) === false)
        {
            if (class_exists($class, false) === false)
            {
                require('./' . $object . '.php');
            }

            /*
            How can I pass custom arguments, using the
            func_get_args() function to the class constructor?

            $instance[$class] = new $class(func_get_arg(1), func_get_arg(2), ...);
            */

            $instance[$class] = new $class();
        }

        return $instance[$class];
    }

    return false;
}

/*
How do I make this work?
*/

Object('libraries/DB', 'DATABASE', 'USERNAME', 'PASSWORD')->Query(/* Some Query */);

/*
./libraries/DB.php
*/

class DB
{
    public function __construct($database, $username, $password, $host = 'localhost', $port = 3306)
    {
        // do stuff here
    }
}

?>

【问题讨论】:

    标签: php class object


    【解决方案1】:
    $klass = new ReflectionClass($classname);
    $thing = $klass->newInstanceArgs($args);
    

    尽管需要使用反射表明您在设计中过于复杂了。为什么要写这个函数呢?

    【讨论】:

    • 我承认这个功能可能看起来有点废话,但我将它用于框架可能过于臃肿的小东西。而且由于它充当“自动加载器”、对象构造函数和单例容器,它完美地完成了这项工作。
    • 顺便说一句,反射类真的很方便,有没有关于 PHP 5.3 新特性的速成课程?我检查了 PHP 手册,但是我还是缺少很多文档?
    • 不是你:这方面的文档相当稀少。您将不得不与php.net/oop5.reflection 联系。此外,它从 5.1 开始就已经存在(或者它是 5.0?),所以它不是 5.3 的新功能
    【解决方案2】:

    而不是你的类采用单独的参数,我让它采用一个数组。

    class DB
    {
        public function __construct(array $params)
        {
            // do stuff here
        }
    }
    

    这样您就可以将 func_get_args 的直接结果传递给您的构造函数。现在唯一的问题是能够找出数组键/值。

    如果其他人有任何想法,我也很高兴知道:)

    【讨论】:

    • 我也有同样的想法,但我很想知道是否可以完成我所描述的事情。
    【解决方案3】:

    我还没有尝试过,但 call_user_func_array 听起来像你想要的。

    $thing = call_user_func_array(array($classname, '__construct'), $args);
    

    看看PHP Documentation

    【讨论】:

    • 不起作用。 =\ call_user_func_array(array(new $classname(), '__construct'), $args);这可行,但我会调用构造函数两次。
    • 不用 new $classname() 试试看。
    • 致命错误:不能静态调用非静态方法test::__construct()
    • 好吧,我没有更多的想法了。感谢您愿意尝试。
    • 如果您以动态方式执行此操作,请在类构造函数中为您的参数使用类型提示
    【解决方案4】:

    反射方法的替代方法是评估您的代码。

    eval('$instance = new className('.implode(', ', $args).');');
    

    【讨论】:

    • 评估几乎总是一个坏主意
    猜你喜欢
    • 2023-04-04
    • 2015-10-11
    • 1970-01-01
    • 2015-04-26
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多