Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Epic PHP #8

Roma
March 24, 2014

Epic PHP #8

Слайды к восьмому занятию курса Epic PHP (http://epixx.ru/epic-php/).
Темы: closures, cron, Silex, советы

Roma

March 24, 2014
Tweet

More Decks by Roma

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

  3. View Slide

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

    View Slide

  5. 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);

    View Slide

  6. 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

    );

    View Slide

  7. Присвоение
    переменной
    $greet = function($name)

    {

    printf("Hello %s\r\n", $name);

    };

    var_dump($greet);

    $greet('World');

    View Slide

  8. Анонимные функции
    • функции без указания конкретного
    имени

    • внутренний класс Closure самим создать
    нельзя

    View Slide

  9. 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);

    }

    View Slide

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

    View Slide

  11. View Slide

  12. create_function
    $av = array("the ", "a ", "that ", "this ");

    array_walk($av, create_function('&$v,$k', '$v = $v . "mango";'));

    print_r($av);

    View Slide

  13. Задание
    Дан массив вида:

    $data = array(

    array('id' => 1, 'name' => 'Bob', 'position' => 'Clerk'),

    array('id' => 2, 'name' => 'Alan', 'position' => 'Manager'),

    );

    !
    Используя функцию array_map и анонимную функцию, создайте
    массив, состоящий только из имен (поле name).

    View Slide

  14. Задание
    Дан массив вида:

    $data = array(

    array('date' => 'tomorrow', 'title' => 'World'),

    array('date' => 'today', 'title' => 'Hello'),

    );

    !
    Используя функцию uasort и анонимную функцию, отсортируйте
    массив по возрастанию значения даты.

    View Slide

  15. Cron

    View Slide

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

    View Slide

  17. Cron
    # crontab -e

    00 * * * * php /home/john/myscript.php

    */10 * * * * wget -q -O temp.txt http://www.thegeekstuff.com/myscript.php

    View Slide

  18. Cron

    View Slide

  19. Фреймворки

    View Slide

  20. View Slide

  21. Full-stack Frameworks
    • Symfony2

    • Zend Framework

    • Laravel

    • Yii

    • Lithium

    View Slide

  22. View Slide

  23. View Slide

  24. Micro Frameworks
    • Fat-Free

    • MicroMVC

    • Silex

    • Slim

    View Slide

  25. Silex

    View Slide

  26. 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();

    View Slide

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

    View Slide

  28. Установка
    composer.json:

    !
    {

    "require": {

    "silex/silex": "~1.1"

    }

    }

    !
    composer.phar install

    View Slide

  29. Структура
    ├── composer.json

    ├── composer.lock

    ├── vendor

    │ └── ...

    └── web

    └── index.php

    View Slide

  30. Bootstrap
    // web/index.php

    !
    require_once __DIR__.'/../vendor/autoload.php';

    !
    $app = new Silex\Application();

    $app['debug'] = true;

    !
    // definitions

    !
    $app->run();

    View Slide

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

    ...

    });

    View Slide

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

    ...

    });

    View Slide

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

    ...

    });

    View Slide

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

    ...

    });

    View Slide

  35. 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);

    });

    View Slide

  36. Errors
    use Symfony\Component\HttpFoundation\Response;

    !
    $app->error(function (\Exception $e, $code) {

    return new Response(

    'We are sorry, but something went terribly wrong.'

    );

    });

    View Slide

  37. Redirect
    $app->get('/', function () use ($app) {

    return $app->redirect('/hello');

    });

    View Slide

  38. 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);

    });

    View Slide

  39. Escaping
    $app->get('/name', function (Silex\Application $app) {

    $name = $app['request']->get('name');

    return "You provided the name {$app->escape($name)}.";

    });

    View Slide

  40. Templates
    $app->register(new Silex\Provider\TwigServiceProvider(), array(

    'twig.path' => __DIR__.'/views',

    ));

    View Slide

  41. Templates
    $app->get('/hello/{name}', function ($name) use ($app) {

    return $app['twig']->render('hello.twig', array(

    'name' => $name,

    ));

    });

    View Slide

  42. Templates






    hello, {{ name }}!


    View Slide

  43. 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',

    ),

    ),

    );

    View Slide

  44. 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']}";

    });

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  48. Регулярки

    $password = "Fyfjk34sdfjfsjq7";

    !
    if (preg_match("/^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$/", $password))
    {

    echo "Your passwords is strong.";

    } else {

    echo "Your password is weak.";

    }

    View Slide

  49. Функции
    • preg_match

    • preg_match_all

    • preg_replace

    • preg_split

    View Slide

  50. Регулярки

    preg_replace("/([Cc]opyright) 200(3|4|5|6)/", "$1 2007", "Copyright 2005");

    View Slide

  51. Регулярки

    $keywords = preg_split("/[\s,]+/", "php, regular expressions");

    print_r( $keywords );

    View Slide

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

    • http://regexpal.com/

    • http://refiddle.com/

    View Slide

  53. Полезное

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  57. Things to learn

    View Slide

  58. Тестирование
    • PHPUnit

    • Behat & Mink

    • PHPSpec

    View Slide

  59. Продвинутые фичи
    • Reflection API

    • Traits

    • SPL Interfaces & Exceptions

    View Slide

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

    View Slide

  61. XDebug
    Единственный и лучший отладчик для PHP.

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

    View Slide

  62. Master your editor
    • Sublime Text

    • PHPStorm

    • other IDEs: Eclipse, NetBeans

    • vim (http://vim-adventures.com/)

    View Slide

  63. Deployment
    • Phing

    • Capistrano (Capifony for Symfony)

    • Bash-scripts

    • Хотя бы через git

    View Slide

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

    View Slide

  65. Bytecode Cache
    • APC

    • XCache

    • Zend Optimizer+ (часть Zend Server)

    • WinCache (расширение для MS Windows
    Server)

    View Slide

  66. Кэширование данных
    $data = apc_fetch('expensive_data');

    if ($data === false) {

    apc_add('expensive_data', $data = get_expensive_data());

    }

    !
    print_r($data);

    View Slide

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

    • Memcached

    • Redis

    View Slide

  68. Люди

    View Slide

  69. Люди
    • Rasmus Lerdorf

    • Fabien Potencier

    • Derick Rethans

    • Chris Shiflett

    • Sebastian Bergmann

    View Slide

  70. Люди
    • Matthew Weier O’Phinney

    • Pádraic Brady

    • Anthony Ferrara

    • Nikita Popov

    • Chris Hartjes

    View Slide

  71. View Slide