Tengo un problema:
Estoy escribiendo una nueva aplicación web sin un marco.
En mi index.php estoy usando:require_once('load.php');
Y en load.php estoy usando require_once('class.php');para cargar mi class.php .
En mi class.php tengo este error:
Error fatal: usar $ this cuando no está en el contexto del objeto en class.php en línea ... (en este ejemplo sería 11)
Un ejemplo de cómo se escribe mi class.php :
class foobar {
public $foo;
public function __construct() {
global $foo;
$this->foo = $foo;
}
public function foobarfunc() {
return $this->foo();
}
public function foo() {
return $this->foo;
}
}
En mi index.php estoy cargando tal vez foobarfunc()así:
foobar::foobarfunc();
pero también puede ser
$foobar = new foobar;
$foobar->foobarfunc();
¿Por qué viene el error?

Respuestas:
No puede invocar el método de esta manera porque no es un método estático.
En su lugar, debe usar:
Sin embargo, si ha creado un método estático similar a:
entonces puedes usar esto:
fuente
$this->fooes un miembro de la clase, mientras que$fooes solo una variable en el alcance de la función (importado del alcance global). Los nombres de funciones con el mismo nombre que un miembro tampoco son un problema.$thisen un método estático.::. Es contraE_STRICT, pero hace el trabajo, siempre y cuando el cuerpo del método no hace referencia al alcance ejemplo, por ejemplo usos$this. Además,self::foono señalará a$this->foo. Hace referencia a una constante de clase . Ambos,self::fooyself::$fooplantearían un error fatal.Está llamando a un método no estático:
Usando una llamada estática:
Cuando se utiliza una llamada estática, se llamará a la función (incluso si no se declara como
static) , pero, como no hay una instancia de un objeto, no la hay$this.Entonces :
Aquí, los métodos de su clase están utilizando la instancia actual de la clase, ya que necesitan acceder a la
$foopropiedad de la clase.Esto significa que sus métodos necesitan una instancia de la clase, lo que significa que no pueden ser estáticos.
Esto significa que no debe usar llamadas estáticas: debe instanciar la clase y usar el objeto para llamar a los métodos, como lo hizo en su última porción de código:
Para más información, no dude en leer, en el manual de PHP:
También tenga en cuenta que probablemente no necesite esta línea en su
__constructmétodo:El uso de la
globalpalabra clave hará que la$foovariable, declarada fuera de todas las funciones y clases, sea visible desde el interior de ese método ... Y probablemente no tenga esa$foovariable.Para acceder a la
$foopropiedad de clase , solo necesita usar$this->foo, como lo hizo.fuente
Si está invocando
foobarfunccon el operador de alcance de resolución (::), lo está llamando estáticamente , por ejemplo, en el nivel de clase en lugar del nivel de instancia, por lo que está utilizando$thiscuando no está en el contexto del objeto .$thisno existe en el contexto de clase.Si habilita
E_STRICT, PHP generará un Aviso sobre esto:Haz esto en su lugar
En una nota al margen, sugiero no usar
globaldentro de sus clases. Si necesita algo externo a su clase, páselo por el constructor. Esto se llama inyección de dependencia y hará que su código sea mucho más fácil de mantener y menos dependiente de cosas externas.fuente
Primero entiendes una cosa, $ this dentro de una clase denota el objeto actual .
Eso es lo que se crea fuera de la clase para llamar a la función o variable de clase.
Entonces, cuando está llamando a su función de clase como foobar :: foobarfunc (), el objeto no se crea. Pero dentro de esa función que escribiste, devuelve $ this-> foo (). Ahora aquí $ esto no es nada. Es por eso que dice Usar $ this cuando no está en el contexto del objeto en class.php
Soluciones:
Cree un objeto y llame a foobarfunc ().
Llame a foo () usando el nombre de la clase dentro de foobarfunc ().
fuente
Cuando llama a la función en un contexto estático,
$thissimplemente no existe.Tendría que usar
this::xyz()en su lugar.Para saber en qué contexto se encuentra cuando una función se puede llamar estáticamente y en una instancia de objeto, se describe un buen enfoque en esta pregunta: ¿Cómo saber si soy estático o un objeto?
fuente
Método rápido: (new foobar ()) -> foobarfunc ();
Necesita cargar su clase reemplazar:
por:
o:
O hacer una función estática para usar
foobar::.fuente
$foobar = new foobar;pon la clase foobar en $ foobar, no el objeto . Para obtener el objeto, debe agregar paréntesis:$foobar = new foobar();Su error es simplemente que llama a un método en una clase, por lo que no existe
$thisya que$thissolo existe en los objetos.fuente
Me parece ser un error en PHP. El error
aparece en la función usando
$this, pero el error es que la función de llamada está usando una función no estática como estática. Es decir:Mientras el error está aquí:
fuente
Simplemente use el método Class usando esto
foobar->foobarfunc();fuente