Comments 62
лучше используйте while каждый раз когда получаете данные от класса.
А чем это-то вредно? Можете рассказать чем плох такой код?
public function getResult() : \Generator
{
while ($result = $this->stmt->fetch(\PDO::FETCH_OBJ)) {
yield $result;
}
}
1. Получить от модели готовый массив данных и сразу с ним работать
2. Каждый раз получать от модели ресурс и превращать его перебором в массив уже запределами модели.
Что предпочтительнее решать вам, но по-моему писать While в 1000 разных местах проекта намного лучше, чем всего 1 раз в самой модели, не правда ли? =)
результаты больших выборок обрабатывать массивом неоптимально, а порой невозможно
если получили несколько записей, без разницы в массиве или в ресурсе то цикл все равно придется делать по записям (вы же не просто так список получили) и большой разницы по ресурсу или по массиву нет.
Плюсы ресурса
В некоторых базах ресурс это указатель на данные, которые на стороне БД это значит что в память application сервера они не загруженны.
В случае если цикл по ресурсу и вы точно знаете что данные потом не пригодятся вы можете после извлечения( fetch) эту переменную освободить и тем самым обрабатывать огромное количество данных, не грузя их единовременно в память application сервера.
Но да ситуации возникают крайне редко и в большинстве случаев удобней иметь именно массив.
Подключайте все файлы проекта в любом месте проекта даже если вам нужна всего одна функция.
Ну вряд ли кто-то вручную подключает все файлы.
А стоит ли использовать тяжеловесные фреймворки? :)
Используйте массив GLOBALS — без него вообще никак, разработчики языка придумали его для вашего удобства, а вот проблемы с закончившейся озушкой это проблемы сервера, а не языка.
Разве GLOBALS страшны закончившейся озушкой. Я такого не слышал :)
используйте циклы прямо в верстке
Хм, а как вывести список по другому? :)
Дублируйте один и тот же метод во всех классах каждый раз, когда он вам понадобится, забудьте про наследование это пережиток прошлого.
Лучше просто использовать метод/ф-ю без наследования.
Используйте только статические методы и свойства, не нужно создавать объекты, классы придуманы не для этого.
Когда существует только один инстанс/нету привязки у метода к инстансу, то часто так и делаю :)
выключите error_reporting — он только мешает
На проде выключил E_NOTICE
display_errors само собой
Храните всю информацию о пользователях в одной таблице — данные для авторизации, анкетные данные, домашние адреса и телефоны, места работы, да вообще любую информацию храните в одной таблице и не забывайте про serialize
Часто требования на старте одни, а потом другие, или вообще требования не формализированы. :)
В postgres можно нативно хранить массивы.
А иногда нужна денормализация. :)
В postgres можно нативно хранить массивы.
В MySQL тоже относительно недавно добавили тип JSON.
Ну и они не индексируются.
Но как вариант.
Хотя и раньше можно было сохранять JSON данные.
Да и если подумать навскидку, мне кажется сомнительным индексировать по JSON, лучше уж тогда создать несколько дополнительных полей.
Именно так советует PSR
class MyClass {
public function f()
{
if (a == b)
{
..
}
}
}
Строго говоря вы опрвергали автора, используя его цитату, где он говорил именно про каждую скобочку.
Но в ваше оправдание отмечу, что мысль про PSR была ясна каждому (почти), учитывая простоту и очевидность рекомендации, а замечание от OnYourLips подозреваю, всего лишь придирки.
Печальная правда жизни, только за что мне-то теперь минус лепить? Не я же таким php сделал :)
Мало кто? о_0 Я что-то не припомню популярного framework-agnostic (ну или зенд, симфони, лара...) кода пакета, который бы не следовал первым 4ём PSR.
Я поэтому и пишу на симфони, потому что там хоть люди следуют этому и понимают важность этого.
Но в php это лишь мельчайшая часть от всего пирога.
Назовите лучше CMS, которая этому следует.
А тестами удобно покрывать приложения на yii? Вот честно, все кричат, что это легко делается, но постоянно вижу, что через пол года все на них забивают :) Да, конечно, заказчик против. Да просто там их писать намного сложнее, чем на том же симфони. И дело не в самих тестах, а в том, что просто ими покрывать код сложнее, ведь нафиг нам эти абстракции, мы от них отошли и налепили всё в кучу. DI в yii никакой, компоненты тестируются сложно, получение хоть чего из любой части кода тоже добавляет веселья к тестированию.
Ладно, простите, разошелся… Это же php, тут так принято и так все привыкли. Не стоит переусложнять.
Только не говорите — «Все? о_0 У нас все пишут слабосвязанный код, который легко поддается тестированию, локализации, валидации и прочему-прочему». Не верю!
На php это делать очень и очень сложно. Сам язык постоянно толкает на «схалтурить», и я не исключение. А те библиотеки, CMS, фреймворки и прочее является лишь логическим продолжением такого подхода.
Хотя Symfony 2+ реально задает тон для приложений, требующих серьезной долгосрочной поддержки, но его используют реально единицы даже серьезных проектов и компаний… ведь он таак слооожен, там же нужно столько шаблонов знать и думать, прежде чем код написать… не, нафиг, лучше возьмем yii, там можно халтурить, как и в остальном php :)
Хотя может, конечно, мир изменился, потому что я около 2х лет пытаюсь избегать в php CMS, самописных велосипедов, kohana, cake и т.п. Жаль, что редко это получается.
С ларавелем близко не сталкивался.
Можете посмотреть мою:
https://github.com/litepubl/cms
Не идеал, и если есть желание найти недостатки, то не сомневайтесь — они там есть. Штука в том, что нужно уметь выкрутиться не наплодив лишних сущностей. Впрочем это тема для отдельной большой статьи
А тестами удобно покрывать приложения на yii?
![image](https://habrastorage.org/getpro/habr/comment_images/7d9/6b6/54e/7d96b654e84b128ced1d6e4a63882905.png)
^ Yii2, полгода проекту, функционал развивается, тесты пишутся, как unit, так и functional, всё очень даже удобно.
Я говорю общую картину и объективные вещи, вы говорите какие-то узко-субъективные вещи.
Я тоже могу напрячься и написать тестируемый код на yii, но разговор про то, что это делать очень сложно, если работал с гораздо более удобными подходами.
Когда-то мне нравилось делать сайты на wordpress. Это реально мне казалось очень удобно и классно. Потом попробовал другое и стал постоянно плеваться от вордпресса. Сейчас просто попробовал еще что-то вкуснее, чем yii2, да и вкуснее, чем php :)
С другой стороны, если всё же напрячься (или вы считаете, что программист не должен напрягаться?), то можно из того и из другого извлечь множество профита. Ваше нежелание напрягаться и постоянный поиск новых инструментов, которые позволят меньше напрягаться («перешёл на Go, там же есть go fmt!!!!11») не означает, что те инструменты, в которых вы так и не разобрались, являются плохими.
Про разные модные словечки, типа Go или Scala, это тема другого разговора.
Я считаю, что программист не должен напрягаться над написанием кода, он должен напрягаться над логикой приложения, его архитектурой(не в глобальном смысле) и над решением бизнес-задач.
Хочется много всего еще сказать, как в целом, так и про yii в частности, но пора бы и пойти поработать :)
Хотя, о чем уже говорить, какой к черту PSR, мне если не нравится форматирование, есть автоформатировщики в IDE, которые приведут код к одному образцу. Меня больше волнует то, что я до сих пор часто прямое использование mysql_* функций…
Это хорошо, когда есть время отрефакторить, а иногда заказчику трудно объяснить, почему этот код плохой, если до сих пор рабочий…
Пожалуй это одна из лучших статей по PHP из песочницы за последнее время.
Добро пожаловать на хабр!
Ого-го, целых 12 любителей тех замечательных статей из песочницы "как я делал свой велосипед на костылях и процедурном стиле в 2016 году". Это со мной что-то не так или же ...?
Так что я действительно считаю, что это достойная статья (хоть может и публикация в пятничный вечер была бы более к месту). Особенно, как я уже подметил, на фоне остальных. И я правда искренне удивлён минусам как к своим комментариям, так и к статье.
P.S. Вот так вот неудачно оставишь благодарность и уже не сможешь использовать разметку в комментариях :( Так что уж извиняйте за голый markdown.
if ($tru=($a==$b & $b==$c & $c+$d>$e?$f:$g)) {
$this->do($tru);
}
Можно пример небольшого проекта как правильно верстать?
16. Не создавайте много ячеек в таблицах БД, лучше используйте seialize и забудьте про кодировку при сохранении, если unserialize каждый раз выдает ошибку, просто игнорируйте её.
21. Храните всю информацию о пользователях в одной таблице — данные для авторизации, анкетные данные, домашние адреса и телефоны, места работы, да вообще любую информацию храните в одной таблице и не забывайте про serialize
23. Никогда не используйте таблицы-справочники, лучше дублируйте все в одной колонке, тем более если колонка содержит большие и часто повторяющиеся данные.
Это уже архитектура БД. Тут уже всё зависит от задачи. Когда речь заходит о высоких нагрузках, то появление избыточности — нормально.
Также, почему serialize-то? JSON — и всё, мы не зависим от версий PHP.
19. Пишите только так for($i=0; $i<count($arr); $i++), потому-что считать количество элементов в массиве при каждой итерации это хорошо, а постинкремент работает намного быстрее, а кто говорит наоборот просто не знает о чем говорит. И перебирать большой массив нужно именно сначала, потому-что так быстрее.
Постинкремент оптимизатором PHP уже умеет переделываться в преинкремент, так что это дело исключительно визуального удобства. Массивы же в PHP5+ хранят длину в себе, так что вынести можно и это будет в любом случае лучше, но не так критично, как описано тут.
26. Никогда и нигде не пишите комментарии, потому-что тру-прогерам они не нужны, в худшем случае можно написать коммент типа /*это функция a(), она принимает две переменные $a и $b*/ для совсем тупых.
Вообще давняя отдельная дискуссия про наличие комментариев и их объем.
29. Для того чтобы получить по-настоящему большой класс, нужно для каждой скобочки выделять целую строчку
psr-2
Ну вряд ли кто-то вручную подключает все файлы.
А стоит ли использовать тяжеловесные фреймворки? :)
У него legacy проект где нет composer и из за кучей инклюдов в разных файлах он долго пытался понять где и что подключается.
Разве GLOBALS страшны закончившейся озушкой. Я такого не слышал :)
В том проекте храниться в них все, начиная от результатов выборки бд на более 1ккк строк, заканчивая данными из сессий пользователей.
Хм, а как вывести список по другому? :)
Тут мы постоянно спорим IRL — автор сразу создает DOM объект и рендерит уже чистый html добавляя в него данные списка. Я же юзаю laravel и использую конструкции for в blade
Когда существует только один инстанс/нету привязки у метода к инстансу, то часто так и делаю :)
В этом случае все ок, но когда все начиная от моделей и заканчивая шаблонами и бизнес-логикой сделано статикой, это превращается в ад.
Храните всю информацию о пользователях в одной таблице — данные для авторизации, анкетные данные, домашние адреса и телефоны, места работы, да вообще любую информацию храните в одной таблице и не забывайте про serialize
В проекте автора есть три таблицы на +100 полей причем в них есть 3-5 поля с php serialize на еще +50 полей. Причем некоторые serialize были поправлены без десериализации чьими-то кривыми ручками в базе и окончательно испорчены.
Устал читать глупости про «не используйте count в циклах».
P.S. Особенно порадовал пункт про скобочки.
UPD
Публикация внезапно набрала отрицательный рейтинг
От G-M-A-X
1. Если что, то я не могу минусовать… :)
2. Зачем мне сдалить E_NOTICE на проде? На деве — пожалуйста. :) А тем более с выводом на экран.
30 вредных советов для php-разработчиков