В PHP, который имеет динамическую типизацию, мы можем создавать функции, которые могут принимать несколько типов данных в качестве параметров. Затем мы можем работать с данными в зависимости от типа переменной. Есть два способа сделать это:
Первый подход:
function doSomething1($param) {
$type = gettype($param);
if ($type === 'string') {
// do something
}
else if ($type === 'integer') {
// do something
}
else if ($type === 'array') {
// do something
}
}
Подход второй:
function doSomething2($param) {
if (is_string($param)) {
// do something
}
else if (is_int($param)) {
// do something
}
else if (is_array($param)) {
// do something
}
}
Насколько я знаю, эти два подхода функционально эквивалентны с точки зрения тестирования, но поскольку в PHP так много подводных камней, я должен спросить, есть ли что-то, что я мог бы упустить, если бы предпочел один подход другому?
С точки зрения производительности, правильно ли говорить, что один подход быстрее, чем два, потому что PHP вызовы функций стоят дорого? Или
gettype()
гораздо более дорогая операция, чем отдельныеis_*()
функции?Есть ли какие-либо идиомы/руководства по стилю кодирования по этому поводу?
Обновление Из моего теста с использованием PHP 7.0.4 миллион итераций doSomething2()
занял 159 мс, что чуть меньше половины времени doSomething1()
(315 мс). Это было независимо от того, была ли передана строка (первая проверка) или массив (последняя проверка). Это, кажется, предполагает, что gettype()
действительно является дорогостоящей операцией и более дорогой, чем вызовы нескольких функций с использованием is_*()
.
Любой, кто лучше понимает, почему это может быть, ваша помощь приветствуется.
is_*
ожидаемо медленнее, чем 159 мс дляgettype
. - person deceze♦   schedule 08.04.2016