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=--foo\r\n", "content" => "--foo\r\n" . "Content-Disposition: form-data; name=\"myFile\"; filename=\"image.jpg\"\r\n" . "Content-Type: image/jpeg\r\n\r\n" . file_get_contents("image.jpg") . "\r\n" . "--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
Дайджест новых статей по интернет-маркетингу на ваш email
Новые статьи и публикации
- 2024-11-26 » Капитан грузового судна, или Как начать использовать Docker в своих проектах
- 2024-11-26 » Обеспечение безопасности ваших веб-приложений с помощью PHP OOP и PDO
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-15 » Перенос сайта на WordPress с одного домена на другой
- 2024-11-08 » OSPanel 6: быстрый старт
- 2024-11-08 » Как установить PhpMyAdmin в Open Server Panel
- 2024-09-30 » Как быстро запустить Laravel на Windows
- 2024-09-25 » Next.js
- 2024-09-05 » OpenAI рассказал, как запретить ChatGPT использовать содержимое сайта для обучения
- 2024-08-28 » Чек-лист: как увеличить конверсию интернет-магазина на примере спортпита
- 2024-08-01 » WebSocket
- 2024-07-26 » Интеграция с Яндекс Еда
- 2024-07-26 » Интеграция с Эквайринг
- 2024-07-26 » Интеграция с СДЕК
- 2024-07-26 » Интеграция с Битрикс-24
- 2024-07-26 » Интеграция с Travelline
- 2024-07-26 » Интеграция с Iiko
- 2024-07-26 » Интеграция с Delivery Club
- 2024-07-26 » Интеграция с CRM
- 2024-07-26 » Интеграция с 1C-Бухгалтерия
- 2024-07-24 » Что такое сторителлинг: техники и примеры
- 2024-07-17 » Ошибка 404: что это такое и как ее использовать для бизнеса
- 2024-07-03 » Размещайте прайс-листы на FarPost.ru и продавайте товары быстро и выгодно
- 2024-07-01 » Профилирование кода в PHP
- 2024-06-28 » Изучаем ABC/XYZ-анализ: что это такое и какие решения с помощью него принимают
- 2024-06-17 » Зачем вам знать потребности клиента
- 2024-06-11 » Что нового в работе Яндекс Метрики: полный обзор обновления
- 2024-06-11 » Поведенческие факторы ранжирования в Яндексе
- 2024-06-11 » Скорость загрузки сайта: почему это важно и как влияет на ранжирование
Всегда храни верность своему начальнику - следующий, может быть еще хуже... |
Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!
Как мы работаем
Заявка
Позвоните или оставьте заявку на сайте.
Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!
Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.
Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.
Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.