strpos неожиданно дает сбой

Вопрос, почему следующее выполнило эхо:

$str = "Hello World";

if (strpos($str, 'He') !== false) {
    echo 'GOOD';
}

Но это не так:

$str = "Hello World";

if (strpos($str, 'He') === true) {
    echo 'GOOD';
}

Разве эти два условия не эквивалентны в том смысле, что они оба проверяют, является ли возвращаемое значение логическим значением, для которого установлено значение true? Разве !== false не то же самое, что === true, а если нет, то почему?

Я ценю разъяснение.


person AnchovyLegend    schedule 02.01.2014    source источник
comment
Целью strpos является возврат не логического значения, а индекса в случае успеха.   -  person mario    schedule 03.01.2014


Ответы (2)


Нет, они не эквивалентны:

strpos() возвращает либо логическое значение FALSE (если не найдено), либо целое число значение смещения (которое может быть 0, если найдено со смещением 0 и т. д.), но оно никогда не возвращает логическое значение TRUE. т. е. логическое TRUE !== INT.

person Mark Baker    schedule 02.01.2014
comment
Спасибо за разъяснения! - person AnchovyLegend; 03.01.2014
comment
Вы можете протестировать isnumeric(strpos(...)) или is_int(strpos(...)), но это менее эффективно, чем простое тестирование !== false. - person Mark Baker; 03.01.2014
comment
Я подумал, что это не оптимально, поэтому я отредактировал свой ответ. Благодарю вас! - person AnchovyLegend; 03.01.2014

Оператор === сравнивает не только значение, но и тип данных. Если strpos находит подстроку, она возвращает позицию типа int. Поскольку это не логическое значение, условие не выполняется.

person Lukaj    schedule 02.01.2014