Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Всегда используйте in_array в strict режиме


Recommended Posts

Почти час убил в выходной день чтобы найти причину очень странного бага.. оказалось что это баг самого PHP, который исправили только в версии 8! 
и вот такой простейший код

$arr = array(46160);
var_dump(in_array("46160G", $arr));

вернет true для версий PHP вплоть до 7.4.33 и false с версии 8.0 и выше:

1906531712_2023-06-2514-11-02.thumb.png.b21d0595a664bb84c38607686460d342.png


но в strict режиме

$arr = array(46160);
var_dump(in_array("46160G", $arr, true));

все работает корректно и во всех версиях получаем false

308730966_2023-06-2514-10-42.thumb.png.c0a5cac061bb592b0941973b49441316.png

Надіслати
Поділитися на інших сайтах

Цитата

If not absolutely certain of the types of values involved, always use the strict flag to avoid unexpected behavior.

Так написано же.

Надіслати
Поділитися на інших сайтах

25.06.2023 в 15:36, chukcha сказал:

Так написано же.

А вы конечно же на память знаете всю документацию по PHP и что написано для каждой функции и как она себя ведёт в каждой версии PHP, ага, конечно :)

Да и по поводу 

Цитата

If not absolutely certain of the types of values involved

Как вообще можно быть абсолютно уверенным в типе переменной если весь язык слабо типизированный и сам может изменить тип? То есть по сути это ни что иное как баг, который исправили только в 8 версии языка. 

  • +1 1
Надіслати
Поділитися на інших сайтах

25.06.2023 в 17:09, sv2109 сказал:

А вы конечно же на память знаете всю документацию по PHP

Нет, конечно.
Но имея представления о видах сравнения и возвращаемых значений - каждый раз проверяю документацию
научен  strpos )))

Надіслати
Поділитися на інших сайтах

25.06.2023 в 17:09, sv2109 сказал:

и сам может изменить тип?


У вас получился массив целых чисел
и проверяется целое(элемент массива)  и параметр, который приводится к типу элемента массива.

Надіслати
Поділитися на інших сайтах

25.06.2023 в 17:17, chukcha сказал:

У вас получился массив целых чисел

так в том то и дело что я думал, что там текст, а не число, ведь этот массив это массив товара из опенкарта и в примере это данные из поля SKU что является текстом в базе и работаю я с этим полем как с текстом, что логично, но на каком-то этапе PHP сам изменил тип на число, потому что содержание было похоже на число.. и там вместо текста оказалось число в некоторых случаях. И получается что код в общем работает нормально, а в некоторых случаях - не работает.. 
Мне вот только что стало интересно докопаться до причины где именно это произошло, нашел. 
Вот такой код 
 

$text = "123456";
var_dump($text);

$arr = array();

$arr[$text] = "value";

var_dump(array_keys($arr));

 

вернет вот такой результат
 

string(6) "123456"
array(1) {
  [0]=>
  int(123456)
}

 

то есть, при добавлении нового элемента массива PHP изменяет тип ключа массива на число если в переменной находится строка, которая похожа на число.. Ну вот, короче, все прелести слабой типизации.. 
 

Надіслати
Поділитися на інших сайтах

25.06.2023 в 23:11, spectre сказал:

ну, теперь пэхэпэ точно умрет)

Где я это написал? Или у вас какая-то паранойя по этому поводу? 

Надіслати
Поділитися на інших сайтах

26.06.2023 в 10:53, sv2109 сказал:

Где я это написал? Или у вас какая-то паранойя по этому поводу? 

 

у меня паранойя по поводу что люди юмор перестают понимать) 

  • +1 4
Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.