7. Конфигурация *должна* храниться в
текстовых файлах специального
формата
JSON {“name”: “foo”, “strict”: false, …}
XML
<application
name=“foo”>…</application>
ini
[application]
name = “foo"
Yaml
name: foo
paths:
data: app/data
14. Используйте шаблоны для
построения выходных документов
Smarty
<head>
<title>App Name – {$title}</title>
</head>
Twig
<head>
<title>App Name – {{ title }}</title>
</head>
Blade
<head>
<title>App Name - @yield('title')</title>
</head>
15. Отображение по шаблону
Анализ:
лексический и
синтаксический
Семантический
разбор
Исходный код
Внутреннее
(временное)
представление
Выполнение
Шаблонизатор
Динамическое
подключение
файлов
- Smarty
- Twig
- Blade
PHP
17. Пользуйтесь интерфейсами везде,
где это возможно
class Application extends Module implements
ApplicationInterface {…}
class Request extends Component implements
RequestInterface {…}
class Controller extends Component implements
ControllerInterface {…}
class HttpException extends Exception implements
HttpExceptionInterface {…}
18. Как работает полиморфизм?
Interface ShapeInterface
{
public function draw(int $x, int $y);
}
…
public function drawShape(ShapeInterface $shape)
{
…
$shape->draw($x, $y);
// варианты (таблица) реальных вызовов:
// - Rectangle::draw()
// - Circle::draw()
// - Triangle::draw()
}
19. Цена интерфейса
namespace app;
// PHP version = 7.1
class Item {}
…
interface EmptyInterface {}
…
class EmptyItem implements EmptyInterface {}
// Yii2 has 336 classes, interfaces, traits
$item = new Item(); // X100
// diffTime = 0.00621s diffMemory = 136424B
$item = new EmptyItem(); // X100
// diffTime = 0.01247s diffMemory = 174872B
20. namespace app;
// PHP version = 7.1
class FilledItem {…}
…
interface FilledInterface {…}
…
class InterfacedItem implements FilledInterface {…}
// Yii2 has 336 classes, interfaces, traits
$item = new FilledItem(); // X100
// diffTime = 0.05291s diffMemory = 9407848B
$item = new InterfacedItem(); // X100
// diffTime = 0.05937s diffMemory = 10179512B
21. PHP (Web Server)
Parse request
Prepare SQL
MySQL Server
Request
web page
Return
HTML
Parse query result
Compose HTML
Parse SQL
Execute query
Prepare response
Кто сколько работает?
23. Загрузка сущности (class, interface, trait)
Определение файла
с исходным кодом
Чтение файла
(require)
Анализ исходного
кода
Построение
внутренней модели
сущности
Composer
Autoloader
PHP
Интерпретатор
(+Акселератор)
Разбор имени
сущности и
пространства имен
31. О крайностях
Принцип «бороться
за каждый байт!»
Vanilla PHP
C-based PHP
extension
Phalcon
Резидентное
приложение, PHP
демоны и LibEvent
ReactPHP
32. PHP Framework – вопрос баланса
Функциональность Производительность
33. Используйте ограничения типов
interface RequestParserInterface
{
public function parse(Request $request);
}
interface ResponseFormatterInterface
{
public function format(ResponseInterface $response);
}
class FileHelper
{
public static function copyDirectory(
string $src,
string $dst,
DirectoryCopyOptions $options
) {…}
}
34. Application – Service Locator
baseComponent
Application
$definitions
$components
*1
Request
Client
get($id)
“Request component
by id”
…
“Create and
store by id”
Response Formatter
35. Соглашения уменьшают количество
сущностей
interface RequestParserInterface
{
/**
* @param Request $request – request CONVENTION
*/
public function format($request);
}
interface ResponseFormatterInterface
{
/**
* @param Response $response – response CONVENTION
*/
public function format($response);
}
37. Комментарии в коде – это плохо
class FileHelper
{
public static function copyDirectory(
string $sourceDirectory,
string $destinationDirectory,
DirectoryCopyOptions $options
) {…}
}
class DirectoryCopyOptions
{
public $caseSensitive = false;
}
38. Соглашение через PHPDoc вместо
строгой конфигурации
class FileHelper
{
/**
* Copies a whole directory as another one.
* …
* @param array $options options for directory copy.
* Valid options are:
* - recursive: boolean, whether the files under the subdirectories
* should also be copied. Defaults to true.
*/
public static function copyDirectory($src, $dst, $options = [])
{…}
}
39. Этапы проверки кода
Синтаксический и
семантический
анализ
Модульное
тестирование
Функциональное
тестирование
Ручное
тестирование
Рецензирование
(Code Review)
Разработчик
Интерпретатор
Тестировщик
Ст. разработчик
(Архитектор)
40. Ф’Yii’лософия
• PHP - это интерпретатор
• С интерпретатором не нужно бороться
• Конфигурация приложения и объектов
• Отображение: Helpers + Widget
• Минимальная декомпозиция
• KISS вместо SOLID
• PHPDoc
• Соглашения вместо конфигурации
http://www.yiiframework.com/