2

さて、これはしばらくの間私の麺を焼いています。グローバルにアクセス可能な関数を定義するメソッドを持つクラスがあります。私の質問は、内部クラスメソッドがグローバルスコープでアクセス可能な関数をどのように定義できるかということです。

サンプルは次のとおりです。

class MyClass 
{

    // ... accessors, constuctors other methods, et al... 

    // The method in question:
    private function myPrivateMethod()
    {
        if( !function_exists( 'someArbitraryFunction' ) )
        {
            function someArbitraryFunction( $args )
            {
                return "Hello, {$args} world!";
            }
        }            
    } 
}

クラスは通常どおり、アプリケーションの非常に早い段階でインスタンス化されますが、別のクラスのメソッド内でインスタンス化されます。これは浅いスコープチェーンですが、アプリケーションの外部からアクセスできる理由が(私には)意味をなさないほどネストされています。これは、カプセル化についての私の理解に反します。いくつかの洞察をいただければ幸いです。

4

1 に答える 1

3

宣言された関数は、常にグローバル スコープを持ちます。これは JavaScript ではありません。

見る:

class MyClass 
{

    // ... accessors, constuctors other methods, et al... 

    // The method in question:
    private function myPrivateMethod()
    {
        if( !function_exists( 'someArbitraryFunction' ) )
        {
            function someArbitraryFunction( $args )
            {
                return "Hello, {$args} world!";
            }
        }            
    } 

    public function run(){
        $this->myPrivateMethod();
    }
}

var_dump(function_exists('someArbitraryFunction')); // false
$obj = new MyClass();
$obj->run();
var_dump(function_exists('someArbitraryFunction')); // true

C/C++ の背景を持つ言語であるため、関数とメソッドの間には明確な動作があります。PHP では、関数はアクセス修飾子に従いません。

コード内のどこに記述されていても、実行が宣言を通過すると、宣言が定義されます。

スコープに従う関数が必要な場合 (変数の GC をより適切に利用できるため、強くお勧めします)、PHP 5.3 以降で Closures を使用できます。

class MyClass{

    private $myArbitraryMethod;

    private function myPrivateMethod(){
        $this->myArbitraryMethod = function($args){

        }
    }

}
于 2012-10-24T03:05:46.320 に答える