Эта тема на forum.dklab.ru


Юрий Насретдинов: Интересные способы записи частоиспользуемых вещей в одну строчку
Идея состоит в следующем: создать тему, в которую можно будет складывать некоторые оригинальные решения, которые позволяют записывать в одну строчку то, что часто используется, и обычно записывается в несколько строчек.

Начну:


/*
выполнение запроса и вывод сообщения об ошибке [очень старый трюк]
*/
mysql_query('INVALID QUERY') or die('MySQL Error: '.mysql_error()); // использование особенностей обработки «or»

/*
счётчик времени генерации страницы (3 строчки, но первая вставляется в начало, последняя - в конец, поэтому)
*/
define('START_TIME',array_sum(explode(' ',microtime())));
//содержимое страницы
echo '<div align="center">generation time: '.round(array_sum(explode(' ',microtime()))-START_TIME,4).' sec</div>'; // красивое использование функции array_sum

/*
обёртка вывода var_dump в теги <pre>
*/
echo '<pre>',var_dump($var),'</pre>'; // использование особенностей синтаксиса оператора echo (обратите внимание на запятые)

chin:
Легко узнаем расширение файла (из его имени)
$ext = ( ($dot_pos=strrpos($filename,".")) ? substr($filename,$dot_pos+1) : '' );
Допустим $filename = class.mysql.php
Результат: php
chin:
Пакование IP адреса в HEX строку для удобного хранения (длинна статична - 8 символов)
$encoded_ip = call_user_func_array('sprintf',array_merge(array('%02x%02x%02x%02x'),explode('.',$_SERVER['REMOTE_ADDR'])));
Распаковка
$decoded_ip = join('.',array_map('hexdec',explode('.',chunk_split($encoded_ip,2,'.'),4)));
Пример запакованного адреса (127.0.0.1): 7f000001
Ну уж не знаю, кто это руками будет писать.. Но функция полезная! ... и пишется в одну строку (:
Юрий Насретдинов:
Пакование IP адреса
http://php.net/ip2long, блин :))
34333333333333333:
Вопрос решен, тему можно закрыть.
Юрий Насретдинов:
А нужно ли это? )))
Давайте приведу все эти решения так, чтобы это было не в одну строку:


/* выполнение запроса */

if(!mysql_query('INVALID QUERY')) die('ERROR: '.mysql_error()); //менее наглядно, да ещё и с if'ом!

/* счётчик времени генерации страницы */

$tmp=explode(' ',microtime());
define('START_TIME',$tmp[0]+$tmp[1]);

//содержимое страницы

$tmp=explode(' ',microtime());
$gentime=START_TIME-$tmp[1]-$tmp[0];
echo '<div align="center">generation time: '.round($gentime,5).' sec</div>';

//две и даже 3 строчки, да ещё с использованием вспомогательной переменной! Ужас, если учесть, как часто нужно это проделывать, особенно для быстрого вывода генерации страницы

/* обёртка отладочного вывода в теги <pre> */
echo '<pre>';
var_dump($var);
echo '</pre>';

//целых 3 строчки, и главное - непонятно, для чего!

/* узнаем расширение файла */
$tmp=explode('.',$filename);
if(sizeof($tmp)==1) $ext='';
else $ext=$tmp[sizeof($tmp)-1];

//3 строчки, опять же непонятно, для чего!

/* пакуем IP-адрес :)) */

$packed=ip2long($_SERVER['REMOTE_ADDR']);
$unpacked=long2ip($packed);

//получается число (со знаком!), длина которого статична и вообще говоря в базе данных составляет 4 байта :)
//тут налицо явное незнание функций, предоставляемых самим PHP :)


Ну что, не убедил :)
Кухан:
Легко узнаем расширение файла (из его имени)
$ext = ( ($dot_pos=strrpos($filename,".")) ? substr($filename,$dot_pos+1) : '' );
Допустим $filename = class.mysql.php
Результат: php

...
/* узнаем расширение файла */
$tmp=explode('.',$filename);
if(sizeof($tmp)==1) $ext='';
else $ext=$tmp[sizeof($tmp)-1];

...

А чем вам pathinfo не угадил?
echo pathinfo('class.mysql.exe', PATHINFO_EXTENSION); // Выводит exe

P.S. Прочитав такие советы, вспомнил книгу Джона Коггзолла "PHP 5. Полное руководство".

За годы программистской практики автора на РНР одна вещь поражала его несколько раз — он изобретал колесо.
...
РНР содержит более 5 000 индивидуальных функций, включая огромную базу функций, классов и интерфейсов. Нет ничего более разочаровывающего, чем написать функцию, которая делает что-то полезное, только для того, чтобы в конце обнаружить, что ваша работа была напрасной. Если вы думаете, что в РНР должна быть определенная функция, то, скорее всего, она есть и должна быть использована. Помимо того, что она, вероятно, будет в большей степени свободна от ошибок, внутренние функции к тому же работают определенно быстрее, чем даже самые оптимизированные версии, написанные на РНР.

Programmer:

/* счётчик времени генерации страницы */

$tmp=explode(' ',microtime());
define('START_TIME',$tmp[0]+$tmp[1]);

//содержимое страницы

$tmp=explode(' ',microtime());
$gentime=START_TIME-$tmp[1]-$tmp[0];
echo '<div align="center">generation time: '.round($gentime,5).' sec</div>';

//две и даже 3 строчки, да ещё с использованием вспомогательной переменной! Ужас, если учесть, как часто нужно это проделывать, особенно для быстрого вывода генерации страницы

в php5 можно это сделать прямо-таки в несколько строк (-:

$t = microtime(true);
... code ...
print(microtime(true) - $t);

Юрий Насретдинов:
А чем вам pathinfo не угадил?
Кажется, раньше там второго параметра не было.

в php5 можно это сделать прямо-таки в несколько строк (-:
PHP5 сейчас далеко не у всех стоит. Интересует обратная совместимость.
34333333333333333:
Юpий Насрeтдинов
Ну ты же не собираешься оспаривать то, что оптимизация хороша в меру ;)
chin:
for($i = 0; $i < 100000; $i++) $ext = pathinfo('core.php', PATHINFO_EXTENSION); //1.0817 Sec, 296 bytes
for($i = 0; $i < 100000; $i++) $ext = ( ($dot_pos=strrpos('core.php',".")) ? substr('core.php',$dot_pos+1) : '' ); // 1.1678 Sec 304 bytes
Согласен (:
Advanced Guest:
chin
А насколько верны такие тесты? 0-100000? Строго говоря они же показывают какой код быстрее выполняется 100000 раз, а 1 раз ещё хз.
chin:
А насколько верны такие тесты? 0-100000? Строго говоря они же показывают какой код быстрее выполняется 100000 раз, а 1 раз ещё хз.
Нет, просто сразу видна разница. Если в 100000 раз второе на 0.1 секунду дольше - значит дольше в любом случае.
Advanced Guest:
А насколько верны такие тесты? 0-100000? Строго говоря они же показывают какой код быстрее выполняется 100000 раз, а 1 раз ещё хз.
Нет, просто сразу видна разница. Если в 100000 раз второе на 0.1 секунду дольше - значит дольше в любом случае.
0.1 секунды звучит конечно громко, но ведь по факту это 10% всего...

Эта тема на forum.dklab.ru