1

我有一个 php 类Assets。其中Assets有各种处理资产的公共功能(缓存、缩小、组合......)。其中一个公共功能包含执行preg_replace_callback(). 这个内部函数需要访问其他公共函数之一,但我无法调用其他函数。

这是设置:

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,这可能会导致致命错误。css在我修改后的示例中,所有范围问题也更加简单明了。在您的原始示例中,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 回答