Хотів було назвати статтю «професійне 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. Все це і ще трішки більше я зазвичай розповідаю на лекціях у своєму відділі 😉