Доклад с PUG#6 https://www.facebook.com/events/837043689707114/
Поговорим о:
- сути интерпретируемого PHP, обсудим, как с этим жить;
- панацее Zephir. «А что там под капотом?»;
- наглядном профите. Поиграем с Symfony, Yii, Magento;
- будущем Zephir.
2. О чем будем слушать?
• Суть интерпретируемого PHP и как с этим
жить.
• Панацея Zephir. “А что там под капотом?”
• “Как выучить Zephir за 21 день.”
• Что же будет дальше?
13. Чем отличается от PHP
• Декларативный стиль.
• Статическая/динамическая типизация.
• Пространства имен - обязательно!
• Запрещен глобальный код.
• Компиляция Ahead-of-time.
• Безопасная работа с памятью.
14. Динамическая типизация
Практически ничем не отличается от PHP
Декларативный стиль:
объявили и только после используем
var a, b, c;
// Initialize variables
let a = "hello",
b = false;
// Change their values
let a = 10,
b = “140";
// Perform operations between them
let c = a + b;
16. Статическая типизация
• Более эффективный статический
анализ кода при компиляции.
• Возможность провести дополнительные
оптимизации при компиляции.
• Лучший выбор для
высокопроизводительных приложений.
18. // Dynamical
var a = 1;
// arrays
var b = [1, 2, 3];
array b = [1, 2, 3];
array c = [1: 'a', "index": false];
// Statical
int a = -1;
let a = false; // automatically casted to 0
let a = "string"; // throws a compiler exception
uint a = 1;
float pi = 3.14;
bool a = true;
string a = "Test string";
char a = 'A';
// Objects
var myObject;
let myObject = new stdClass(),
myObject->property = "value";
Немного переменных
22. • Парадигма ООП.
• Один файл - один класс.
Пространства имен
mylibrary/router.zep mylibrary/router/exception.zep
23. Методы/Функции
• Можем указать тип возвращаемых
данных.
• Можем указать тип параметров.
• Тип передаваемого аргумента
приводится к ожидаемому в случае, если
они не совпадают, и это возможно.
• Можем указать read-only параметры.
• Имеем сахар для get, set, toString.
24. namespace Test;
class Hello
{
const HELLO = "hello";
protected customString = null {
get, set
};
public function say(string word) -> string
{
return word;
}
public function sayHelloTo(string! name) -> string
{
return this::HELLO . " " . name;
}
public function sayHello()
{
return this::HELLO;
}
}
Маленький класс
25. Имеем возможность использовать функции
PHP.
namespace MyLibrary;
class Encoder
{
public function encode(string text)
{
if strlen(text) != 0 {
if function_exists("my_custom_encoder") {
return my_custom_encoder(text);
} else {
return base64_encode(text);
}
}
return false;
}
}
Функции
26. Не можем присвоить результат функции к
переменной статического типа.
namespace MyLibrary;
class Encoder
{
public function encode(string text) -> string | bool
{
string encoded = "";
if strlen(text) != 0 {
let encoded = (string) base64_encode(text);
return '(' . encoded . ')';
}
return false;
}
}
Функции
27. config.json
• Оптимизации при трансляции.
• Warnings при статическом анализе.
• Глобальные переменные на расширение.
• Общая информация.
• Блок phpinfo()
29. Function call optimizers
• Уходим от PHP_FUNCTION.
• Используем функции вшитые в C или
пишем свои.
Подмена вызовов типичных функций из
ядра Zend Engine на оптимизированные свои.
30. Алгоритм работы
1. $ zephir init test
2. Пишем код проекта.
3. $ zephir build
4. Add extension=test.so to your php.ini