2010-08-02 2 views
3

У меня есть требование принять массив проверенных элементов из таблицы и обновить поле, основанное на том, какие элементы были выбраны. Вначале я думал, где просто прокрутить каждый из этих элементов в массиве и получить доступ к функции в конкретном классе для обновления состояния.Цикл Foreach, который приводит к созданию объекта

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

foreach($example as $exampleId){ 
    $newExample=new Example($exampleId); 
    $newExample->updateStatus('active'); 
} 

Есть ли какие-либо улучшения в этом отношении? Это кажется плохой практикой, но я изо всех сил пытаюсь найти альтернативный путь.

ответ

3

это вариант?

$newExample=new Example(); 
foreach($example as $exampleId){ 
    $newExample->updateStatus($exampleId,'active'); 
} 

иначе вы всегда можете сделать это:

foreach($example as $exampleId){ 
    $newExample=new Example($exampleId); 
    $newExample->updateStatus('active'); 
    $newExample->__destruct(); 
    unset($newExample); 
} 

для этого вам нужно будет соседний метод в классе

$newExample=new Example(); 
foreach($example as $exampleId){ 
    $newExample->set_example_id($exampleId); 
    $newExample->updateStatus('active'); 
} 
+0

Хммм, не потому, что мой конструктор первоначально принимает $ exampleId, чтобы предварительно заполнить некоторые свойства. $ newExample :: updateStatus() будет использовать $ newExample-> exampleId, чтобы определить соответствующую запись db для обновления. Спасибо за ваш вклад. – 2010-08-02 13:42:33

+0

предоставил вам альтернативу, пожалуйста, посмотрите, подходит ли это вам –

+0

Выглядит хорошо, я предполагаю, что это уничтожит объект раньше? Тем не менее, я буду делать много вызовов БД для каждого экземпляра. – 2010-08-02 13:52:06

1

Похоже, создавая ваш объект имеет накладные расходы, потому что нагрузка из базы данных или где-нибудь? Не могли бы вы добавить статический метод в Example, который обновляется без необходимости создания объекта, который загружает и заполняет себя? Тогда вы могли бы сделать:

foreach($example as $exampleId){ 
    Example::UpdateExampleStatus($exampleId,'active'); 
} 
+0

Это хорошая идея, и я подумал об этом сам, это означало бы изменение некоторых вещей, потому что путь, который я обновляю статус "на данный момент, похож на $ Example :: setToActive(), который обращается к защищенному методу с именем $ example :: _ updateStatus(). Таким образом, это повлияет на то, как я получаю доступ к другому методу, поскольку я не могу получить доступ к методу класса в статическом методе. Изменил бы $ Example :: setToActive() на публичную статическую работу? А затем сменив $ Example :: updateStatus() на защищенный/закрытый статический ..... – 2010-08-02 13:50:25

+1

@ user275074: Я действительно не знаю достаточно о вашей реализации. Очевидно, вы не сможете использовать '$ this' в этих методах, и вы также должны изменить любой вызывающий код на' self :: method() ', а не' $ this-> method() ' –

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