Pull to refresh

Comments 10

На самом деле можно не использовать массив типов, а просто сравнивать 1 и 2 слова — я использовал это в таком виде. По хорошему конечно на продакшне такую штуку держать конечно же не стоит, а на тестах — крайне полезно.
Проблема в том, что просто сравнить не всегда получится, например в случае bool, boolean и int, integer. Проблема в том, что PHP по сути имеет несколько алиасов для определения одно и того же типа — поэтому массив. А в принципе — я с вам согласен и тоже сначала так сделал. Потом столкнулся с описанным выше и все-таки ввел массив :)
Просто используйте то же, что и сам php — всё кроме int и bool =)
Там еще несоответствие у чисел с плавающей точкой, они в ошибке отображаются как double, хотя более расхожее название этого типа данных в php — float, с другой стороны альясы и на double есть, и на real, при желании можно использовать и double.
Вы уверены, что не допустили ошибок при написании тестов? Во-первых, насколько я помню, приоритет у конкатенации такой же, как у сложения и у вычитания, а потому:
echo 'With Typehint: ' . $end - $start . ' sec.';
исходя из ассоциативности, превращается в
echo (('With Typehint: ' . $end) - $start) . ' sec.';
на что получаем неожиданный результат…
И ещё функцию test два раза определили.
Букву «u» пропустили:
private function __constrct() {}
И ещё, раз уж используете PHP5, то используйте первый аргумент get_as_float у функции microtime.

По теме: больше половины времени отжирает preg_match, мне удалось немного ускорить ваш код, заменив:
if (preg_match( '/^Argument \d+ passed to .*? must be an instance of (\w+), (\w+) given/', $msg, $m)) {
return (isset( self::$_types[$m[1]]) && self::$_types[$m[1]] == $m[2]);
}

на
if ($lvl == E_RECOVERABLE_ERROR && strstr($msg, 'must be an instance of') !== false) {
$errmsg = explode(' ', $msg, 13);
return isset(self::$_types[$errmsg[10]]) && self::$_types[$errmsg[10]] == $errmsg[11];
}


и
private static $_types = array(
'boolean' => 'boolean',
'bool' => 'boolean',
'integer' => 'integer',
'int' => 'integer',
'float' => 'float',
'string' => 'string',
'resource' => 'resource'
);

на
private static $_types = array(
'boolean,' => 'boolean',
'bool,' => 'boolean',
'integer,' => 'integer',
'int,' => 'integer',
'float,' => 'float',
'string,' => 'string',
'resource,' => 'resource'
);
Безусловно, благодарю за замечания, только я не понял последний ваш пункт с массивами…
а, все понял уже :)
Кстати, u в конструктори — это еще ошибка от Дэниэля :)

Вот она сила копи-паста :)
Насчет самой темы топика, сам по такому-же принципу разгонял исходный вариант Дэниэля — но всеже, несмотря на все прелести четкого объявления типов данных, решил себе в этом отказать :) Именно потому что на продакшене это будет неуместно, нефиг привыкать к хорошему :) Тут даже больше не в скорости вопрос, а в костылеобразности решения.
[offtop] Я Вам советую использовать параметр для функции microtime(), а именно:

microtime( true )

и тогда не придется писать функции-обертки, типа micro_time()
Читайте маны: ru2.php.net/manual/ru/function.microtime.php
Sign up to leave a comment.

Articles