Instalação
Artigos
Cursos
Loja
INSTALAÇÃO
ARTIGOS
CURSOS
EBOOKS
DOWNLOADS
LOJA
ARTIGOS
Os erros mais comuns em PHP
Evite cair na cilada Bino
Neste tutorial irei mostrar os erros mais comuns que assolam um programador PHP. ### Meu código-fonte está sendo exibido na tela em vez de ser interpretado. Esse erro tipicamente tem relação com a instalação do seu servidor web, verifica a instalação de seu Apache, Nginx, etc e tente novamente. ---
### Meu código não faz nada Se você tem certeza que o seu código deveria funcionar e a página simplesmente não exibe nada, é possível que você esteja lidando com um erro que não está sendo mostrado. Em ambientes de desenvolvimento a exibição de erros deve estar sempre ligada, para isso você deve configurar o arquivo de configuração do seu PHP para isso. Atende para que estas opções estejam ligadas: ```ini display_errors = On error_reporting = E_ALL ``` Se não for possível configurar o seu servidor dessa maneira é possível alterar essas configurações em tempo de execução com a função do PHP [`ini_set`](http://php.net/manual/en/function.ini-set.php). Uma terceira maneira de verificar erros, indicada para servidores de produção onde não é indicado exibir mensagens de erro internas do PHP, é olhar os arquivos de log de erros do servidor web e do PHP. --- ### Fatal error: Cannot redeclare function() in... Esse erro pode acontecer por 3 motivos: 1) Você está declarando uma função com um nome reservado do `PHP`. Por exemplo: ```php
## Fatal error: Allowed memory size of x bytes exhausted (tried to allocate x bytes) in Essa mensagem de erro pode ser causada por uma má configuração no servidor ou um erro básico de programação. Vamos ao primeiro caso: **1º** é possível que o desenvolvedor tenha criado uma rotina complexa que armazene na memória da aplicação vetores e ou objetos que somados ultrapassem do total de memória alocado para o PHP. Essa configuração é feita pelo arquivo `php.ini` e pode ser alterado acessando o mesmo e definindo um novo valor comportado pelo servidor. É possível solucionar este problema sem alterar a configuração do servidor, digamos que por algum motivo não seja possível alterar o uso de memória em toda a aplicação, pode-se configurar um valor de memória para um processo específico, para isso podemos usar: ```php // Define a quantidade de memória disponível para 512M ini_set('memory_limit','512M'); ``` **2º** caso, o desenvolvedor criou um loop infinito que acabou ultrapassando o limite disponível, para detectar esse problema será necessário analisar o código-fonte afim de encontrar possíveis erros de programação. Para visualizar a mensagem de erro é possível simular o erro com o seguinte código: ```php -1 ; $i++) { $b = new stdClass; $b->a = time(); $a[] = $b; } ``` --- ## Warning: Invalid argument supplied for foreach() in Esta mensagem é resultado de um erro comum em projetos PHP, esse erro acontece quando um `foreach` é executado em uma variável que não é um vetor ou objeto. É provável que nenhum programador PHP irá realizar um `foreach` usando uma string como entrada, no entanto ao consumir outros métodos é possível que eles não garantam o retorno de um vetor. Um exemplo seria, ao consumir uma função criada por outro programador dado um parâmetro de entrada ele retorna false e o resultado não é testado, isso resultará no erro `Invalid argument supplied for foreach`, que também é lançado quando executado sobre: - String - `''` - Boolean - Int É possível simular este erro com: ```php $value) { echo $value; } ``` --- ## Warning: Missing argument x for function_name(), called in Erro lançado quando uma função é invocada e um número incorreto de parâmetros são enviados. Parâmetros a mais são ignorados, no entanto parâmetros a menos causam o erro que da o nome a este tópico. Um exemplo seria: ```php getNome(); class User { private $name; public function __construct() { $this->name = 'Pedro'; } public function getNome() { return $this->name; } } ``` Executando o exemplo acima, o código irá imprimir a palavra `Pedro` na tela, isso acontece pois a variável `$user` é uma representação da classe e ao ser instanciada pelo método `__construct()` para a ter o valor `Pedro` no atributo nome, que por usa vez fica disponível para uso através do método `getNome`. No próximo exemplo será mostrada uma implementação onde o erro do tópico acontece. Utilizando a mesma classe usada no exemplo anterior iremos usar erroneamente a variável `$this` dentro de um método estático, tentaremos obter o nome sem que ele tenha sido instanciado. ```php name = 'Pedro'; } public function getNome() { return $this->name; } public static function getNomeEstatico() { return $this->name; } } ``` Ao executar o código acima, o desenvolvedor irá se deparar com o erro `Using $this when not in object context`. Isso acontece pois o método `getNomeEstatico` é executado sem a instancia de um objeto do tipo `User`, sendo assim a informação do nome não é conhecida. Embora em outro tipo de abordagem possa ser criado um método estático que internamente crie um objeto. No próximo exemplo mostrarei uma classe em que o método estático cria um objeto, de maneira que os métodos do objeto possam ser acessados evitando a mistura de métodos de instância e estáticos. ```php name = 'Pedro'; } public function getNome() { return $this->name; } public static function getNomeEstatico() { $user = new User; return $user->getNome(); } } ``` O código acima funcionada da mesma maneira que o primeiro exemplo deste tópico, o resultado será a impressão do nome `Pedro`. O funcionamento correto acontece pois dentro do método `getNomeEstatico` o objeto `User` é criado, de maneira que o desenvolvedor possa ter acesso ao métodos desta classe. --- ## Attempt to assign property of non-object in Este erro acontece quando tratamos uma variável que não for um objeto como se fosse, um exemplo seria, tentar acessar um atributo em uma variável que é to tipo `String`. Abaixo dois exemplos que causam este erro: ```php bar = 'asd'; #### $foo = 'bar'; $foo->bar = 'sad'; ``` --- ## Methods with the same name as their class will not be constructors Não é possível criar métodos com o mesmo nome da classe, nem mesmo esperar que eles tenham comportamento de construtores, em outras linguagens de programação, como JAVA é possível definir o método construtor com o mesmo nome da classe. No PHP os desenvolvedores devem criar o método `__construct()`. Veja um código-fonte que gera o erro abordado: ```php
COMENTE SOBRE