Функция count() PHP 7.2 не работает

У меня есть рабочее приложение php, и оно отлично работает на версии php 7.0. Но когда я обновляю версию php до 7.2. Я получаю эту ошибку:

count(): Parameter must be an array or an object that implements Countable

Я получаю ошибки в коде, где я сравниваю свои данные с функцией подсчета. Например, это мой код:

$keytest = KeyUser::where('key', '=', $key)->first();
 if (count($keytest) == 1) {
   //logic ... 
  }

Я использую laravel, где я запускаю запрос и считаю его, если он равен 1, тогда логика должна работать.

Итак, моя проблема в том, что я написал такую ​​логику на многих контроллерах, и если мне придется менять все один за другим, это может стать кошмаром. Итак, есть ли способ, где я могу написать глобальную функцию, чтобы заставить работать счетчик, как он работал в более старой версии php. Что может быть проще всего исправить.


person Community    schedule 03.06.2018    source источник
comment
Это логично. Сначала возвращает объекты. Вы должны использовать метод get() для получения массива   -  person Sakezzz    schedule 03.06.2018
comment
попробуйте выполнить var_dump($keytest) и проверьте, какой тип возвращается для $keytest   -  person 5eeker    schedule 03.06.2018
comment
Я могу это сделать, но мне нужно изменить весь код. Мой вопрос: можем ли мы написать любую глобальную функцию, чтобы сделать ее работоспособной, мое приложение очень большое.   -  person    schedule 03.06.2018
comment
github.com/yiisoft/yii/issues/4167 php внес изменения в функцию подсчета I нужно решение, чтобы заставить его работать.   -  person    schedule 03.06.2018
comment
На самом деле это доказуемо: 3v4l.org/MFVQC -- очень интересно, если честно. Я думаю, вы могли бы написать свою собственную функцию count(), которая проверяет is_object() и возвращает 1 в этом случае, не выдавая ошибку. И после этой проверки вы выполняете старый вызов count(). Но я понятия не имею, можно ли переопределить встроенные функции самого языка, поэтому вам может потребоваться обновить все ссылки на функцию.   -  person Namoshek    schedule 03.06.2018
comment
О, я забыл: хотя это не кажется хорошей идеей. В будущем наверняка будут какие-то wtf-моменты, если вы сделаете это (либо вами, либо другими людьми, которые подберут ваш код). Возможно, подсчитайте свой код, чтобы узнать, как часто вы использовали count() (неправильно) — возможно, стоит исправить случаи по-другому.   -  person Namoshek    schedule 03.06.2018
comment
Следуйте последним стандартам. Что касается поведения до PHP 7.2, все, что вы ожидаете от своего кода, это проверка того, является ли результат ($keytest) null или нет. Вы должны использовать if (!is_null($keytest)) {/* code */}.   -  person Tpojka    schedule 03.06.2018


Ответы (3)


Эту проблему можно решить, отключив обработку ошибок. Пожалуйста, обратитесь к этой ссылке для решения: Laravel несовместим с php 7.2

Здесь я нашел решение вашей проблемы, просто напишите этот код внутри вашего контроллера или, если вы хотите, чтобы он работал для всего приложения, напишите этот код в route.php:

 //app/Http/routes.php

 if (version_compare(PHP_VERSION, '7.2.0', '>=')) {
// Ignores notices and reports all other kinds... and warnings
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
// error_reporting(E_ALL ^ E_WARNING); // Maybe this is enough
}

Я знаю, что это не лучшее решение, но это может быть хороший хак.

person Nilay Singh    schedule 03.06.2018
comment
Спасибо за это решение, оно сработало, все мои предупреждения исчезли. - person ; 03.06.2018
comment
Остерегаться! Обработка проблемы путем отключения отчетов об ошибках — это всего лишь ВЕРОЯТНОЕ РЕШЕНИЕ, а не РЕШЕНИЕ. Пожалуйста, перестаньте вводить в заблуждение новичков, которым нужно понять реальную проблему. Обходные пути не являются решением! Правильным решением является использование хорошо написанных библиотек/фреймворков, которые не взрываются при обновлении младших версий, по крайней мере, адаптируются в разумные сроки. Передача произвольных переменных/типов в нативную функцию count() всегда была проблемой дизайна, даже до выпуска PHP 7, но блестящие сопровождающие игнорировали ее, пока не пришло настоящее предупреждение. - person edigu; 02.03.2019

Это решается, когда вы меняете свой код:

$keytest = KeyUser::where('key', '=', $key)->first();
if ($keytest) {
   //logic ... 
}
person Khotibul Umam    schedule 07.08.2018

Попробуйте использовать это Вместо count вы можете использовать функцию empty для проверки содержимого. Например: Вместо:

if ( count( $data ) ) 

Использовать:

if ( ! empty( $data ) )
person Ephra    schedule 24.09.2020