【问题标题】:Initiate object through an array通过数组初始化对象
【发布时间】:2012-05-16 16:02:44
【问题描述】:

基本上我的设置是我有很多想要创建的对象。它将变成什么类型​​的对象取决于一个变量,即类型。所以最初我必须做很多 if 语句,所以为了缩短它我创建了一个数组,但我遇到了能够通过数组创建实际对象的问题。

这是我最初的:

if($object->type = 'text')
{
    $object_new = new Text();
} elseif($object->type = 'image') {
    $object_new = new Image();
} ....

但我想做的是:

$all_objects = array('text'=> new Text(), 'image' => new Image(), ...);
$object_new = $all_objects($object->type);

这将大大缩短我的代码并提高效率。

【问题讨论】:

  • 应该可以,但是你需要$all_objects[...]而不是()...

标签: php arrays object


【解决方案1】:

如果对这些对象没有进一步的依赖关系,你可以简单地做

$className = $object->type;
$instance = new $className;

如果您需要更复杂的创建逻辑,您可以将创建代码放在 Lambdas 中然后调用它们,例如

$allTypes = array(
    'text' => function($string) { return new Text($string); },
    'Image' => function($path) { return new Image($path); }
);
$instance = call_user_func_array($allTypes[$object->type], array($argument1));

或者您创建一个工厂对象并将开关/案例放入其中:

class Factory
{
    public function create($type)
    {
        switch ($type)
        {
            case 'text':
                return new Text;
            case 'image':
                return Image($this->create('foo'));
            case 'foo':
                return new Foo;
            default:
                throw new Exception('No clue what to create');
        }
    }
}

也结帐Is there a call_user_func() equivalent to create a new class instance?

【讨论】:

  • 见鬼,你甚至可以只做$instance = new $object->type;
  • 但需要小心,将其与 __autoload 和区分大小写的文件系统一起使用。 (至少对于第一种方法;))
【解决方案2】:

这可能是您正在寻找的:

$types = array('image', 'text', 'link', 'somethingelse');
foreach ($types as $type) {
    $$type = new ucfirst($type);
}

这意味着:

$image         = new Image;
$text          = new Text;
$link          = new Link;
$somethingelse = new Somethingelse;

当然,你需要有 ImageTextLinkSomethingelse 类。

【讨论】:

  • 我想他只是想用一个字符串作为名称来创建一个类的实例。我认为他不需要创建所有类的实例。
【解决方案3】:

制作$all_objects 的数组会导致更多问题。当你从那里得到一个元素时,它就是一个引用,所以每次你访问一个元素时,它都和你上次访问它的时候一样。 (例如:http://codepad.org/Z4B7glk9

尝试这样的事情(PHP 中的类名不区分大小写):

$object_new = new $object->type();

演示:http://codepad.org/Hq09jkHz

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-10
    • 2013-05-07
    • 2018-06-22
    • 1970-01-01
    • 2017-02-16
    • 2012-10-19
    相关资源
    最近更新 更多