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?

Foi útil?

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:


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:

  1. Crie um objeto e chame foobarfunc ().

  2. 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();

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top