Slide 1

Slide 1 text

Epic PHP #8 Рома Лапин, Evercode Lab

Slide 2

Slide 2 text

Анонимные функции

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Анонимные функции Анонимные функции, также известные как замыкания (closures), позволяют создавать функции, не имеющие определенных имен. Они наиболее полезны в качестве значений callback-параметров, но также могут иметь и множество других применений.

Slide 5

Slide 5 text

before function isEven($val) { return $val % 2 == 0; } $arr_even = array_filter($arr, 'isEven'); ! function square($val) { return $val * $val; } $arr_square = array_map('square', $arr);

Slide 6

Slide 6 text

after $arr = range(0, 10); $arr_even = array_filter( $arr, function($val) { return $val % 2 == 0; } ); ! $arr_square = array_map( function($val) { return $val * $val; }, $arr );

Slide 7

Slide 7 text

Присвоение переменной $greet = function($name) { printf("Hello %s\r\n", $name); }; var_dump($greet); $greet('World');

Slide 8

Slide 8 text

Анонимные функции • функции без указания конкретного имени • внутренний класс Closure самим создать нельзя

Slide 9

Slide 9 text

use public function getTotal($tax) { $total = 0.00; ! $callback = function ($quantity, $product) use ($tax, &$total) { $pricePerItem = constant(__CLASS__ . "::PRICE_" . strtoupper($product)); $total += ($pricePerItem * $quantity) * ($tax + 1.0); }; ! array_walk($this->products, $callback); return round($total, 2); }

Slide 10

Slide 10 text

Терминология — отстой Есть лямбда-функции, есть замыкания. Все это объединяется понятием «анонимные функции». Лямбду называют замыканием, если она использует переменные родительской функции после отработки последней (т.е. замыкает эти переменные на себя).

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

create_function $av = array("the ", "a ", "that ", "this "); array_walk($av, create_function('&$v,$k', '$v = $v . "mango";')); print_r($av);

Slide 13

Slide 13 text

Задание Дан массив вида: $data = array( array('id' => 1, 'name' => 'Bob', 'position' => 'Clerk'), array('id' => 2, 'name' => 'Alan', 'position' => 'Manager'), ); ! Используя функцию array_map и анонимную функцию, создайте массив, состоящий только из имен (поле name).

Slide 14

Slide 14 text

Задание Дан массив вида: $data = array( array('date' => 'tomorrow', 'title' => 'World'), array('date' => 'today', 'title' => 'Hello'), ); ! Используя функцию uasort и анонимную функцию, отсортируйте массив по возрастанию значения даты.

Slide 15

Slide 15 text

Cron

Slide 16

Slide 16 text

Cron У меня есть скрипт, который надо выполнять раз в час. Как мне это сделать?

Slide 17

Slide 17 text

Cron # crontab -e 00 * * * * php /home/john/myscript.php */10 * * * * wget -q -O temp.txt http://www.thegeekstuff.com/myscript.php

Slide 18

Slide 18 text

Cron

Slide 19

Slide 19 text

Фреймворки

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

Full-stack Frameworks • Symfony2 • Zend Framework • Laravel • Yii • Lithium

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

Micro Frameworks • Fat-Free • MicroMVC • Silex • Slim

Slide 25

Slide 25 text

Silex

Slide 26

Slide 26 text

Silex require_once __DIR__.'/../vendor/autoload.php'; ! $app = new Silex\Application(); ! $app->get('/hello/{name}', function($name) use($app) { return 'Hello '.$app->escape($name); }); ! $app->run();

Slide 27

Slide 27 text

Установка http://silex.sensiolabs.org/download

Slide 28

Slide 28 text

Установка composer.json: ! { "require": { "silex/silex": "~1.1" } } ! composer.phar install

Slide 29

Slide 29 text

Структура ├── composer.json ├── composer.lock ├── vendor │ └── ... └── web └── index.php

Slide 30

Slide 30 text

Bootstrap // web/index.php ! require_once __DIR__.'/../vendor/autoload.php'; ! $app = new Silex\Application(); $app['debug'] = true; ! // definitions ! $app->run();

Slide 31

Slide 31 text

Routes $app->get('/blog/{id}', function ($id) { ... });

Slide 32

Slide 32 text

Routes $app->get('/blog/{postId}/{commentId}', function ($postId, $commentId) { ... });

Slide 33

Slide 33 text

Routes $app->get('/blog/{postId}/{commentId}', function ($commentId, $postId) { ... });

Slide 34

Slide 34 text

Routes $app->get('/blog/{id}', function (Application $app, Request $request, $id) { ... });

Slide 35

Slide 35 text

Routes use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; ! $app->post('/feedback', function (Request $request) { $message = $request->get('message'); mail('[email protected]', '[YourSite] Feedback', $message); ! return new Response('Thank you for your feedback!', 201); });

Slide 36

Slide 36 text

Errors use Symfony\Component\HttpFoundation\Response; ! $app->error(function (\Exception $e, $code) { return new Response( 'We are sorry, but something went terribly wrong.' ); });

Slide 37

Slide 37 text

Redirect $app->get('/', function () use ($app) { return $app->redirect('/hello'); });

