Странности PHP

nigirma

Новичок
Заметил 2е непонятные для меня штуковины при программировании
1)
PHP:
$text = 'teeexxxt';
echo "Строка '$text' " . (($text == 0) ? '' : 'НЕ ') . 'равна нулю<br>';
Результат: Строка 'teeexxxt' равна нулю
ПОЧЕМУ она равна нулю??? Ведь ноль в строковой переменной близко не стоял.

2)
PHP:
$text = '3teeexxxt';
$array = array(1, 2, 3);
echo "Строка '$text' " . ((in_array($text, $array)) ? '' : 'НЕ ') . 'присутствует в массиве с числовыми значениями';
Результат: Строка '3teeexxxt' присутствует в массиве с числовыми значениями
ПОЧЕМУ???

Во втором случае я могу догадаться судя по описанию
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
Ищет в haystack значение needle. Если strict не установлен, то при поиске будет использовано нестрогое сравнение.
что тут не строгое соответствие... НО, обычно имеется ввиду несоответствие типов, а тут совсем другое значение!

Если же выполить код
PHP:
$text = 'teeexxxt';
$array = array(1, 2, 3);
echo "Строка '$text' " . ((in_array($text, $array)) ? '' : 'НЕ ') . 'присутствует в массиве с числовыми значениями';
То результат будет предсказуемым: Строка 'teeexxxt' НЕ присутствует в массиве с числовыми значениями
 

Absinthe

жожо
nigirma Это "прелести" слабой типизации.
Напрягает всех, но остается в целях обратной совместимости, появилось из шаблонизаторного прошлого.
 

Absinthe

жожо
Напрягает это только того, кто не понимает, что PHP -- язык 4-го поколения и работает с ним по-старинке.
Я думаю, автор спрашивал про актуальные версии PHP, которые 3 поколения.
 

wadim

Новичок
в первом и втором случае, php пытается строку перевести в целое и получается следующее:
PHP:
$text = 'teeexxxt';
echo "Строка '$text' " . ((intval($text) == 0) ? '' : 'НЕ ') . 'равна нулю<br>';
PHP:
$text = '3teeexxxt';
$array = array(1, 2, 3);
echo "Строка '$text' " . ((in_array((intval($text), $array)) ? '' : 'НЕ ') . 'присутствует в массиве с числовыми значениями';
по моему все ясно.
 

wadim

Новичок
опс, лишняя скобка:
PHP:
$text = '3teeexxxt';
$array = array(1, 2, 3);
echo "Строка '$text' " . ((in_array(intval($text), $array)) ? '' : 'НЕ ') . 'присутствует в массиве с числовыми значениями';
 
Сверху