2012-05-20 2 views
0

Я пытаюсь преобразовать существующую кодовую базу в более правильный подход. Наша существующая база кода написана в HTML с кодом PHP и Javascript, вставленным повсюду (не в порядке, но не так, как должно быть).Пути доступа к элементам массива, который находится внутри объекта

Итак, я конвертирую нашу текущую кодовую базу, чтобы использовать классы, поэтому свойства и методы - это способ продолжения. Но у меня проблема. Я (в идеале) хочу ссылаться на одного из моих членов класса по их именам, а не по индексу. Позвольте мне поместить это в образец кода.

Это форма класс:

class form { 
    public $name; 
    public $fields; 

    {constructor goes here...} 

    public function addField($type, $name, $hint = null, $info = null) { 
     $this->fields[] = new field($type, $name, $hint, $info); 
    } 
} 

И это класс поля (звонки формы класса при создании нового поля формы):

class field { 
    public $name; 
    public $type; 
    public $values; 

    public function __construct($name) { 
     $this->name = $name; 
     $this->fields = null; 
    } 

    public function addValue($value, $minimum = null, $maximum = null, $step = 1) { 
     $this->values[] = new value($value, $minimum, $maximum, $step); 
    } 
} 

Так что мой код будет выглядеть это:

$form = new form("form1"); 
$form->addField(NUMBER, "number1"); 
$form->fields[0]->addValue(25, 1, 250, 1); 

Это действительно работает, но это не то, что я хочу в конце. Я хотел бы назвать каждое поле его назначенным именем, так что я мог бы написать вместо этого:

$form = new form("form1"); 
$form->addField(NUMBER, "number1"); 
$form->fields['number1']->addValue(25, 1, 250, 1); 

Или даже:

$form->addField(NUMBER, "number1")->addValue(25, 1, 250, 1); 

Возможно ли это?

+1

Вместо того, чтобы спрашивать, возможно ли это, просто попробуйте. –

+1

Конечно, это: '$ this-> fields [$ name] = новое поле ($ type, $ name, $ hint, $ info);' – nullpotent

+2

Вот что я узнал с собственной кровью и потом: ** никогда не записывайте генератор формы **. Это никогда не получается хорошо .. также, ** ваша абстракция протекает повсюду ** !! –

ответ

2

Похоже, что поля представляют собой массив внутри объекта формы. Таким образом, вместо

$this->fields[] = new field($type, $name, $hint, $info); 

Не могли бы вы это сделать?

$this->fields[$name] = new field($type, $name, $hint, $info); 
+0

Как я сказал ** AljoshaBre **, это хороший ответ, хотя моя проблема в том, что мне нужны оба индекса, поскольку то, что я ищу, это быстрый способ ссылки на элементы массива. Я всегда могу выполнять поля 'echo $ form-> [27] -> values ​​[0] -> value', но я бы предпочел более простой способ :) –

+1

Вы хотите сказать, что хотите иметь доступ к массиву как по полю имя и числовой индекс? Один из способов - это 'array_keys ($ form-> fields)', который дает вам численный индексный массив имен полей. Затем вы можете перебирать этот список. – octern

+0

Да, потому что я создаю средство визуализации страниц, как конечный автомат. Метод «render()» в моем классе страницы перемещает все элементы страницы с циклом for и, в зависимости от анализируемого элемента, применяет некоторые условия.Вот почему я хочу сохранить индекс, но в то же время располагаю быстрым способом поиска полей. Я нашел временное решение (я не знаю, как он будет работать в многопользовательской среде), который выполняет 'define ($ name, count ($ this-> fields) - 1);' для создания константы определение с именем поля и индексом вновь созданного поля. Работы, но все же ... hmm –

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