2014-01-02 3 views
2

вопрос, как пришел следующий выполнивший эхо:StrPos не удается неожиданно

$str = "Hello World"; 

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

Но это вовсе не так:

$str = "Hello World"; 

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

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

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

+2

Цель 'strpos' - не возвращать логический, а индекс, если он преуспевает. – mario

ответ

8

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

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

+0

Спасибо за разъяснение! – AnchovyLegend

+1

Вы можете проверить для 'isnumeric (strpos (...))' или 'is_int (strpos (...))', но это менее результативно, чем просто тестирование для '! == false' –

+0

Я понял, что это не оптимально , вот почему я отредактировал свой ответ. Спасибо! – AnchovyLegend

0

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