ОК, так что я запустил тесты, так как с трудом мог поверить, что метод isset () быстрее, но да, и в значительной степени так. Метод isset () работает примерно в 6 раз быстрее.
Я пробовал со строками разных размеров и выполнял разное количество итераций; Соотношения остаются неизменными, а также, кстати, общая длина бега (для строк различного размера), потому что и isset (), и strlen () имеют значение O (1) (что имеет смысл - isset нужно только выполнить поиск в массив C, а strlen () возвращает только счетчик размеров, который хранится для строки).
Я посмотрел это в источнике php и думаю, что примерно понимаю почему. isset (), потому что это не функция, а языковая конструкция, имеет собственный код операции в виртуальной машине Zend. Следовательно, его не нужно искать в таблице функций, и он может выполнять более специализированный анализ параметров. Для тех, кто заинтересован, код находится в файле zend_builtin_functions.c для strlen () и zend_compile.c для isset ().
Чтобы связать это с первоначальным вопросом, я не вижу проблем с методом isset () с технической точки зрения; но имхо труднее читать людям, которые не привыкли к идиоме. Более того, метод isset () будет постоянным во времени, а метод strlen () будет иметь значение O (n) при изменении количества функций, встроенных в PHP. Это означает, что если вы собираете PHP и статически компилируете во многих функциях, все вызовы функций (включая strlen ()) будут выполняться медленнее; но isset () будет постоянным. Однако на практике эта разница будет незначительной; Я также не знаю, сколько таблиц указателей на функции поддерживается, поэтому, если пользовательские функции также оказывают влияние. Кажется, я помню, что они находятся в другой таблице и, следовательно, не имеют значения для этого случая, но прошло уже много времени с тех пор, как я в последний раз действительно работал с этим.
В остальном я не вижу никаких недостатков в методе isset (). Я не знаю других способов получить длину строки, если не учитывать целенаправленно извилистые, такие как explode + count и тому подобное.
Наконец, я также проверил ваше предложение об упаковке isset () в функцию. Это медленнее, чем даже метод strlen (), потому что вам нужен еще один вызов функции и, следовательно, другой поиск в хеш-таблице. Накладные расходы на дополнительный параметр (размер для проверки) незначительны; как и копирование строки, если она не передана по ссылке.