web-dev-qa-db-ja.com

PHP未定義関数の呼び出し

別の関数から関数を呼び出そうとしています。エラーが発生します:

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

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);
}

すでに試したこと:

  1. Require_onceが機能し、ファイルが指定された場所に存在することを確認しました。
  2. 関数がファイルに存在することを確認しました。

これを理解することはできません。ここに何かが足りませんか?

23
janenz00

これは開発者のミスでした-終了ブレースの配置が間違っていたため、上記の関数が入れ子関数になりました。

SOの未定義関数エラーに関連する質問がたくさんあります。他の誰かがfunction scopeで同じ問題を抱えている場合、これを答えとして書き留めておきましょう。

最初にトラブルシューティングを試みたもの:

  1. 関数定義を含むphpファイルを検索しました。ファイルが存在することを確認しました。
  2. 上記のファイルのrequire(またはinclude)ステートメントが存在することを確認しましたページで。また、require/includeの絶対パスが正しいことを確認しました。
  3. Requireステートメントでファイル名のスペルが正しいことを確認しました。
  4. 含まれているファイルにWordをエコーし​​、適切に含まれているかどうかを確認します。
  5. ファイルの最後に別の関数を定義し、それを呼び出しました。うまくいきました。

機能が非常に長いため、ブレースをトレースすることは困難でした-レガシーシステムの問題。トラブルシューティングのさらなる手順は次のとおりです。

  1. インクルードファイルの最後に、簡単な印刷機能を既に定義しました。 「未定義の関数」のすぐ上に移動しました。それも未定義にしました。
  2. これをスコープの問題として特定しました。

  3. Netbeansの折りたたみ(コードの折りたたみ)機能を使用して、この機能のすぐ上の機能を確認しました。したがって、上記の1000行の関数は、これと一緒に折りたたまれ、ネストされた関数になります。

  4. 問題が特定されたら、関数をファイルの最後に切り貼りして問題を解決しました。

22
janenz00

エラーの再現方法と修正方法:

  1. このコードを_p.php_というファイルに入れます。

    _<?php
    class yoyo{
        function salt(){
        }
        function pepper(){
            salt();
        }
    }
    $y = new yoyo();
    $y->pepper();
    ?>
    _
  2. 次のように実行します。

    _php p.php
    _
  3. エラーが発生します:

    _PHP Fatal error:  Call to undefined function salt() in 
    /home/el/foo/p.php on line 6
    _
  4. 解決策:$this->salt();の代わりにsalt();を使用します

    代わりに次のようにします:

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

誰かがPHPクラス内の関数の前に$ thisを使用する必要がある理由へのリンクを投稿できるとしたら、それは素晴らしいことです。

64
Eric Leschinski

phpphp.iniファイルの短いオープンタグをサポートしていないため、問題が何度も発生します。

<?
   phpinfo();
?>

以下を使用する必要があります。

<?php
   phpinfo();
?>
7
JRivero

あなたの関数はおそらくあなたがそれを呼び出しているものとは異なる名前空間にあります。

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

4
Jonathan Amend

他のホスティングですべてが正常に機能したときに、仮想サーバーでこの問題が発生しました。いくつかの変更の後、ファイル内を除くすべての呼び出しでincludeまたはrequire_oneが機能することに気付きました。このファイルの問題は、テキストの最初と最後のコード< ?php ? >でした。それは< ?のみのスクリプトであり、実行されていたそのバージョンのApacheでは動作しませんでした

0
Asier Arizti