Artigo: Error PHP 7.2: count(): Parameter must be an array or an object that implements Countable - Gigasystems

Blog

Em por

error-php-7-2-count-parameter-must-be-an-array-or-an-object-that-implements-countable
Error PHP 7.2: count(): Parameter must be an array or an object that implements Countable

Se você está recebendo este erro em alguma função que funcionava normalmente e após atualizar sua versão do PHP para 7.2.x e ela te retorna a mensagem “PHP 7.2: count(): Parameter must be an array or an object that implements Countable”, seus problemas acabaram!

Traduzindo o erro, significa que “O parâmetro deve ser uma matriz ou um objeto que implemente Contábil”, ou seja, não nulo. Mas porque isso acontece somente com essa versão?

Nós desenvolvedores sempre sofremos com atualizações, descontinuações, etc. e nesse caso não é diferente. Foi alterada a lógica da função nativa count(), onde na versão do PHP 7.2 é preciso que o $array usado na função count($array) não pode ser um valor NULL.

Para corrigir esse problema é simples (rsrsrs... depois de sofrer 1 dia inteiro para resolver), basta você criar uma variável antes e setar ela com um valor, veja:

//ANTES
if (count($this->documents) == 0) {
	//seu código aqui…
}

//DEPOIS DO PHP 7.2.X
$pkCount = (is_array($this->documents) ? count($this->documents) : 0);
if ($pkCount == 0) {
	//seu código aqui...
}

Primeiro criamos e setamos uma variável e logo a seguir, testamos se ela é um array válido, se for, obtém a quantidade de itens no array, senão, setamos com um valor qualquer, no caso, usei 0 para continuar com a lógica normalmente como era.

Este problema começou a aparecer em testes de desenvolvimento de um e-commerce que estamos desenvolvendo, utilizando como forma de pagamento o PagSeguro, onde parou de funcionar do nada, e depois de vários testes, resolvi subir para hospedagem, sugerido pelo amigo Marcio Sales, e foi batata, lá como ainda estava com 5.6.x funcionava direitinho. Foi ai que resolvi procurar com calma aonde estava o problema e vi essa ressalva, onde coloquei em prática e resolveu o problema, funcionando agora na versão PHP 7.2.

Era isso ai pessoal, espero ter ajudado e lembre-se, o mesmo problema pode acontecer com a função sizeof(), por se tratar de um alias da função count().
 

Olá, deixe seu comentário para Error PHP 7.2: count(): Parameter must be an array or an object that implements Countable

Já temos 22 comentário(s). DEIXE O SEU :)
Felipe Vargas

Felipe Vargas

Quando se usa $array['valor'] ele não conta e retorna sempre 0, tem alguma solução?
★★★★★DIA 07.05.19 18h35RESPONDER
N/A
Enviando Comentário Fechar :/
Marcos Nunes

Marcos Nunes

Show Marcos... super dica!!!
★★★★★DIA 24.04.19 14h33RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Marcos Martins

Marcos Martins

Que bom que está ajudando várias pessoas e obrigado pelo feedback!!!

★★★★★DIA 24.04.19 15h59RESPONDER
N/A
Enviando Comentário Fechar :/
Gustavo Ribeiro

Gustavo Ribeiro

Bom dia Senhores,

Estou fazendo um carrinho de compras no meu primeiro projeto.. o carrinho funcionou puxando os dados na página vercarrinho.php, mas quando fui passar o código para esta máquina que estou, apresenta o erro deste tópico, estou com o mesmo problema usando a versão 7.2.. Esta mostrando o mesmo erro, e dando o erro na linha onde se encontra o count



E no utlimo count estava usando esse count em um if na página vercarrinho.php para finalizar o pedido..


    Finalizar Pedido



Gostaria de saber como alterar tudo isso para funcionar esse count no meu carrinho,

Desde ja agradeço!
★★★★★DIA 17.04.19 12h00RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Marcos Martins

Marcos Martins

Bom dia Gustavo,


só usar esta recomendação deste artigo que vc soluciona seu problema. Só prestar atenção na variável ali e trocar pela sua. Outra coisa, ali eu uso $this->documents porque dentro de uma classe privada, basta você trocar a VAR $this->documents pela sua.

