php
PHP: библиотека SPL
На сайте Blue Parabola появилась очень хорошая статья, объясняющая чем хороша библиотека SPL (Standard PHP Library). Даже если вы не читаете на английском, всё равно взгляните — там есть примеры кода.
«Обычное PHP-приложение»
Читаю Django Book (книга
In contrast, other Web development platforms couple the URL to the program. In typical PHP (https://www.php.net//) applications, for example, the URL of your application is designated by where you place the code on your filesystem.
Может мне
В итоге «обычные» (т. е. «встречающееся чаще других»)
P.S. ещё лингвисизм по отношению к PHP из той же книги:
If you’re experienced in another Web development platform, such as PHP or Java, you may be thinking, “Hey, let’s use a query string parameter!”, something like /time/plus?hours=3, in which the hours would be designated by the hours parameter in the URL’s query string (the part after the ?).
PHP для Windows Mobile
Немного посмотрел HPH, диалект PHP для Windows Mobile. Я о нём писал пару лет назад, а вот теперь посмотрел, коль скоро у меня устройство с WM6.1.
Что сказать? Это не PHP. Это
Если не называть это PHP, то вполне сносный язык, для… для… для чего же? Не знаю, может быть поднять персональные сервисы на нём, ту же Wiki, как пример. Не такая уж плохая идея, жаль только, что ничего готового под него не пойдёт: поддержки MySQL нет (но есть SQLite3!), список функций неполный. Но авторы всё равно молодцы и делают интерпретатор, кажется, для собственного удовольствия.
По сути, список поддерживаемых функций давно таков, что новые можно писать уже на самом HPH и включать как библиотеку, тем более, что реализации некоторых, самых важных, есть в PEAR модуле PHP_Compat.
PHP: мануалы читать необходимо
Я изучаю новый язык следующим образом: сначала всегда полностью читаю руководство (вот с «Пайтоном» мне не повезло — в руководстве, которое я выбрал, об itertools было упомянуто вскользь), потом уже пробую
Конечно, руководство полностью наизусть я не помню, но зато всегда помню, что
В свежей статье на «Хабре» — один из подобных велосипедов:
function uptime() {
$fp=@popen('uptime','r');
$s=@fgets($fp);
@fclose($fp);
@preg_match('#load average: ([0-9\.]+)#', $s, $m);
return $m[1];
};В этой статье вообще масса забавного: в разделе «временные припарки», где index.php заменили для снятия нагрузки,
PHP: compliler_halt_offset
Малоизвестная возможность PHP, появившаяся с версии 5.1 — аналог секции DOC из Perl. Позволяет создать специальную текстовую секцию в конце файла скрипта, откуда можно будет читать данные, например, туда можно поместить страницу помощи к программе
Секция начинается вызовом специальной конструкции __halt_compiler(), всё, что дальше этой строки интерпретатор не считывает и не выполняет. Смещение, по которому начинаются данные за конструкцией, доступно через константу __COMPILER_HALT_OFFSET__. Почему нельзя было сделать константу, указывающую на файловый ресурс (по аналогии с STDERR) для меня загадка.
Использовать можно, например, так:
echo file_get_contents(__FILE__, null, null, __COMPILER_HALT_OFFSET__);
// the end of the script execution
__halt_compiler();Hello, world!На печать программа выведет строку «Hello, world!».
Closures в PHP: подробности
Внимательно прочитав документ по замыканиям в PHP, я вынес для себя следующее. Патч работает очень просто и довольно изящно. Замыкания — это
class Example {
public function __invoke () {
echo "Hello World!\n";
}
}
$foo = new Example;
$foo ();Слово «use», которое появилось в полной версии создания функции — это, конечно, уже полностью новый синтаксис, а не просто косметические изменения. Для тех, кто не прочитал документ, поясняю, что анонимная функция может быть создана, например, так:
function getAdder($x) {
return function ($y) use ($x) {
// or: lexical $x;
return $x + $y;
}
}«Use» вытекает из идеологии PHP, где глобальные переменные не видны сразу внутри функции, а определяются программистом (тоже хаком, кстати). «Use» именно «доставляет» переменную. Причём не из глобального уровня, а с родительского уровня. Что (ура) реализует мою давнюю мечту об изоляции переменных.
Замыкания в PHP 5.3.0
В PHP 5.3.0 будут замыкания. Бог ты мой! Не прошло и 15 лет! Надеюсь, это будут действительно анонимные функции, хотя возможность замыкания сама по себе тоже значительное событие.
Напомню как сейчас обстоит дело в PHP с «анонимными» функциями. Сделаны они хаком, поэтому я их взял в кавычки. Каждый раз, когда вы вызываете create_function PHP создаёт функцию (в глобальной зоне видимости, других нет) «\0lambda_N», где N — номер по внутреннему счётчику PHP, а «\0» — символ с кодом ноль, чтобы пользователь не смог самостоятельно создать «анонимную» функцию с произвольным номером, иначе пришлось бы просматривать все фукции с определённым префиксом и искать в нём «дыры» в номерах.
В частности, это значит, что все «анонимные» функции доступны в глобальной зоне видимости и всегда берут оттуда «свежую» копию переменной, а не то значение, которое было на момент её создания (т. е. замыкания нет), самое же мерзкое, с моей точки зрения, что анонимными функциям сложно нормально пользоваться: в цикле их легко нашлёпать столько, сколько раз вызовется цикл, а вставив её в метод, получить столько функций, сколько раз вызван этот метод.
От последнего эффекта можно избавиться, используя статические переменный, но это варварский способ, да и многие программисты (даже среднего уровня) не подозревают об этих особенностях.
Habr, WTF?
Хабр не устаёт меня удивлять всё снижающимся качеством статей и кода. Ну вот что это:
if(strpos($name, 'fetchRowBy') === 0) {
array_unshift($arguments, substr($name, 10));
return call_user_func_array(array($this, 'fetchRowBy'), $arguments);
}Ещё бы регулярное выражение использовал,
WDDX в PHP и русские символы
У меня ощущение, что никто никогда не пробовал гонять национальные символы через WDDX из PHP в другие языки и обратно. Задача: получить от демона Perl сериализованные данные и десериализовать их. Был выбран формат WDDX, вроде как хорошо описанный стандарт и всё такое. JSON сначала не подошёл, модуль в Perl
Всё было хорошо, пока
В общем, оказалось, что
if (!strcmp(atts[i], EL_NAME) && atts[++i] && atts[i][0]) {
char *decoded;
int decoded_len;
decoded = xml_utf8_decode(atts[i], strlen(atts[i]), &decoded_len, "ISO-8859-1");
stack->varname = decoded;
break;
}Соответственно, когда PHP получает из Perl нормальный
В итоге, мы перешли на JSON. Всем хорошего дня.
Кодирование национальных символов в Cyrus IMAP
На днях пришлось столкнуться с кодированием русских символов в папках сервера Cyrus IMAP. Выглядит это примерно так:
folder.BC8EPQQ0BDUEOgRBBDAALQRBBDUEOgRABDUEQg-
Мне повезло, я догадался, что это модифицированная
// Cyrus IMAP modified UTF-7 decode
function decodeCyrus($str)
{
return preg_replace_callback('!&([a-z0-9+/=,]*)-!is', 'decodeCyrusHelper', $str);
}
function decodeCyrusHelper($m)
{
if ($m[1] == '') return '&';
return iconv('ucs-2be', 'utf-8', str_replace(',', '/', base64_decode($m[1])));
}Способ использования:
<?php
$decoded = decodeCyrus('folder.BC8EPQQ0BDUEOgRBBDAALQRBBDUEOgRABDUEQg-');PHP cURL и проблема HTTP/HTTPS запросов в nginx и lighttpd
У cURL есть неприятная, в некоторых случаях, особенность: при установке поля CURLOPT_POSTFIELDS, cURL устанавливает в заголовке «Expect:
Lighttpd выдаёт код ответа 417, а nginx (по крайней мере на HTTPS запросах) даёт паузу примерно в две секунды. Решение простое: убрать «Expect» из заголовков. В PHP это делается вот так:
curl_set_opt($connection, CURLOPT_HTTPHEADER, array('Expect:'));На поиск этого решения ушло полдня работы, так как мы не знали что именно вызывает проблему.
PHP SOAP
В режиме
Есть ещё nuSOAP (написанный на чистом PHP), но этот монстр занимает более полуметра. В общем, выкинул всё, взял cURL и SimpleXML. Сам запрос — 40 строк, ещё примерно столько же — разбор ответа через SimpleXML, меньше сотни строк. Так и живём.
Стандарты кодирования PHP
Друзья, ай нид хепл.
Какие документы по стандартам кодирования PHP (кроме PEAR) вы знаете?
SPL в PHP 5.3
В PHP 5.3 появился новый функционал в SPL: куча, стек, очередь и связанный список. Официальной документации по ним пока нет, но есть запись в блоге Lorenzo Alberton, на примерах показывающая что это такое и как этим пользоваться.
PHP 5.3.0 jumps to Basic
PHP: простой способ определения кодировки UTF-8
Придумал простой способ определения кодировки
if (preg_match('//u', $string)) { /* у вас UTF-8 */ }Работать должно, думаю, с версии PHP 4.3.5, в документации сказано:
NOWDOC в PHP 5.3.0
В PHP 5.3.0 появилась новая синтаксическая конструкция: «NOWDOC». Сильно похожа на «heredoc», но с тем различием, что в «nowdoc» нет интерполяции переменных:
Следующий пример выведет в точности тот текст, который находится внутри nowdoc:
echo <<<'EOT'
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': x41
EOT;Второе отличие от heredoc, что nowdoc можно использовать в любом статическом контексте, например так:
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
Чем быстрее всего отрезать строку в кодировке UTF-8
Решил протестировать — чем быстрее всего можно отрезать строку в кодировке
Я взял строку в 700
- хуже всех справилась реализация на чистом PHP — 0.34 сек
- получше — iconv_substr. 0.063 сек
- ещё лучше — mb_substr. 0.0175 сек
- лучше всех — preg_replace. 0.005 сек
Если кому интересно, вот моя функция по проходу по строке в кодировкеUTF-8:
$len = strlen($text);
for ($pos = $cutted = 0; $cutted < $cut && $pos < $len; ++$cutted)
{
$ch = ord($text[$pos]);
// multibyte char
if (0x80 & $ch)
{
for (; $ch & 0x80; ++$pos, $ch <<= 1);
}
else
{
$pos++;
}
}Итак, лучший способ отрезать первые $N символов
preg_replace('/^(.{'.$N.'}).*$/uSs', '$1', $text)Программисты на PHP — новые чукчи?
Мне кажется, про программистов на PHP скоро будут складывать анекдоты, как про чукчей. Посмотрите какой чудесный перл из конференции ru_php в ЖЖ:
Пытаюсь сконвертировать .doc файл в .txt , но php не понимает команды без точного объяснения:
$wf=fopen(«myfile.txt»,«w»); $i=0; $f=file(«laplap.doc»); while($i<10) { fwrite($wf,$f[$i]); $i++; } fclose($wf);
может есть другой способ? спасибо
Я очень боюсь поверить, что человек это пишет всерьёз.
PHP 5.3.0: Прощай .htaccess
Я уже достаточно давно работаю в конфигурации nginx + FastCGI PHP (без Apache в качестве backend). Это более эффективно — экономит память и система, в целом, более устойчива, производительна, легче в управлении (приходится конфигурировать один сервер, а не два). Единственное, чего нехватало — настройки PHP для определённого хоста (так называемые «Local Value» в phpinfo).
Так вот, в PHP 5.3.0 ситуация изменится:
— Improved php.ini handling: (Jani)
. Added «.htaccess» styleuser-defined php.ini files support for CGI/FastCGI
. Added support for special [PATH=/opt/httpd/www.example.com/] and [HOST=www.example.com] sections. Directives set in these sections can not be overriddenby user-defined ini-files or during runtime.
Этого мне нехватало куда больше, чем пространств имён и «?:», который там тоже появятся. По правде говоря, там есть ещё более значительное для меня изменение — Late Static Binding вкупе с __callstatic и $foo:myFunc(). Или даже «Improved PHP runtime speed and memory usage: Added garbage collector».