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

Epic PHP #8

101b5adab18a468a3dfe63f77980ccb9?s=47 Roma
March 24, 2014

Epic PHP #8

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

101b5adab18a468a3dfe63f77980ccb9?s=128

Roma

March 24, 2014
Tweet

Transcript

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

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

  3. None
  4. Анонимные функции Анонимные функции, также известные как замыкания (closures), позволяют

    создавать функции, не имеющие определенных имен. Они наиболее полезны в качестве значений callback-параметров, но также могут иметь и множество других применений.
  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);
  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 );
  7. Присвоение переменной $greet = function($name) { printf("Hello %s\r\n", $name); };

    var_dump($greet); $greet('World');
  8. Анонимные функции • функции без указания конкретного имени • внутренний

    класс Closure самим создать нельзя
  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); }
  10. Терминология — отстой Есть лямбда-функции, есть замыкания. Все это объединяется

    понятием «анонимные функции». Лямбду называют замыканием, если она использует переменные родительской функции после отработки последней (т.е. замыкает эти переменные на себя).
  11. None
  12. create_function $av = array("the ", "a ", "that ", "this

    "); array_walk($av, create_function('&$v,$k', '$v = $v . "mango";')); print_r($av);
  13. Задание Дан массив вида: $data = array( array('id' => 1,

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

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

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

    час. Как мне это сделать?
  17. Cron # crontab -e 00 * * * * php

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

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

  20. None
  21. Full-stack Frameworks • Symfony2 • Zend Framework • Laravel •

    Yii • Lithium
  22. None
  23. None
  24. Micro Frameworks • Fat-Free • MicroMVC • Silex • Slim

  25. Silex

  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();
  27. Установка http://silex.sensiolabs.org/download

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

    ! composer.phar install
  29. Структура ├── composer.json ├── composer.lock ├── vendor │ └── ...

    └── web └── index.php
  30. Bootstrap // web/index.php ! require_once __DIR__.'/../vendor/autoload.php'; ! $app = new

    Silex\Application(); $app['debug'] = true; ! // definitions ! $app->run();
  31. Routes $app->get('/blog/{id}', function ($id) { ... });

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

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

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

    });
  35. Routes use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; ! $app->post('/feedback', function (Request $request)

    { $message = $request->get('message'); mail('feedback@yoursite.com', '[YourSite] Feedback', $message); ! return new Response('Thank you for your feedback!', 201); });
  36. Errors use Symfony\Component\HttpFoundation\Response; ! $app->error(function (\Exception $e, $code) { return

    new Response( 'We are sorry, but something went terribly wrong.' ); });
  37. Redirect $app->get('/', function () use ($app) { return $app->redirect('/hello'); });

  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); });
  39. Escaping $app->get('/name', function (Silex\Application $app) { $name = $app['request']->get('name'); return

    "You provided the name {$app->escape($name)}."; });
  40. Templates $app->register(new Silex\Provider\TwigServiceProvider(), array( 'twig.path' => __DIR__.'/views', ));

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

    'name' => $name, )); });
  42. Templates <html> <head></head> <body> <div>hello, {{ name }}!</div> </body>

  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', ), ), );
  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 "<h1>{$post['title']}</h1>". "<p>{$post['body']}</p>"; });
  45. Регулярные выражения

  46. Регулярки Регулярные выражения (англ. regular expressions, сокр. RegExp, RegEx, жарг.

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

    сути это мини-язык для описания и парсинга текста.
  48. Регулярки <?php $password = "Fyfjk34sdfjfsjq7"; ! if (preg_match("/^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$/", $password)) {

    echo "Your passwords is strong."; } else { echo "Your password is weak."; }
  49. Функции • preg_match • preg_match_all • preg_replace • preg_split

  50. Регулярки <?php preg_replace("/([Cc]opyright) 200(3|4|5|6)/", "$1 2007", "Copyright 2005");

  51. Регулярки <?php $keywords = preg_split("/[\s,]+/", "php, regular expressions"); print_r( $keywords

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

  53. Полезное

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

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

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

    страницу можно получать с помощью любой файловой функции или CURL.
  57. Things to learn

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

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

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

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

    кода и контролировать содержимое вашего стэка. Интегрируется с большинством IDE с возможностью установки breakpoint’ов.
  62. Master your editor • Sublime Text • PHPStorm • other

    IDEs: Eclipse, NetBeans • vim (http://vim-adventures.com/)
  63. Deployment • Phing • Capistrano (Capifony for Symfony) • Bash-scripts

    • Хотя бы через git
  64. Bytecode Cache Во время исполнения PHP файла, под капотом он

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

    Zend Server) • WinCache (расширение для MS Windows Server)
  66. Кэширование данных $data = apc_fetch('expensive_data'); if ($data === false) {

    apc_add('expensive_data', $data = get_expensive_data()); } ! print_r($data);
  67. Кэширование данных • Функции APC • Memcached • Redis

  68. Люди

  69. Люди • Rasmus Lerdorf • Fabien Potencier • Derick Rethans

    • Chris Shiflett • Sebastian Bergmann
  70. Люди • Matthew Weier O’Phinney • Pádraic Brady • Anthony

    Ferrara • Nikita Popov • Chris Hartjes
  71. None