★★★★★DIA 18.04.19 08h35RESPONDER
N/A
Enviando Comentário Fechar :/
Gustavo Ribeiro

Gustavo Ribeiro

Boa tarde Marcos,

Muito obrigado pela ajuda, consegui resolver!!

Revisando e revisando.

Obrigado.
★★★★★DIA 18.04.19 14h28RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Rodrigo Martins

Rodrigo Martins

Olá, meu amigo, parabéns pelo post. Encontrei um erro semelhante em uns módulos do Joomla. O Código é este:


if(count($result)) {
return '&Itemid=' . $result;
}

Como eu resolvo?
★★★★★DIA 04.04.19 09h38RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Marcos Martins

Marcos Martins

//DEPOIS DO PHP 7.2.X


Cria uma variavel auxiliar antes, com uma ternária para armazenar um valor, seja ele do array ou simplesmente o zero, caso o array esteja vazio.
$pkCount = (is_array($result) ? count($result) : 0);


Aqui você coloca sua condição, não sei precisa ser zero ou maior, então você sabendo o que deseja, modifique de acordo com o que precisa abaixo.
if ($pkCount == 0) {
     return '&Itemid=' . $result;
}

★★★★★DIA 04.04.19 09h49RESPONDER
N/A
Enviando Comentário Fechar :/
João Carlos Lopes

João Carlos Lopes

No caso essa minha função ficaria como marcos?

