Llamar a una función indefinida en PHP
Muchos de ustedes se han encontrado con este error varias veces Fatal error: Call to undefined function_name()
. En la publicación de hoy, estamos descubriendo cómo desentrañar este error. Pero antes de resolver este problema, entendamos cómo PHP evalúa las funciones.
Hay varias formas de definir funciones y llamarlas. Digamos que lo escribe en el archivo function.php y lo llama en el archivo main.php.
// function.php
<?php
namespace fooNamespace {
function foo() {
return "Calling foo"
}
}
?>
// main.php
include function.php
<?php
echo fooNamespace\foo();
?>
Los espacios de nombres son calificadores que permiten una mejor gestión al agrupar clases que trabajan juntas para realizar una tarea. Le permite utilizar el mismo nombre para varias clases. Es importante saber cómo PHP sabe qué elemento del espacio de nombres requiere el código. Los espacios de nombres PHP funcionan como una especie de sistema de archivos. Hay 3 formas de acceder a un archivo en un sistema de archivos:
- Nombre de archivo relativo como
fooBar.txt
. Se resolverá enfooDirectory/fooBar.txt
donde fooDirectory es el directorio actualmente ocupado. - Nombre de la ruta relativa, como
subdirectorio / fooBar.txt
. Se resolverá enfooDirectory/subdirectory/fooBar.txt
. - Nombre de ruta absoluto como
/main/fooBar.txt
. Se resolverá en/main/fooBar.txt
.
Los elementos con espacio de nombres en PHP siguen un principio equivalente. Por ejemplo, el nombre de una clase se puede especificar de tres formas:
- Nombre no calificado / Nombre de clase sin prefijo:
O,
$a = new foo();
Si el espacio de nombres actual esfoo::staticmethod();
foonamespace
, siempre se resolverá comofoonamespace\foo
. Si el código es un código global, sin espacios de nombres, esto se resuelve comofoo
. - Nombre calificado / Nombre de clase con prefijo:
O,
$a = new fooSubnamespace\foo();
Si el espacio de nombres actual esfooSubnamespace\foo::staticmethod();
foonamespace
, siempre se resolverá comofoonamespace\fooSubnamespace\foo
. Si el código es global, sin espacio de nombres, esto se resuelve enfooSubnamespace\foo
. - Nombre completo / nombre con prefijo con operador de prefijo global:
O,
$a = new \foonamespace\foo();
Esto siempre se resuelve en el nombre literal establecido en el código,\foonamespace\foo::staticmethod();
foonamespace\foo
.
Ahora suponga que define una clase y llama al método de una clase dentro del mismo espacio de nombres.
<?php
class foo {
function barFn() {
echo "Hello foo!"
}
function bar() {
barFn();
// interpreter is confused which instance's function is called
$this->barFn();
}
}
$a = new foo();
$a->bar();
?>
La pseudovariable $this
tiene los métodos y propiedades del objeto actual. Esto es beneficioso porque le permite acceder a todas las variables miembro y métodos de la clase. Dentro de la clase, se llama $this->functionName()
. Fuera de la clase, se llama $theclass->functionName()
.
$this
es una referencia a un object
PHP que el intérprete creó para usted, que contiene un array de variables. Si llama a $this
dentro de un método normal en una clase normal,$this
devuelve el objeto al que pertenece este método.
Pasos para resolver el error de llamar a una función no definida en PHP
-
Verifica que el archivo exista. Busque el archivo PHP en el que está escrita la definición de la función.
-
Verifique que el archivo se haya incluido usando la declaración
require
(oinclude
) para el archivo anterior en la página. Verifique que la ruta enrequire
/include
sea correcta. -
Verifica que el nombre del archivo esté escrito correctamente en la declaración
require
. -
Imprime / repite una palabra en el archivo incluido para determinar si se ha incluido correctamente.
-
Definí una función separada al final del archivo y llámala.
-
Comprobar que las funciones estén cerradas correctamente. (Traza los tirantes)
-
Si estás llamando a métodos de una clase, asegúrate de que esté escrito
$this->
.
Shraddha is a JavaScript nerd that utilises it for everything from experimenting to assisting individuals and businesses with day-to-day operations and business growth. She is a writer, chef, and computer programmer. As a senior MEAN/MERN stack developer and project manager with more than 4 years of experience in this sector, she now handles multiple projects. She has been producing technical writing for at least a year and a half. She enjoys coming up with fresh, innovative ideas.
LinkedIn