Slide 38

Slide 38 text

JSON $app->get('/users/{id}', function ($id) use ($app) { $user = getUser($id); ! if (!$user) { $error = array('message' => 'The user was not found.'); return $app->json($error, 404); } ! return $app->json($user); });

Slide 39

Slide 39 text

Escaping $app->get('/name', function (Silex\Application $app) { $name = $app['request']->get('name'); return "You provided the name {$app->escape($name)}."; });

Slide 40

Slide 40 text

Templates $app->register(new Silex\Provider\TwigServiceProvider(), array( 'twig.path' => __DIR__.'/views', ));

Slide 41

Slide 41 text

Templates $app->get('/hello/{name}', function ($name) use ($app) { return $app['twig']->render('hello.twig', array( 'name' => $name, )); });

Slide 42

Slide 42 text

Templates
hello, {{ name }}!

Slide 43

Slide 43 text

Database $app->register(new Silex\Provider\DoctrineServiceProvider(), array( 'db.options' => array( 'driver' => 'pdo_mysql', 'host' => 'localhost', 'dbname' => 'my_database', 'user' => 'my_username', 'password' => 'my_password', 'charset' => 'utf8', ), ), );

Slide 44

Slide 44 text

Database $app->get('/blog/{id}', function ($id) use ($app) { $sql = "SELECT * FROM posts WHERE id = ?"; $post = $app['db']->fetchAssoc($sql, array((int) $id)); ! return "

{$post['title']}

". "

{$post['body']}

"; });

Slide 45

Slide 45 text

Регулярные выражения

Slide 46

Slide 46 text

Регулярки Регулярные выражения (англ. regular expressions, сокр. RegExp, RegEx, жарг. регэкспы, регексы или регвыры) — формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов (символов-джокеров, англ. wildcard characters). По сути это строка-образец (англ. pattern, по-русски её часто называют «шаблоном», «маской»), состоящая из символов и метасимволов и задающая правило поиска.

Slide 47

Slide 47 text

Регулярки Мощный инструменты для анализа и манипуляций с текстом. По сути это мини-язык для описания и парсинга текста.

Slide 48

Slide 48 text

Регулярки

Slide 49

Slide 49 text

Функции • preg_match • preg_match_all • preg_replace • preg_split

Slide 50

Slide 50 text

Регулярки

Slide 51

Slide 51 text

Регулярки

Slide 52

Slide 52 text

Полезное • http://www.php.net/manual/ru/ reference.pcre.pattern.syntax.php • http://regexpal.com/ • http://refiddle.com/

Slide 53

Slide 53 text

Полезное

Slide 54

Slide 54 text

Задание Написать регулярку, которая будет выдергивать пути на картинки из html.

Slide 55

Slide 55 text

Задание Написать регулярку, которая будет удалять повторяющиеся знаки препинания

Slide 56

Slide 56 text

Задание С помощью регуярных выражений получать title произвольной страницы. Саму страницу можно получать с помощью любой файловой функции или CURL.

Slide 57

Slide 57 text

Things to learn

Slide 58

Slide 58 text

Тестирование • PHPUnit • Behat & Mink • PHPSpec

Slide 59

Slide 59 text

Продвинутые фичи • Reflection API • Traits • SPL Interfaces & Exceptions

Slide 60

Slide 60 text

Awesome PHP Libraries and Resources https://gist.github.com/ziadoz/1677679

Slide 61

Slide 61 text

XDebug Единственный и лучший отладчик для PHP. Позволяет отследить исполнение кода и контролировать содержимое вашего стэка. Интегрируется с большинством IDE с возможностью установки breakpoint’ов.

Slide 62

Slide 62 text

Master your editor • Sublime Text • PHPStorm • other IDEs: Eclipse, NetBeans • vim (http://vim-adventures.com/)

Slide 63

Slide 63 text

Deployment • Phing • Capistrano (Capifony for Symfony) • Bash-scripts • Хотя бы через git

Slide 64

Slide 64 text

Bytecode Cache Во время исполнения PHP файла, под капотом он сперва компилируется в байткод(или опкод) и только потом, исполняется байткод. Если PHP файл не изменен, байткод будет всегда одинаков. Это значит, что шаг компиляции - пустая трата процессорных ресурсов.

Slide 65

Slide 65 text

Bytecode Cache • APC • XCache • Zend Optimizer+ (часть Zend Server) • WinCache (расширение для MS Windows Server)

Slide 66

Slide 66 text

Кэширование данных $data = apc_fetch('expensive_data'); if ($data === false) { apc_add('expensive_data', $data = get_expensive_data()); } ! print_r($data);

Slide 67

Slide 67 text

Кэширование данных • Функции APC • Memcached • Redis

Slide 68

Slide 68 text

Люди

Slide 69

Slide 69 text

Люди • Rasmus Lerdorf • Fabien Potencier • Derick Rethans • Chris Shiflett • Sebastian Bergmann

Slide 70

Slide 70 text

Люди • Matthew Weier O’Phinney • Pádraic Brady • Anthony Ferrara • Nikita Popov • Chris Hartjes

Slide 71

Slide 71 text

No content