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->foo
es un miembro de la clase, mientras que$foo
es 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.$this
en 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::foo
no señalará a$this->foo
. Hace referencia a una constante de clase . Ambos,self::foo
yself::$foo
plantearí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
$foo
propiedad 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
__construct
método:El uso de la
global
palabra clave hará que la$foo
variable, declarada fuera de todas las funciones y clases, sea visible desde el interior de ese método ... Y probablemente no tenga esa$foo
variable.Para acceder a la
$foo
propiedad de clase , solo necesita usar$this->foo
, como lo hizo.fuente
Si está invocando
foobarfunc
con 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$this
cuando no está en el contexto del objeto .$this
no 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
global
dentro 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,
$this
simplemente 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
$this
ya que$this
solo 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