Хотів було назвати статтю «професійне 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 — задовбав він своєю нестабільною роботою і такими ж оновленнями.
В якості висновку: мої слова нічого не значать, вірте своїм очам — спробуйте тріал, благо цілого місяця вистачить на розкуштувати 😉
До речі, якщо комусь подобається моя темна схема для PHP Storm, то її можна забрати з dropbox’a
SQLYog
Для роботи з MySQL використовую SQLYog, що ж у ньому такого хорошого:
- автодоповнення
- профайлер
- автоформат запитів
- синхронізація структури БД даних і при необхідності
- SSH тунель — якщо у вас є SSH, то SQLYog в грі
- HTTP тунель — хоча вистачить доступу до FTP
- відмінно працює під wine (по правді кажучи є огріхи, але зовсім дрібні)
Ну не без ложки дьогтю:
- ціна — від $69, але є триальна і урізана версія фришная
Знову ж таки, є тріал — пробуйте, і забудьте про phpMyAdmin як про страшний сон.
Ще трохи
Ой, ну далі справа смаку:
- Notepad++ — завжди на підхваті, відкриває великі файли, розуміє всі кодування, з плагіном hex-редактор
- PuTTY — без нього ніяк, (puttygen рулить до речі)
- TotalCmd – файловий менеджер + FTP клиентб нещодавно вийшла 8-а версія (beta), не купив, жмакаю раз в тиждень кнопку з циферкой
- WinScp – SFTP клієнт (файловий менеджер over SSH)
Так, я працюю на вінді, набір інструментів для Linux і Mac відрізняється лише набором додаткових тулзов…
Фішки 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:
/**
*
* $this->getByLoginOrPasswordAndEmail(
* ‘vasya’, md5(123456), ‘[email protected]’
* )
*
*/
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’;
array(…)
);
Досить універсальний спосіб для підключення конфігураційних файлів.
Tips & Tricks: про фільтрування даних
На дворі вже захід PHP 5.2, а фільтри не використовуємо:
// return string or false
filter_var(‘[email protected]’, FILTER_VALIDATE_EMAIL);
filter_var(‘[email protected]’, 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 кнопок, і треба розуміти що ж було натиснуто (о так, це погані форми)
…
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
// sources in
$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
[/code]
- оголошуючи 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; // <> 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. Все це і ще трішки більше я зазвичай розповідаю на лекціях у своєму відділі 😉