Нет, они не одинаковы (как описано выше), но для ваших целей они могут быть взаимозаменяемыми.
Быстрее? В качественном отношении трудно представить ситуацию, в которой разница в любом случае будет существенной, но можно увидеть другие более количественные ответы. Кодирование, основанное на скорости, здесь, вероятно, является примером нашего любимого уничижительного выражения, которое может быть сокращено до «пи».
Что лучше?
Это зависит от того, какое утверждение о $ str вы хотите подтвердить, и какие последствия вы хотите вызвать.
Другой распространенный шаблон, который вы увидите, -
! $ * Ул 1011 *
, который в целом дает тот же результат - и может быть уместным, если вы просто хотите проверить строковое значение, которое непригодно для использования, независимо от того, почему оно непригодно - это может быть отсутствие инициализации, инициализация по умолчанию, назначение и т. Д. Я не спорю за или против этого представления, кстати.) Помните, что то, что вы решите, предположительно будет иметь последствия, и вам нужно понять, какие состояния $ str вызывают какие последствия, основываясь на том, как вы написали код. (И обратите внимание, что есть значения / состояния $ str, которые вы, возможно, не указали явно ни в одном из наших вариантов.)