0

匿名関数を作成しようとしていますが、その定義の現在のスコープから変数にアクセスする必要があります。

class test {
    private $types = array('css' => array('folder' => 'css'));
    
    public function __construct(){
        
        //define our asset types
        foreach($this->types as $name => $attrs){
            $this->{$name} = function($file = ''){
                //this line is where is falls over!
                //undefined variable $attrs!
                return '<link href="'.$attrs['folder'].'/'.$file.'" />';                
            }
        }
    }
}

$assets = new test();

明らかに、この例は非常にミニマルですが、私がやろうとしていることを理解しています。だから、私の質問は、関数の定義のためだけに親スコープにアクセスするにはどうすればよいですか?(一度定義すると、関数が呼び出されるときにそのコンテキストは明らかに必要ありません)。


編集#1

マシューの答えを使用した後、私はuse以下のように追加しました。しかし今、私の問題は、関数を呼び出したときに出力が得られないことです。

関数にadie('called')を追加すると、それが生成されますが、エコーしたり、何かを返したりした場合は生成されません。

class test {
    private $types = array('css' => array('folder' => 'css'));
    
    public function __construct(){
        
        //define our asset types
        foreach($this->types as $name => $attrs){
            $this->{$name} = function($file = '') use ($attrs){
                //this line is where is falls over!
                //undefined variable $attrs!
                return '<link href="'.$attrs['folder'].'/'.$file.'" />';                
            }
        }
    }
    
    public function __call($method, $args)
{
    if (isset($this->$method) === true) {
        $func = $this->$method;
        //tried with and without "return"
        return $func($args);
    }
}
}

$assets = new test();
echo 'output: '.$assets->css('lol.css');
4

1 に答える 1

2
function($file = '') use ($attrs)
于 2012-07-07T04:34:23.153 に答える