5 полезных примеров использования PHP

1. Генерируем CSV

Часто в разных проектах встречаются попытки конвертировать многоразмерный массив данных в CSV с помощью подобного кода:

<?php $csv = «»; foreach ($data as $row) { $csv .= join(«,», $row) . «n»; } echo $csv;

Проблема заключается в том, что отдельные элементы не обрабатываются корректно. Значения с кавычками или запятой могут могут проскочить через дешифратор и позже распознаваться как данные CSV формата.  Существенно лучше будет использовать встроенную функцию fputcsv(). Она должна выполняться быстрее, так как реализована на С, и обрабатывает все необходимые кавычки и разделители.

Следующий код представляет логику для построения потока вывода в формате CSV из массива данных. Опциональные параметры служат для указания заголовков столбцов и определения цели потока данный CSV — непосредственно браузер или строка.  Поток данных обрабатывается с помощью функции fputcsv() для которой требуется дескриптор открытого файла.

<?php function toCSV(array $data, array $colHeaders = array(), $asString = false) { $stream = ($asString) ? fopen(«php://temp/maxmemory», «w+») : fopen(«php://output», «w»); if (!empty($colHeaders)) { fputcsv($stream, $colHeaders); } foreach ($data as $record) { fputcsv($stream, $record); } if ($asString) { rewind($stream); $returnVal = stream_get_contents($stream); fclose($stream); return $returnVal; } else { fclose($stream); } }

С помощью функции toCSV() генерирование  данных a формате CSV будет простым и надежным процессом.

 

2. Автозагрузка классов

Файлы автозагружаемых классов обычно располагаются в общем месте. Но вам может не нравится раздутый каталог или тяжеловесные автозагрузчики, которые имеются в большинстве библиотек PHP, или есть желание использовать собственное решение. к счастью, возможно использовать собственный минимальный загрузчик, который будет соответствовать стандарту PSR-0.

Стандарт не описывает функционал, который должен обеспечивать совместимый с PSR-0 автозагрузчик (методы регистрации, опции конфигурации и так далее). Если он может автоматически находить определение класса по шаблону пути  <Имя производителя>(<Пространство имен>), то он соответствует PSR-0. Более того, нет жестких требований для директории шаблона <Имя производителя>. Дополнительным грузом большинства автозагрузчиков является соглашение о том, что нужно указывать расположение файлов в коде. Но в таком требовании нет необходимости, если просто используется директория в дереве включений PHP.

<?php spl_autoload_register(function ($classname) { $classname = ltrim($classname, «\»); preg_match(‘/^(.+)?([^\\]+)$/U’, $classname, $match); $classname = str_replace(«\», «/», $match[1]) . str_replace([«\», «_»], «/», $match[2]) . «.php»; include_once $classname; });

Магия данного кода заключается в использовании регулярного выражения, которое разделяет имя на составляющие части: имя класса попадет в $match[2], а в $match[1] будет содержаться название пространства имен (которое может быть и пустой строкой).

 

3. Разбор данных с фиксированной длиной с помощью функции unpack()

В современном мире, наполненном данными в формате XML и JSON, может показаться, что данные с фиксированной длиной вымерли…  что будет роковой ошибкой. существует большой объем данных, которые используют формат с фиксированной длиной: некоторые журнальные записи, MARC 21 (библиографическая информация), NACHA (финансовая информация), и тому подобное. Поэтому приходится беспокоиться о поддержке работы с таким данными.

Работа с данными в формате с фиксированной длиной относительно просто реализуется в языках программирования, подобных С. Так как после загрузки в память, данные выравниваются в соответствующие структуры. Но в динамических языках программирования, подобных PHP, работа с такими данными превращается в тяжкий труд, результатом которого часто становится появление следующего кода:

<?php // Разбор заголовка записи NACHA $row = fread($fp, 94); $header = array(); $header[«type»] = substr($row, 0, 1); $header[«priority»] = substr($row, 1, 2); $header[«immDest»] = substr($row, 3, 10); $header[«immOrigin»] = substr($row, 13, 10); $header[«date»] = substr($row, 23, 6); $header[«time»] = substr($row, 29, 4); $header[«sequence»] = substr($row, 33, 1); $header[«size»] = substr($row, 34, 3); $header[«blockFactor»] = substr($row, 37, 2); $header[«format»] = substr($row, 39, 1); $header[«destName»] = substr($row, 40, 23); $header[«originName»] = substr($row, 63, 23); $header[«reference»] = substr($row, 86, 8); print_r($header);

Такой код слишком громоздок и уязвим для глупых, трудно выявляемых ошибок индексов. Но ему есть альтернатива: функция unpack().

Описание функции unpack() гласит: “Распаковывает данные из бинарной строки в массив согласно заданному формату” и представляет несколько примеров использования для данных в бинарном формате. Не вполне очевидно, что данная функция может быть использована для работы с данными в формате с фиксированной длиной благодаря коду формата ‘A’, который представляет символ (любая строка является набором битов и байтов).

С помощью функции unpack() выше приведенный пример можно изменить следующим образом:

<?php // Разбор заголовка записи NACHA $row = fread($fp, 94); $header = unpack(«A1type/A2priority/A10immDest/A10immOrigin/» . «A6date/A4time/A1sequence/A3size/A2blockFactor/A1format/» . «A23destName/A23originName/A8reference», $row); print_r($header);

Строка формата в данном случае является серией кодов A, с указанием количества символов для соответствующего поля, и имени ключа для таблицы результата с разделением через слэш. Например, A6date соответствует 6 символам и будет доступно как $header[«date»].

 

4. Шаблоны HTML

В сообществе PHP постоянно идут споры о шаблонах. Все соглашаются с тем, нужно разделять HTML и PHP, но столкновения начинаются в вопросах использования библиотек шаблонизаторов, таких как Smarty или Twig. Одни говорят, что PHP сам по себе является шаблонизатором и выдвигают аргументы о дополнительном синтаксисе, скорости библиотек и так далее. Другие указывают на преимущества расширения функционала серверного языка программирования. Компромисом может стать использование минимума классов PHP для собственного шаблона HTML.

<?php class Template { protected $dir; protected $vars; public function __construct($dir = «») { $this->dir = (substr($dir, -1) == «/») ? $dir : $dir . «/»; $this->vars = array(); } public function __set($var, $value) { $this->vars[$var] = $value; } public function __get($var) { return $this->vars[$var]; } public function __isset($var) { return isset($this->vars[$var]); } public function set() { $args = func_get_args(); if (func_num_args() == 2) { $this->__set($args[0], $args[1]); } else { foreach ($args[0] as $var => $value) { $this->__set($var, $value); } } } public function out($template, $asString = false) { ob_start(); require $this->dir . $template . «.php»; $content = ob_get_clean(); if ($asString) { return $content; } else { echo $content; } } }

Представленный код не является полноценной системой для создания шаблонов. Это все лишь вспомогательный класс для сбора пар ключ/значение, к которым можно получить доступ во включённом файле, назначенном в качестве шаблона. Сначала в виде создаем экземпляр класса Template, которому можно передать имя директории для поиска последовательных файлов шаблона (для группировки связанных файлов). Затем определяем значения, которые будут заполнять шаблон, с помощью метода  set() или  свойств. Как только значения указаны, можно вызывать метод out()для формирования шаблона.

<?php $t = new Template(); // Устанавливаем значение для свойства $t->greeting = «Приветсвие»; // Устанавливаем значение с помощью метода set() $t->set(«number», 42); // Устанавливаем несколько значений с помощью метода set() $t->set(array( «foo» => «zip», «bar» => «zap» )); // Выводим шаблон $t->out(«mytemplate»);

Файл mytemplate.php для примера может иметь следующий вид:

<!DOCTYPE html> <html lang=»ru»> <head> <meta charset=»utf-8″> … </head> <body> <div role=»main»> <h1><?=$this->greeting;?></h1> … </div> </body> </html>

В файле шаблона имеется доступ ко всем значениям.

Второй параметр метода out() определяет возвращение содержания шаблона в виде строки, вместо передачи в браузер, что дает возможность использовать замещение в одном шаблоне результатами формирования другого.

 

5. Используем file_get_contents как альтернативу cURL

cURL — отличная библиотека для соединения через различные протоколы. Она имеет полноценный набор функций и может использовать для решения практически любой задачи коммуникации. Но основная часть каждодневного использования cURL в PHP связана с запросами HTTP GET и POST, и часто может быть легко заменена с помощью встроенных функций PHP.

Проблема использования cURL для запросов HTTP имеет два аспекта: 1) нужно устанавливать много опций, даже для простейшей транзакции; 2) она является расширением, которое может быть недоступно на сервере хостера.

