1. ホーム
  2. php

[解決済み] PHPのネストされた関数は何のためにあるのですか?

2023-05-14 19:30:15

質問

JavaScriptでは、ネストされた関数が非常に便利です:クロージャ、プライベートメソッド、その他。

PHPのネストされた関数は何のためにあるのでしょうか?誰かがそれを使い、何のために?

これは私が行った小さな調査です。

<?php
function outer( $msg ) {
    function inner( $msg ) {
        echo 'inner: '.$msg.' ';
    }
    echo 'outer: '.$msg.' ';
    inner( $msg );
}

inner( 'test1' );  // Fatal error:  Call to undefined function inner()
outer( 'test2' );  // outer: test2 inner: test2
inner( 'test3' );  // inner: test3
outer( 'test4' );  // Fatal error:  Cannot redeclare inner()

どのように解決するのですか?

基本的にはありません。私はいつもパーサーの副作用として扱っています。

Eran Galperinは、これらの関数が何らかの形でプライベートなものであると考えるのは間違っています。それらは単に outer() が実行されるまで宣言されていないだけです。また、プライベート スコープでもありません。グローバル スコープを汚染します。そして、コールバックとして、外側のコールバックはまだ一度しか呼び出されないかもしれません。私はまだ、エイリアスを複数回呼び出す可能性が非常に高い配列にそれを適用することがどのように有用であるかはわかりません。

私が掘り起こすことができた唯一の '実世界' の例は この で、これは一度しか実行できないので、よりきれいに書き換えることができます、IMO。

私が思いつく唯一の用途は、モジュールが [name]_include メソッドを呼び、グローバル空間にいくつかのネストされたメソッドを設定し

if (!function_exists ('somefunc')) {
  function somefunc() { }
}

をチェックします。

PHPのOOPの方が明らかに良い選択でしょう :)