2013-02-17 2 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); 
} 

Я не знаю, как построить функцию, которая принимает переменную величину аргументов key => value в PHP. Заранее спасибо за совет.

UPDATE
Я надеюсь, что следующие изменения в будущем, так как я вижу главную силу в PHP как является его гибкость и общее сумасшествие (также его слабость). Именованные параметры не поддерживаются: PHP language meeting regarding named params among other items.

+0

Вы посмотрели на 'array_merge()'? - http://php.net/array_merge – Tigger

+0

Я искал именованные параметры, которые, по-видимому, не существуют в PHP, хотя они используют их в функции 'array'. Облом. Я уже сейчас, как преобразовать массив в объект или передать массив объекту. Определенно не пытаться объединить массивы. Не знаю, откуда это взялось. –

ответ

1

PHP не разрешает именованные аргументы, поэтому это невозможно. массив не функция, а конструкция языка, поэтому это единственное место, где вы можете использовать клавиши присвоения значений

+0

http://www.php.net/~derick/meeting-notes.html#named-parameters –

+0

Даже с именованными параметрами он не будет работать, поскольку функция все же, вероятно, должна будет определить, какие имена параметров ожидаются – Dracony

+0

Это правильно @Dracony. По сути, мне нужны именованные параметры и версия http://php.net/func-get-args, которые могут обращаться к аргументам по ключу, а не по индексу.Они уже в некоторой степени реализовали его для функции массива, нам просто не предоставили доступ к ней для написания собственных функций. –

2

переменное количество аргументов можно с func_get_args:

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

Но нет такой вещи, как «key => аргументы значения» для функций. Так что единственное, что вы можете, это передать их в виде массива (что делает всю функцию своего рода бессмысленно):

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

+1 Я принял @Dracony, потому что это прямо для программистов, которые сталкиваются с вопросом в будущем. Вы упомянули одно и то же ограничение языка. Благодарю. –

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', другому, новому методу, который возвратил объект. –

Смежные вопросы