file_get_contents() и stream_context_create() являются встроенными функциями PHP, доступными с версии 4.3. Они вместе могут быть использованы для выполнения большинства типов запросов, выполняемых через cURL.

Для основного запроса GET может использоваться сама функция file_get_contents():

<?php $html = file_get_contents(«http://example.com/product/42»);

Для запросов, когда нужно указать заголовок HTTP, можно создать содержание с помощью специального массива в функции stream_context_create() и передать результат в функцию file_get_contents().

<?php $context = stream_context_create(array( «http» => array( «method» => «POST», «header» => «Content-Type: multipart/form-data; boundary=—foorn», «content» => «—foorn» . «Content-Disposition: form-data; name=»myFile»; filename=»image.jpg»rn» . «Content-Type: image/jpegrnrn» . file_get_contents(«image.jpg») . «rn» . «—foo—» ) )); $html = file_get_contents(«http://example.com/upload.php», false, $context);

Выше приведенный пример показывает загрузку файла с помощью запроса POST с массивом содержания, в котором необходимая для транзакции информация формируется с помощью ключей  “method”, “header” и “content”.

При использовании функции file_get_contents() для сложных запросов, таких как загрузка файлов, может быть полезным создание макета веб формы и анализ процесса ее передачи на сервер с помощью инструментов разработчика (например, Firebug для Firefox), чтобы определить необходимые включения в заголовок запроса.

Источник: http://feedproxy.google.com/~r/ruseller/CdHX/~3/JkpEeIr_T8s/lessons.php

Источник: lred.ru

Оцените статью
новости для мужчин