web-dev-qa-db-fra.com

PHP Appelez une fonction non définie

J'essaie d'appeler une fonction d'une autre fonction. Je reçois une erreur:

Fatal error: Call to undefined function getInitialInformation() 
in controller.php on line 24

fichier controller.php:

require_once("model/model.php"); 

function intake() {
    $info = getInitialInformation($id); //line 24
}

model/model.php

function getInitialInformation($id) {
    return $GLOBALS['em']->find('InitialInformation', $id);
}

Choses déjà essayées:

  1. Vérifié que le require_once fonctionne et que le fichier existe à l'emplacement spécifié.
  2. Vérifié que la fonction existe dans le fichier.

Je ne suis pas capable de comprendre cela. Est-ce que j'ai râté quelque chose?

23
janenz00

C’était une erreur du développeur - une accolade de fin mal placée, qui a rendu la fonction ci-dessus un fonction imbriquée.

Je vois beaucoup de questions liées à l'erreur de fonction non définie dans SO. Permettez-moi de noter ceci comme une réponse, au cas où quelqu'un d'autre aurait le même problème avec portée de la fonction.

Ce que j'ai essayé de résoudre en premier:

  1. Vous avez recherché le fichier php contenant la définition de la fonction. Vérifié que le fichier existe.
  2. Vérification que l'exigence requiert l'instruction (ou include ) pour le fichier ci-dessus dans la page. En outre, vérifié le chemin absolu dans le require/include est correct.
  3. Vérifié que le nom de fichier est correctement orthographié dans l'instruction require.
  4. Écho d'un mot dans le fichier inclus, pour voir s'il a été correctement inclus.
  5. Défini une fonction séparée à la fin du fichier et l'a appelée. Cela a fonctionné aussi.

Il était difficile de retrouver les accolades, car les fonctions étaient très longues - problème avec les systèmes hérités. Les étapes suivantes pour résoudre les problèmes sont les suivantes:

  1. J'ai déjà défini une fonction d'impression simple à la fin du fichier inclus. Je l'ai déplacé juste au-dessus de la "fonction non définie". Cela l'a rendu indéfini aussi.
  2. Identifié cela comme une question de portée.

  3. Utilisez la fonctionnalité Netbeans collapse (code fold) pour vérifier la fonction juste au-dessus de celle-ci. Ainsi, la fonction 1000 lignes ci-dessus vient de s’effondrer avec celle-ci, ce qui en fait une fonction imbriquée.

  4. Une fois le problème identifié, coupez la fonction à la fin du fichier, ce qui a résolu le problème.

22
janenz00

Comment reproduire l'erreur et comment la corriger:

  1. Placez ce code dans un fichier appelé p.php:

    <?php
    class yoyo{
        function salt(){
        }
        function pepper(){
            salt();
        }
    }
    $y = new yoyo();
    $y->pepper();
    ?>
    
  2. Exécutez-le comme ceci:

    php p.php
    
  3. Nous avons des erreurs:

    PHP Fatal error:  Call to undefined function salt() in 
    /home/el/foo/p.php on line 6
    
  4. Solution: utilisez $this->salt(); au lieu de salt();

    Alors faites-le comme ceci à la place:

    <?php
    class yoyo{
        function salt(){
        }
        function pepper(){
            $this->salt();
        }
    }
    $y = new yoyo();
    $y->pepper();
    
    ?>
    

Si quelqu'un pouvait poster un lien vers pourquoi $, ceci doit être utilisé avant PHP fonctionne dans les classes, ouais, ce serait génial.

64
Eric Leschinski

Souvent, le problème vient du fait que php ne prend pas en charge les balises ouvertes courtes dans php.ini fichier, c'est-à-dire:

<?
   phpinfo();
?>

Tu dois utiliser:

<?php
   phpinfo();
?>
7
JRivero

Votre fonction est probablement dans un espace de noms différent de celui d'où vous l'appelez.

http://php.net/manual/en/language.namespaces.basics.php

4
Jonathan Amend

Je suis arrivé ce problème sur un serveur virtuel, quand tout fonctionnait correctement sur un autre hébergement. Après plusieurs modifications, j'ai réalisé que je include ou require_one fonctionne sur tous les appels sauf dans un fichier. Le problème de ce fichier était le code < ?php ? > Au début et à la fin du texte. C'était un script qui n'était que < ?, et dans cette version d'Apache en cours d'exécution ne fonctionnait pas

0
Asier Arizti