Неправильно или правильно? В то время как петли

Ребята Heya, теперь ive никогда не делали этот метод раньше, и я просто попробовал его, чтобы увидеть, будет ли это работать, и работает как сон.

Обычно люди склонны делать это.

$tags = array();
while($row = $statement->FetchObject())
{
 $tags[] = $row;
}

но будет ли это быстрее или просто меньше кода, если я сделаю это таким образом.

$tags = array();
while($tags[] = $statement->FetchObject()){}

Просто интересно, что все

Update:

Я понимаю, что код Cleaner намного лучше, чем Less code, но поскольку я никогда не использовал этот метод, прежде чем это было просто любопытством для плюсов и минусов.

5 ответов

Общая проблема заключается в том, что для выхода из цикла while должен быть возвращен результат "false". В вашем втором примере это означает, что в конце вашего массива будет "ложное" значение (которое, скорее всего, не то, что вы хотите).

Это не проблема для традиционного подхода, поскольку значение "false" присваивается $row и никогда не применяется к массиву.

Что касается производительности или удобочитаемости, они не являются проблемами, поскольку код не выполняет то, что вы хотите.


И если вы используете класс базы данных, просто используйте для этой цели предопределенный метод. PDO, например, имеет fetchAll: $statement->fetchAll(PDO::FETCH_OBJ).


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

Я все для 1).


Вы даже можете пропустить скобки:

$tags = array();
while ($tags[] = $stmt->fetchObject());

Этот код, конечно, немного короче, чем более сложная форма:

$tags = array();
while ($tag = $stmt->fetchObject()) {
 $tags[] = $tag;
}

Однако какой из них легче читать? Вы могли бы сказать, что оба они совершенно очевидны, и на самом деле я бы согласился с вами. Но какой из них проще в общем обслуживании? Чтобы добавить новую инструкцию типа $tag->doSth(); в более короткую форму, вам нужно полностью ее переписать. В последнем вы просто добавляете это утверждение.


Конечно, если FetchObject() соответствующим образом изменяет свое возвращаемое значение каждый раз, когда он вызывал;)

licensed under cc by-sa 3.0 with attribution.