1

私はphpクラスを持っていAssetsます。中Assetsには、アセットを処理するさまざまなパブリック関数があります(キャッシング、ミニファイ、結合など)。パブリック関数の1つには、を実行するために必要な2次関数が含まれていますpreg_replace_callback()。この内部関数は他のパブリック関数の1つにアクセスする必要がありますが、他の関数を呼び出すのに問題があります。

設定は次のとおりです。

class Assets
{

    public function img($file)
    {

        $image['location'] = $this->image_dir.$file;
        $image['content'] = file_get_contents($image['location']);
        $image['hash'] = md5($image['content']);
        $image['fileInfo'] = pathinfo($image['location']);

        return $this->cache('img',$image);

    }

    public function css($content)
    {

        . . .

        function parseCSS($matched){

            return $this->img($matched); // THIS LINE NEEDS TO REFERENCE function img()

        }

        $mend = preg_replace_callback(
            '#\<parse\>(.+?)\<\/parse\>#i',
            'parseCSS',
            $this->combined_css
        );

        . . .

    }

}

これが私が試したことです:

$this->img($matched)

エラー:オブジェクトコンテキストにないときに$thisを使用する-$this-> 内部を参照parseCSS()

Assets::img($matched)

エラー:オブジェクトコンテキストにないときに$thisを使用する-$this-> 内部を参照img()

では、内部関数内からパブリック関数にアクセスするにはどうすればよいですか?$this

4

2 に答える 2

5

これはより適切です:

public function css($content)
{
    //. . .
    $mend = preg_replace_callback(
        '#\<parse\>(.+?)\<\/parse\>#i',
        array($this, 'parseCSS'),
        $this->combined_css
    );
    //. . .
}

public function parseCSS($matched){
    return $this->img($matched); // THIS LINE NEEDS TO REFERENCE function img()
}

元のアプローチでは、が呼び出さparseCSSれるたびに定義されcssます。これは、css2回呼び出すと、致命的なエラーが発生する可能性があります。私の改訂された例では、スコープに関するすべての質問もはるかに簡単です。元の例でparseCSSは、はグローバルスコープの関数であり、クラスに関連付けられていません。

編集:有効なコールバックの定式化はここに文書化されています:http://php.net/manual/en/language.types.callable.php

// Type 1: Simple callback
call_user_func('my_callback_function'); 

// Type 2: Static class method call
call_user_func(array('MyClass', 'myCallbackMethod')); 

// Type 3: Object method call
call_user_func(array($obj, 'myCallbackMethod'));

// Type 4: Static class method call (As of PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');

// Type 5: Relative static class method call (As of PHP 5.3.0)
call_user_func(array('B', 'parent::who')); // A

//Type 6: Closure
$double = function($a) {
    return $a * 2;
};

$new_numbers = array_map($double, $numbers);

PHP 5.4以降、クロージャーベースのソリューションも可能です。これは、実際には当初の意図と同様です。

于 2012-10-24T18:13:43.017 に答える
3

それはあなたが思っていることをしません。その「内部」関数は、グローバルスコープの別の関数です。

<?php
class Foo
{
    public function bar()
    {
        echo 'in bar';

        function baz() {
            echo 'in baz';
        }
    }
}

$foo = new Foo();
$foo->bar();
baz();

また、メソッドを複数回呼び出すと、致命的なエラーが発生することに注意してください。bar

<?php
class Foo
{
    public function bar()
    {
        echo 'in bar';

        function baz() {
            echo 'in baz';
        }
    }
}

$foo = new Foo();
$foo->bar();
$foo->bar();
baz();

致命的なエラー:baz()を再宣言できません(以前は/ code / 8k1で宣言されていました)

私はその方法を作りませんが、フランク・ファーマーが答えたようにあなたは道を行くべきpublicです。

于 2012-10-24T18:17:56.537 に答える