Eu tenho um problema:
Estou escrevendo um novo WebApp sem um Framework.
No meu index.php eu estou usando:require_once('load.php');
E no load.php eu estou usando require_once('class.php');
para carregar meu class.php .
No meu class.php eu tenho este erro:
Erro fatal: usar $ this quando não estiver no contexto do objeto em class.php on line ... (neste exemplo, seria 11)
Um exemplo de como meu class.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 eu estou carregando talvez foobarfunc()
assim:
foobar::foobarfunc();
mas também pode ser
$foobar = new foobar;
$foobar->foobarfunc();
Por que o erro está chegando?
Respostas:
Você não pode invocar o método dessa maneira porque não é um método estático.
Você deve usar:
Se, no entanto, você criou um método estático, algo como:
então você pode usar isso:
fonte
$this->foo
é um membro da classe, enquanto$foo
é apenas uma variável no escopo da função (importada do escopo global). Nomes de funções com o mesmo nome que um membro também não são um problema.$this
em um método estático.::
. É contraE_STRICT
, mas faz o trabalho, enquanto o corpo do método não faz referência ao âmbito exemplo, por exemplo, usos$this
. Além disso,self::foo
não apontará para$this->foo
. Referencia uma constante de classe . Ambos,self::foo
eself::$foo
geraria um erro fatal.Você está chamando um método não estático:
Usando uma chamada estática:
Ao usar uma chamada estática, a função será chamada (mesmo que não seja declarada como
static
) , mas, como não há instância de um objeto, não há$this
.Assim :
Aqui, os métodos da sua classe estão usando a instância atual da classe, pois eles precisam acessar a
$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 instanciar a classe e usar o objeto para chamar os métodos, como você fez na última parte do código:
Para mais informações, não hesite em ler, no manual do PHP:
Observe também que você provavelmente não precisa desta linha no seu
__construct
método:Usar a
global
palavra - chave fará com que a$foo
variável declarada fora de todas as funções e classes fique visível de dentro desse método ... E você provavelmente não tem essa$foo
variável.Para acessar a
$foo
propriedade de classe , você só precisa usar$this->foo
, como fez.fonte
Se você está chamando
foobarfunc
com o operador de escopo de resolução (::
), está chamando-o estaticamente , 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ê ativar
E_STRICT
, o PHP emitirá um aviso sobre isso:Faça isso
Em uma nota de rodapé, sugiro não usar
global
nas suas aulas. Se você precisar de algo externo à sua classe, passe-o pelo construtor. Isso se chama Injeção de Dependência e tornará seu código muito mais sustentável e menos dependente de coisas externas.fonte
Primeiro, você entende uma coisa: $ this dentro de uma classe indica o objeto atual .
Ou seja, você é criado fora da classe para chamar a função ou variável da classe.
Portanto, quando você está chamando sua função de classe como foobar :: foobarfunc (), o objeto não é criado. Mas dentro dessa função que você escreveu, retorne $ this-> foo (). Agora aqui $ isso não é nada. É por isso que está dizendo Usar $ this quando não está no contexto do objeto em class.php
Soluções:
Crie um objeto e chame foobarfunc ().
Chame foo () usando o nome da classe dentro do foobarfunc ().
fonte
Quando você chama a função em um contexto estático,
$this
simplesmente não existe.Você teria que usar em seu
this::xyz()
lugar.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 eu sou estático ou um objeto?
fonte
Método rápido: (new foobar ()) -> foobarfunc ();
Você precisa carregar sua classe substituir:
de :
ou:
Ou crie uma função estática para usar
foobar::
.fonte
$foobar = new foobar;
coloque 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 existe,
$this
pois$this
existe apenas em objetos.fonte
Parece-me um erro no PHP. O erro
aparece na função usando
$this
, mas o erro é que a função de chamada está usando a função não estática como estática. Ou seja:Enquanto o erro está aqui:
fonte
Basta usar o método Class usando este
foobar->foobarfunc();
fonte