2013-02-17 92 views
1

我没有使用PHP几年 - 我的重点主要是C,C++,Objective-C,Ruby & ECMAScript。我正在用一些其他语言进行实验,从而让我的头脑保持新鲜。PHP:函数像数组构造函数

我碰到一个例子就是在铸造阵列PHP.net为对象,以使访问它的关键,如果他们的实例变量的值:

$obj = (object)array('foo' => 'bar', 'property' => 'value');

作为练习,我想创建一个函数,其采用与array相同的参数,并将已经转换为对象的“数组”返回。类似于:

function o_array(\* variable amount of key=>value args like array()*\) 
{ 
    return (object)array.call(self, arguments); 
} 

我不知道如何构建一个函数,该函数在PHP中采用可变数量的key => value参数。预先感谢您的建议。

UPDATE
我希望在今后的以下变化,因为我看到PHP的主要力量作为它的灵活性和通用疯狂(也是其弱点)。不支持命名参数: PHP language meeting regarding named params among other items.

+0

你看过'array_merge()'吗? - http://php.net/array_merge – Tigger 2013-02-17 09:21:56

+0

我一直在寻找命名参数,这显然不在PHP中存在,即使他们在'array'函数中使用它们。游民。我现在已经如何将数组转换为对象,或将数组转换为对象。绝对不会尝试合并数组。不知道从哪里来。 – 2013-02-17 09:24:25

回答

1

PHP不允许命名参数,所以这是不可能的。阵列是不是功能,而是一个语言结构,这就是为什么它是你可以使用键值分配唯一的地方

+0

http://www.php.net/~derick/meeting-notes.html#named-parameters – 2013-02-17 09:26:40

+0

即使使用命名参数,它也不会工作,因为函数仍然可能必须定义它所期望的参数名称 – Dracony 2013-02-17 17:48:18

+0

这是正确的@Dracony。基本上我需要命名参数和http://php.net/func-get-args的版本,它们可以通过键而不是索引访问参数。他们已经在一定程度上为数组函数实现了它,但是我们仅仅因为编写我们自己的函数而无法访问它。 – 2013-02-17 19:52:57

2

的参数变量量是可能的func_get_args

function f() 
{ 
    $args = func_get_args(); 
    // ... 
} 

但有没有这样的东西“key =>值参数”用于函数。所以,你可以只有一句,是将它们作为阵列(这使得整个函数那种毫无意义的):

function arrayToObject(array $from) 
{ 
    return (object)$from; 
} 
+0

+1 我接受了@Dracony,因为它对于未来遇到问题的程序员来说很直接。你提到了同样的语言限制。谢谢。 – 2013-02-17 09:29:12

0

听起来你正试图转换到数组对象。如果这是这里的情况下的东西,你可以这样做:

function array_to_object($array) { 
    $obj = new stdClass; 
    foreach($array as $k => $v) { 
    if(is_array($v)) { 
     $obj->{$k} = $this->array_to_object($v); 
    } else { 
     $obj->{$k} = $v; 
    } 
    } 
    return $obj; 
} 

所以,如果你有以下阵列:

$a = array('foo' => 'bar', 'property' => 'value'); 

转换会导致用:

$o = array_to_object($a); 
echo ($o->foo); // will print 'bar' 
0

在我的理解,我认为这是最明智的做法。

class Array() 
{ 
    public $array = array('foo' => 'bar', 'property' => 'value'); 
} 

//initiate an object... 
    $obj = new Array(); 
    $array = array_values($obj->array); 
    print_r($array); //will print 'bar' and 'value' 
} 
+0

虽然这不允许您拥有动态数组内容。问题是能够将'array'方法等命名参数传递给另一个返回对象的新方法。 – 2013-02-17 12:24:34