Хотел было назвать статью «профессиональное PHP программирование», но по факту — это лишь «заметки бывалого», которые будут полезны начинающим разработчикам, хотя, возможно, привлеку внимание и «старшего» поколения ;)
Инструментарий
Хороший мастер работает лишь со своим инструментом, и сильно расстраивается когда оного нет под рукой, так и я — всё своё ношу с собой:
- IDE — PHP Storm
- Менеджер БД — SQLYog
- Всяко-разно — notepad++, putty, winscp…
PHP Storm
IDE решает многие задачи и проблемы, которые постоянно возникают перед разработчиком. Мой выбор остановился на PHP Storm, а до того я успел попробовать Zend Studio, Eclipse, Aptana, NetBeans и еще несколько о которых и не вспомню. Что же хорошего в данной IDE:
- java — т.е. нам практически любая платформа по плечу
- автодополнение — очень адекватное, и приучает к документированию кода
- автосохранение — забудьте про ctrl+s
- автозаливка (FTP/SFTP)
- автозаливка после комита
- исправление ошибок
- поддержка VCS
- рефакторинг
- поиск и замена по файлам – работает просто отлично, и частенько меня выручала
- отличная поддержка HTML/CSS/JS
- Zen coding из коробки (советую таки узнать что это ;)
Но без недостатков не бывает:
- java — т.е. любит память, и IDE приходится время от времени перезапускать — где-то раз в неделю
- цена — сейчас, со скидкой, это $50 (до 27-го ноября)
Отдельно оговорюсь насчет цены — у меня купленная версия, но так же есть Open Source лицензия, ее тоже можно получить, но только надо запастись терпением (как можно догадаться — у меня терпения не хватило). Насчет же NetBeans — задолбал он своей нестабильной работой и такими же обновлениями.
В качестве заключения: мои слова ничего не значат, верьте своим глазам — попробуйте триал, благо целого месяца хватит на распробовать ;)
SQLYog
Для работы с MySQL использую SQLYog, что же в нём такого хорошего:
- автодополнение
- профайлер
- автоформатирование запросов
- синхронизация структуры БД и данных при необходимости
- SSH туннель — если у вас есть SSH, то SQLYog в игре
- HTTP туннель — хотя хватит доступа и к FTP
- отлично работает под wine (по правде говоря есть огрехи, но совсем мелкие)
Ну не без ложки дёгтя:
- цена — от $69, но есть триальная и урезанная фришная версия
Опять же, есть триал — пробуйте, и забудьте про phpMyAdmin как про страшный сон.
Ещё чуть-чуть
Ой, ну дальше дело вкуса:
- Notepad++ — всегда на подхвате, открывает большие файлы, понимает все кодировки, с плагином hex-редактор
- PuTTY — без него никак, (puttygen рулит кстати)
- TotalCmd – файловый менеджер + FTP клиентб недавно вышла 8-ая версия (beta), не купил, жмакаю раз в неделю кнопку с циферкой
- WinScp – SFTP клиент (файловый менеджер over SSH)
Да, я работаю на винде, набор инструментов для Linux и Мас отличается лишь набором дополнительных тулзов…
Фишки PHP и 5.3 в частности
phpDocumentor
Я уже упоминал о крутом автодополнение в IDE, тук вот, чтобы этого добиться необходимо описывать классы, методы и функции используя doc comment’ы:
/** * @property integer $id * @property string $login * ... */ class Row { }
В результате IDE будет подсказывать нам всё что нужно:
Еще примерчик:
/** * @return Users\Row */ function getUser() { return Registry::get("user"); } /* @var Users\Row $user */ $user = Registry::get("user");
В IDE похожий результат:
Кроме бенефитов для IDE есть еще возможность сгенерировать техническую документацию используя PHPDocumentor:
/** * <code> * $this->getByLoginOrPasswordAndEmail( * 'vasya', md5(123456), 'vasya@mail.ru' * ) * </code> */ function getByColumnsFinder() { /*...*/ }
Обернётся в:
Tips & Tricks: Fixme Comment
Заметки на будущее прям в коде:
// TODO: do something with some function // FIXME: hands // XXX: may be broken
IDE нынче умные пошли, и все такие заметки соберут до кучи:
Tips & Tricks: о include и require
А вы смотрели что возвращают функции include и require? А если в подключаемом файле используется return?
$config = require 'config.php'; // config.php return array( 'DB' => array(...) );
Достаточно универсальный способ для подключения конфигурационных файлов.
Tips & Tricks: о фильтрации данных
На дворе уже закат PHP 5.2, а фильтры не используем:
// return string or false filter_var('bob@example', FILTER_VALIDATE_EMAIL); filter_var('bob@example.com', FILTER_VALIDATE_EMAIL); // return string or false filter_var('http://example.com', FILTER_VALIDATE_URL);
По теме:
- http://www.php.net/manual/en/function.filter-var.php
- http://www.php.net/manual/en/filter.filters.validate.php
- http://www.php.net/manual/en/function.filter-var-array.php
Иногда обработку массива превращают в что-то невообразимое, можно же проще:
// array of ids $ids = $Request->getParam("ids"); // to integer $ids = array_map("intval", $ids); // without zero $ids = array_filter($ids); // unique $ids = array_unique($ids); // prepare for SQL $idsStr = join(",", $ids);
А бывают ситуации, когда в форме есть несколько submit кнопок, и надо понимать что же было нажато (о да, это плохие формы)
<form> ... <input type="submit" name="disable" value="Disable selected" /> <input type="submit" name="enable" value="Enable selected" /> </form>
// gets current action $action = current(array_intersect(array_keys( $_REQUEST), array('disable', 'enable') ));
Tips & Tricks: glob
Уже везде упоминали функцию glob, но мы всё так же её игнорируем, так что я решил её опять вспомнить:
$controllers = glob('/modules/*/controllers/*.php'); $modules = glob('/modules/*', GLOB_ONLYDIR);
Tips & Tricks: mysqlnd
Если у вас высокопроизводительное приложение, если вам знакомо понятие master и slave, если разруливаете это ручками, то вот оно — прозрение:
// in config [myapp] master[]=localhost:/tmp/mysql.sock slave[]=192.168.2.27:3306 // in sources $mysqli = new mysqli("myapp", "username", "password", "database"); $pdo = new PDO("mysql:host=myapp;dbname=database", "username", "password");
По теме:
- http://www.php.net/manual/en/book.mysqlnd.php
- Replication and load balancing mysqlnd plugin for all PHP MySQL extensions released
P.S. О, это уже было в … твитере ;)
Reflection
Посмотри на себя в зеркало, в нём ты увидишь и имена методов, и приватные данные, и даже комментарии. Знай и используй с умом!
PHP 5.3
Приведу краткие тезисы по теме новшеств в PHP 5.3 (да, да, жевано-пережевано, но повторить то стоит)
Анонимные функции
Используете jQuery, значит ничего нового тут не увидите:
$ids = array_map(function($el){ return intval($el); }, $ids); // or $toInt = function($el){ return intval($el); }; $ids = array_map($toInt, $ids); // or $int = $toInt($el);
Замыкания
Смотреть в код до наступления понимания происходящего:
function getTimeout() { $el = "15 minutes"; return function() use ($el){ return intval($el); }; } $timeOut = getTimeout(); echo $timeOut(); // >> 15
Магический метод __invoke()
Вместо слов, лишь код:
class Row { function __invoke() { return $this->login; } } $user = new Users\Row(); $var = $user(); // >> return user login
Namespaces
Про пространство имён не писал лишь ленивый, но я предлагаю простую ассоциацию c файловой системой (спасибо за бэкслеш, ассоциация будет с Windows):
\ << Default namespace - root \Exception \StdClass \Application << Our namespace - Application \Model \User \Group \Controller \User
- объявляя namespace — мы добавляем новый класс в иерархию «папок» — cd && mkdir
- говоря use — используем директорию из иерархии (1 или более) — как команда cd
- говоря use as — используем под определенным именем — ln
- всегда можно обращаться идя от корня (абсолютный путь: \Application\Model\Group)
Позднее статическое связывание
Эта непонятная фигня означает, что когда вы наследуете класс от статического, то у вас возникнут проблемы с доступом к статическим методам наследуемого класса, приведу наглядный (я надеюсь) пример:
class Latin { const CHARS = 'abc...'; static function getChars() { return self::CHARS; } } class French extends Latin { const CHARS = 'aàábc...'; } echo French::getChars(); // >> abc...
В PHP 5.3 решается просто:
class Latin { const CHARS = 'abc...'; static function getChars() { return static::CHARS; // << static } } class French extends Latin { const CHARS = 'aàábc...'; } echo French::getChars(); // >> aàábc...
Почти фреймворк
Ой, велосипед, да на «новых» технологиях, нямочка, зацените-ка контроллер:
namespace Bluz; return /** * @acl View User Profile * @cache 5 minutes * @param integer $id * @return closure */ function($id) use ($bootstrap, $app, $view) { /** * @var closure $bootstrap * @var Application $app * @var View $view */ $view->user = $app->getDb()->getRow("...", array($id)); };
- Контроллер — анонимная функция возвращаемая при подключении файла
- Может вернуть что угодно, лишь бы было callable
- Принимает параметры с реквеста, уже отфильтрованнные (описали же в doccomment’e правила)
- Кеширует результат выполнения на 5 минут (опять reflection)
- Acl тут тоже не просто так ;)
Возможно выложим на общее обозрение сие творение, ну когда отшлифуем его ;)
Если что-то позабыл
Позабыл я о небольшом изменении в поведении тернарного оператора «(statement)?(then):(else)», у него появилось мини-сокращение:
echo $var?$var:'nil'; // ? : improvements echo $var?:'nil';
Что-то оно не очень, можно было сделать лучше (эти примеры не работают!):
echo $var?; // or echo isset($var['elem'])?$var['elem'];
Еще «незаслужено» обошёл стороной метки:
// labels start: echo "start"; goto finish; echo "never"; finish: echo "finish";
P.S. Всё это и еще немного больше я обычно рассказываю на лекциях в своём отделе ;)
Если под Windows работать – то для MySQL стоит как минимум посмотреть бесплатный dbForge Studio for MySQL
+1 за ПХП Шторм.
Кстати ссылки на ” моя тёмная схема ” битые.
Подправил
+1 Вначале со скепсисом читал, думал: “что может быть лучше NetBeans?!”, но решил затестить и открыл PhpStorm – больше желания открывать NetBeans не возникало. так и работаю теперь))
Я сам недавно писал о используемом софте http://amdy.su/parochka-skrinshotov-rabochego-stola-programmista/, вот советы у тебя познавательные.
Тема для PHP Storm не качается, ещё стоит отметить, что есть бесплатные сборки Web Storm EAP, где обкатываются все новинки. Кстати, пользуюсь нетбинсом, он стабилен даже на бетках, не знаю какие проблемы у тебя возникали, у меня только недавно был казус со сторонним плагином и всё, проблем больше не припомню.
Beyond compare для деплоймента тоже хорош
Неплохой обзорчик. Инструментарий в целом совпадает. Только FAR вместо Тотала.
Текущая 2.1.5 не перезапускалась уже недели 2 и не вижу каких то проблем. Хотя возможно конечно зависит от размера проекта.
И от количества проектов
Спасибо за статью. На счет перезапуска PhpStorm. Мне его приходится иногда перезапускать примерно раз в сутки, т.к. возникают странные проблемы с переключением раскладки клавиатуры.
Было такое, сменил переключение клавы на alt+shift прошло
Антон, откуда у тебя столько сил и энергии все это описывать. Ценю труды.
Моё env – это NetBeans, mysql client/mysqldump, vim/gedit, gnome Terminal…
Может и разумно не использовать FILTER_VALIDATE_EMAIL
Надеюсь, я что-то не так понял
WTF?
для условия вида WHERE id IN ( 1, 2, 3 )
По FILTER_VALIDATE_EMAIL – тут конечно отдельная история, можно вникнуть в суть из топика http://stackoverflow.com/questions/3406473/why-does-filter-varemail-filter-validate-email-allow-testtest
Насчет join уже ответили, мой комментарий конечно может озадачить :)
Нет, в этот раз все правильно
Еще бы добавил.
Для работы с датами испльзуем только класс DateTime. Гораздо удобнее функций, озможности одинаковы
Можно от него отнаследоваться и определить метод __toString(), чтобы объекты в запрос вставлять удобнее было:
Для Конфигов в виде массивов удобнее использовать ArrayObject:
Спасибо за дополнение
Привіт. Трохи не та ту тему, але усе ж… яку книжку порадите, для вивчення PHP 5.3? Можна eBook, а можна і паперову. Заздалегідь вдячний за відповідь.
До речі, нещодавно надибав ваш сайт. Класний. Подобається. :)
Советую вместо putty взглянуть на Xshell.
Или Kitty. У меня она стабильнее работает, нежели Putty
По поводу юзания тулзов вроде SQLYog – про phpmyadmin забыть не получится, т.к. довольно часто внешние коннекты запрещены и допустим у меня динамический IP
Так на то и нужны ssh/http туннели
проще
Внимательней будь
А вместо SQLYog есть HeidiSQL, который бесплатный и под wine работает и помощнее йога выглядит.
phpmyadmin кроссбраузерен и кросплатформенен =) отличная тулза. Считаю критику неоправданной =)
sqlYog решает по всем критериям, а phpMyAdmin тормознутый и дырявый
Спасибо! Отличный обзор. К своему стыду не знал о Filter.
TotalComander пароли не шифрует, не стал бы его использовать в качестве ftp клиента. CuteFtpPro получше будет, но стоит денег. Использую Netbens.
Кстати, NetBeans – отличная штука. Особенно мне нравятся versioning annotation или как их там: рядом с номерами строк показывает полоски красного, синего и зеленого цвета, клацаешь на них и смотришь старые куски кода из предыдущей ревизии. Естественно это при условии, если код находится под контролем версий
Рекомендую попробовать бесплатную Codelobster PHP Edition.
В ней также есть возможность работы с MySQL и очень удобный автокомплит.
Спасибо. интересно
Ubuntu + NetBeans, и так у меня большинство знакомых PHP девелоперов.
@Anton Shevchuk
Ваш конфиг не работает под PhpStorm 3.0. При импорте выдает ошибку (
На Ubuntu все работает, и да же на 4.0. Копируешь в ~/.WebIde40 и все замечательно.
Единственное нарекание – комментарии с наклоном, в Linux буквы с наклоном уже чем без наклона и выглядит это просто ужасно (((
http://s017.radikal.ru/i410/1202/e4/1f4962f5ab52.png
Спасибо.. Некоторые фишки не использовал…
Возможно, имеет смысл добавить в пост про PHP Storm EAP – многие “плюшки” получаешь до выхода основной версии.
Статья хорошая. Что касается IDE, то я использую phpDesigner 7, и меня полностью устраивает.
Кстати +1 за Xshell
Фришный(!) ssh-клиент с табами, перепробовал все, этот самый лучший, если у тебя не один сервер.
Классная статья! Узнал что можно на уровне PHP-расширения балансировать SQL-запросы.
интересненько
что мне еще нравится в шторме
– Позволяет отображать разные типы файлов разными цвета
– Удобно показывает применяемые css для элемента
– Удобно отображает html элементы
– Интеграция с jira
– Таски, которые группирируют файлы для определенной задачи. Легко привязываются к тикетам из jira (мне не очень помогло, так как я работал с мантисом, который не поддерживается). Каждый таск хранит working context и file change list, который позволяют удобно работать с VCS.
– кто-то говорил что нельзя выделить текст и обернуть его кавычками, но это не правда.
– скорость работы, индексации файлов, поиска файлов или текста и много другое.
уверен что другие ИДЕ позволяют много из вышеперечисленого, но в шторме это все реализовано очень и очень …..
Несколько вопросов по JetBrains PhpStorm 3.x
1. Как сделать что бы при клике мышкой на пустое место после текста, курсор (т.е. мигающая палочка) переносилась в конец строки а не в то место куда нажал мышкой.
2. Как при двойном клике на слово (например div) выделялись все такие же слова в тексте (в данном случае что бы подсвечивались все div)
3. Как убрать подсветку ошибочных тэгов, например . Он подсвечивается желтым фоном и написано “Unknown html tag noindex”
4. Есть ли цветовая тема аля notepad++ ?
1. сам искал долго :)
2. выделить -> ctrl+f
3. поменять цвет вручную в используемой теме или поискать в настройках
4. на любой вкус
3. можно попробовать настроить\отключить Inspections
А в PhpStorm можно работать с файлами прямо на ftp-сервере? То есть открыл, работаешь, а как сохранил – он автоматом залился на сервер. И дальше с ним продолжаешь работать.
Если настроить автоаплоад через ФТП – то все ок. Но только весь проект надо будет вначале скопировать себе.
А подскажите, пожалуйста, где этот автоаплоад настраивается? А то не могу найти. Только вручную видел.
tools->deployment-automatic upload
автоаплоад срабатывает при сохранении или автоматически при деактивации IDE если у вас установлено Save files on frame deactivation.
Вот еще пара Tips and Tricks: http://newblog.kz/posts/view/99
Никогда не понимал людей использующих что-то кроме MySQL Workbench от самого ORACLE(mysql)