function ExecuteSQL($query, array $params = NULL){
$this->obj = $this->Conectar()->prepare($query);

if(count($params) > 0){
foreach($params as $key =>$value){
$this->obj->bindvalue($key, $value);
}
}

return $this->obj->execute();

Obrigado
★★★★★DIA 22.03.19 15h02RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Marcos Martins

Marcos Martins

Bom dia João,


você pode usar a função is_array para testar se é um array válido, assim ele funciona em qualquer versão do PHP, pelo menos até o momento.


function ExecuteSQL($query, array $params = NULL){
     $this->obj = $this->Conectar()->prepare($query);
     //AGORA VOCE TESTA SE ELE É UM ARRAY ANTES, DESSA FORMA ELE VAI FUNCIONAR PELO MENOS ATÉ O MOMENTO, EM QUALQUER VERSÃO DO PHP
     if(is_array($params)){
          foreach($params as $key =>$value){
               $this->obj->bindvalue($key, $value);
          }
          return $this->obj->execute();
     }else{
          return "RETORNA O ERRO QUE DESEJA AQUI";
     }

}

★★★★★DIA 26.03.19 09h14RESPONDER
N/A
Enviando Comentário Fechar :/
Jair Deon

Jair Deon

Obrigado pela dica, Marcos.
★★★★★DIA 18.03.19 09h58RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Marcos Martins

Marcos Martins

Olá Jair,


que bom que o artigo está ajudando bastante gente!

★★★★★DIA 18.03.19 10h09RESPONDER
N/A
Enviando Comentário Fechar :/
Helmiton Lins

Helmiton Lins

Eu tenho que declarar algo antes?
O meu está dando o seguinte erro:
Fatal error: Uncaught Error: Using $this when not in object context in D:\estudo\vemajudar\home.php:30 Stack trace: #0 {main} thrown

E meu código é simples, ele só conta os registros de um SQL:
$user=get_all_Home();
Fiz o que vc falou:
$pkCount = (is_array($this->$user) ? count($this->$user) : 0);

E deu o erro:
Fatal error: Uncaught Error: Using $this when not in object context in D:\estudo\vemajudar\home.php:30 Stack trace: #0 {main} thrown

Abraço!
★★★★★DIA 23.02.19 11h06RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Marcos Martins

Marcos Martins

Bom dia Helmiton,


nesse seu caso, você deve usar assim:


$user=get_all_Home();


$pkCount = (is_array($user) ? count($user) : 0);


Você só deverá usar o $this-> se tiver fazendo seu código numa classe, e ter declarado ela antes dos métodos como private. Se for esse seu caso, ainda sim estaria errado, porque quando usa o $this-> a palavra a seguir, ou seja o nome da variável vai sem o $, ficando $this->user.

★★★★★DIA 25.02.19 10h46RESPONDER
N/A
Enviando Comentário Fechar :/
ricardo l

ricardo l

Valeu, dei sorte de encontrar essa resposta pronta, pois o meu caso também era um código do PagSeguro, igualzinho ao que você colocou.
★★★★★DIA 26.01.19 00h48RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Andre Silva

Andre Silva

Ajudou muito. Valeu.
★★★★★DIA 21.12.18 13h56RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Rodrigo Lopes

Rodrigo Lopes

Obrigado Marcos!!

Me ajudou muito, quebrei a cuca também mas só implementar seu código ao meu e funcionou..

Waleu mesmo!
★★★★★DIA 12.11.18 20h55RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Marcos Vinicius Nunes Ferreira

Marcos Vinicius Nunes Ferreira

Me ajudou muito aqui, tinha um sistema que estava na versão 7.1 e não estava dando erros com esta função, me parece que foi a partir da 7.2 mesmo que mudaram. Mas eu já tinha quebrado muito a cabeça tentando corrigir alguns erros aqui. Parabéns e obrigado pela ajuda
★★★★★DIA 21.10.18 23h00RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Petrus Rennan

Petrus Rennan

Fatal error
: Uncaught Error: Using $this when not in object context in C:\xampp\htdocs\aporte\wp-content\themes\aporte\template-parts\planos\planos-loop.php:18 Stack trace: #0 C:\xampp\htdocs\aporte\wp-includes\template.php(690): require() #1 C:\xampp\htdocs\aporte\wp-includes\template.php(647): load_template('C:\\xampp\\htdocs...', false) #2 C:\xampp\htdocs\aporte\wp-includes\general-template.php(155): locate_template(Array, true, false) #3 C:\xampp\htdocs\aporte\wp-content\themes\aporte\single-plano.php(28): get_template_part('template-parts/...', 'loop') #4 C:\xampp\htdocs\aporte\wp-includes\template-loader.php(74): include('C:\\xampp\\htdocs...') #5 C:\xampp\htdocs\aporte\wp-blog-header.php(19): require_once('C:\\xampp\\htdocs...') #6 C:\xampp\htdocs\aporte\index.php(17): require('C:\\xampp\\htdocs...') #7 {main} thrown in
★★★★★DIA 21.09.18 11h42RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Marcos Martins

Marcos Martins

É porque você ao invés de por a sua VARIÁVEL, colocou a minha do exemplo, portanto ela não existe em seu contexto, por isso o erro!


$pkCount = (is_array($this->documents) ? count($this->documents) : 0); // ESTÁ ASSIM NO SITE


$pkCount = (is_array($sua-variavel) ? count($sua-variavel) : 0); // USA A SUA VARIÁVEL


 


Att. Marcos

★★★★★DIA 21.09.18 13h38RESPONDER
N/A
Enviando Comentário Fechar :/
Yuri Bigio

Yuri Bigio

Onde coloco esse código?
★★★★★DIA 31.07.18 08h57RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Marcos Martins

Marcos Martins

Não é onde coloco esse código...


...e sim, se você estiver usando o PHP 7.2.X e por acaso estiver com esse problema "Error PHP 7.2: count(): Parameter must be an array or an object that implements Countable", precisa antes testar se realmente é um array válido, porque agora nesta versão do PHP, o array não pode ser NULL, para obter a quantidade de registros dentro dele. Então basta trocar o exemplo de antes, pelo depois ali no artigo.

★★★★★DIA 31.07.18 09h58RESPONDER
N/A
Enviando Comentário Fechar :/
Enviando Comentário Fechar :/

Veja Também:

Artigos Relacionados a categoria: Blog

Soluções

...CURTIU? AINDA NÃO VIU NOSSO PORTFÓLIO?


Se ainda não viu nosso Portfólio e quer conhecer um pouco mais... aproveite, veja agora mesmo nossos Cases de Sucesso e tenha seu site nos padrões atuais preparado para maioria dos dispositivos e navegadores.