2

関数の再宣言の問題があります。したがって、この例を複数回呼び出そうとしています。

class myClass {

    function abc() {

        function internal() {

        return "i am internal"; 
        }

    return internal();
    }

}


$myClass = new myClass();

echo $myClass->abc();
echo $myClass->abc(); // HERE IS THE PROBLEM when i call same function second time

PHP で致命的なエラーが表示されます: internal() を再宣言できません (以前に宣言されています)。

この問題を解決する方法を知っている人はいますか?

前もって感謝します。

4

4 に答える 4

5

関数の期間を再宣言することはできないので、次のようにしてみてください。

<?php 
class myClass {

    function abc() {
        return $this->internal();
    }

    private function internal() {
        return "i am internal";
    }

}
?>
于 2013-02-08T15:24:14.133 に答える
1

を使用して関数を宣言するときfunction <name>()、自分が思っているスコープで宣言していません。その関数は、関数/クラス スコープではなく、クラスグローバル スコープで宣言されています。

PHP ドキュメントを参照してください: http://www.php.net/manual/en/functions.user-defined.php#example-149

したがって、 を呼び出すときabcは、グローバル関数 を再宣言していることになりますinternal

現在行っていることを実行したい場合は、代わりにクロージャーを使用できます(注: これは PHP 5.3+ でのみ機能します)。これには、内部からローカル変数を読み取ることができるという利点があります(キーワードabcを使用する場合)。use

class myClass {

    function abc() {
        $internal = function() {
            return "i am internal"; 
        };

        return $internal();
    }
}

internal特に変更しない場合は、クラスのプライベート関数として宣言することもできます。なぜ関数を再作成し続けるのですか?

class myClass {

    private function internal(){
        return "i am internal"; 
    }

    function abc() {
        return $this->internal();
    }
}
于 2013-02-08T15:28:59.753 に答える
1

関数を定義する前に、関数が存在するかどうかを確認します。

class myClass {
    function abc() {
        if ( ! function_exists('internal')) {
            function internal() {
                return "i am internal"; 
            }
        }

        return internal();
    }
}
于 2013-02-08T15:24:55.007 に答える
0

または:

if (!function_exists('internal')) { function internal ... }

ただし、この場合、関数 internal はクラス スコープ外でも使用できることに注意する必要があります。ローレンスのソリューションは、より良いアプローチです。

于 2013-02-08T15:24:44.307 に答える