Erro fatal php: usando $ this quando não estiver no contexto do objeto
-
23-09-2019 - |
Pergunta
Eu tenho um problema:
Estou escrevendo um novo WebApp sem uma estrutura.
No meu index.php Estou a usar: require_once('load.php');
E em load.php estou a usar require_once('class.php');
para carregar meu classe.php.
No meu classe.php Eu tenho esse erro:
Erro fatal: usando $ this quando não estiver no contexto do objeto em classe.php on -line ... (neste exemplo, seria 11)
Um exemplo de como meu classe.php está escrito:
class foobar {
public $foo;
public function __construct() {
global $foo;
$this->foo = $foo;
}
public function foobarfunc() {
return $this->foo();
}
public function foo() {
return $this->foo;
}
}
No meu index.php Estou carregando talvez foobarfunc()
assim:
foobar::foobarfunc();
mas também pode ser
$foobar = new foobar;
$foobar->foobarfunc();
Por que o erro está chegando?
Solução
No meu index.php, estou carregando talvez foobarfunc () como este:
foobar::foobarfunc(); // Wrong, it is not static method
mas também pode ser
$foobar = new foobar; // correct
$foobar->foobarfunc();
Você não pode invocar o método dessa maneira, porque não é um método estático.
foobar::foobarfunc();
Você deve usar:
foobar->foobarfunc();
Se, no entanto, você criou um método estático algo como:
static $foo; // your top variable set as static
public static function foo() {
return self::$foo;
}
Então você pode usar isso:
foobar::foobarfunc();
Outras dicas
Você está chamando um método não estático:
public function foobarfunc() {
return $this->foo();
}
Usando uma chamada estática:
foobar::foobarfunc();
Ao usar uma chamada estática, a função será chamada (mesmo que não fosse declarado como static
), mas, como não há nenhuma instância de um objeto, não há $this
.
Então :
- Você não deve usar chamadas estáticas para métodos não estáticos
- Seus métodos estáticos (ou métodos estaticamente chamados) não podem usar o $ this, que normalmente aponta para a instância atual da classe, pois não há instância de classe quando você está usando-as-estáticas.
Aqui, os métodos da sua classe estão usando a instância atual da classe, pois eles precisam acessar o $foo
propriedade da classe.
Isso significa que seus métodos precisam de uma instância da classe - o que significa que eles não podem ser estáticos.
Isso significa que você não deve usar chamadas estáticas: você deve inserir a classe e usar o objeto para chamar os métodos, como fez em sua última parte do código:
$foobar = new foobar();
$foobar->foobarfunc();
Para mais informações, não hesite em ler, no manual do PHP:
- o Classes e objetos seção
- E a Palavra -chave estática página.
Observe também que você provavelmente não precisa desta linha em seu __construct
método:
global $foo;
Usando o global
palavra -chave fará o $foo
variável, declarada fora de todas as funções e classes, visibile por dentro desse método ... e você provavelmente não tem tal $foo
variável.
Para acessar o $foo
Property de classe, você só precisa usar $this->foo
, como você fez.
Se você está invocando foobarfunc
com Operador de escopo de resolução (::
), então você está chamando estatisticamente, por exemplo, no nível da classe em vez do nível da instância, assim você está usando $this
Quando não está no contexto do objeto. $this
não existe no contexto de classe.
Se você habilitar E_STRICT
, PHP levantará um aviso sobre isso:
Strict Standards:
Non-static method foobar::foobarfunc() should not be called statically
Faça isso em vez disso
$fb = new foobar;
echo $fb->foobarfunc();
Em uma boneca, sugiro não usar global
dentro de suas aulas. Se você precisar de algo de fora da sua classe, passe -o pelo construtor. Isso é chamado Injeção de dependência E tornará seu código muito mais sustentável e menos dependente de coisas externas.
Primeiro você entende uma coisa, $ this dentro de uma classe denota o objeto atual.
É isso que você é criado no lado da classe para chamar função ou variável de classe.
Portanto, quando você está chamando sua função de classe como foobar :: foobarfunc (), o objeto não é criado. Mas dentro dessa função, você escreveu retorna $ this-> foo (). Agora aqui $ isso não é nada. É por isso que está dizendo Usando $ this quando não estiver no contexto do objeto em classe.php
Soluções:
Crie um objeto e chame foobarfunc ().
Ligue para Foo () usando o nome da classe dentro do foobarfunc ().
Quando você chama a função em um contexto estático, $this
simplesmente não existe.
Você teria que usar this::xyz()
em vez de.
Para descobrir em que contexto você está quando uma função pode ser chamada estaticamente e em uma instância de objeto, uma boa abordagem é descrita nesta pergunta: Como saber se sou estático ou um objeto?
Método rápido: (new foobar ())-> foobarfunc ();
Você precisa carregar sua classe Substitua:
foobar::foobarfunc();
por :
(new foobar())->foobarfunc();
ou :
$Foobar = new foobar();
$Foobar->foobarfunc();
Ou fazer estático função para usar foobar::
.
class foobar {
//...
static function foobarfunc() {
return $this->foo();
}
}
$foobar = new foobar;
colocar a classe Foobar em $ foobar, não o objeto. Para obter o objeto, você precisa adicionar parênteses: $foobar = new foobar();
Seu erro é simplesmente que você chama um método em uma classe, então não há $this
desde $this
existe apenas em objetos.
Basta usar o método de classe usando isso foobar->foobarfunc();