2016-03-31 21 views
0

以下のコードでは、コールバック関数 'cb'の内部でオブジェクト参照変数$ thisにアクセスする方法を見つけるのが苦労しています。私は「CB」関数の中から「大胆な」メソッドを呼び出すことができるようにしたいと思い、エラーに

Fatal error: Using $this when not in object context

を取得しています。

<?php 
    class Parser 
    { 
     private function bold($text) 
     { 
      return '<b>' . $text . '</b>'; 
     } 

     // Transform some BBCode text containing tags '[bold]' and '[/bold]' into HTML 
     public function transform($text) 
     { 
       function cb($matches) 
       { 
        // $this not valid here 
        return $this->bold($matches[1]); 
       }   

       $html = preg_replace_callback('/\[bold\]([\w\x20]*)\[\/bold\]/', 'cb', $text); 
       return $html;  
     }   
    } 

    $t = "This is some test text with [bold]BBCode tags[/bold]"; 

    $obj = new Parser(); 

    echo $obj->transform($t) . "\n"; 
    ?> 
+0

代わりにself :: boldを使用してください。$ this->太字 –

+0

PHPで認識されています - _named関数はネストできません!_匿名関数のためパーサーはエラーをスローしません。代わりに、それを抽出してグローバル空間に配置します。 ; - /それはクラスのメソッドとして置かれません; -/imo、_neverはPHP._imoで名前付きの関数/メソッドをネストしません。クラスのメソッドにするだけですか? –

+0

@JorgeMejiaがテストしました.-致命的なエラー:クラススコープがアクティブでないときにself ::にアクセスできません。しかし、@ fusion3kのソリューションが動作します – tcdaly

答えて

1

あなたは変数のスコープの問題を持っている:cb関数内なしのextern変数/オブジェクト/などが表示されます。

クラスのメソッドに機能を変更し

class Parser 
{ 
    (...) 
    private function cb($matches) 
    { 
     return $this->bold($matches[1]); 
    }   
    (...) 
} 

そして、このようにあなたのpreg_replace_callbackを変更します。

$html = preg_replace_callback('/\[bold\]([\w\x20]*)\[\/bold\]/', array($this, 'cb'), $text); 
#                 ==================== 

代わりに(PHP上> = 5.4)を使用すると、匿名関数を使用することができます。

$html = preg_replace_callback 
(
    '/\[bold\]([\w\x20]*)\[\/bold\]/', 
    function($matches) 
    { 
     return $this->bold($matches[1]); 
    }, 
    $text 
); 
+0

ありがとうございました。 'array($ this、 'cb')'が '$ this'をメソッド' cb'にローカル変数として注入するのが正しいと思いますか?もしそうなら、それをクラスメソッドにするために関数 'cb'を移動する必要がある理由は何ですか? – tcdaly

+0

'array($ this、 'cb')'は '$ this'を' cb'に挿入しません。関数の代わりにオブジェクトメソッドを呼び出す方法です。それは '(オブジェクト、メソッド)'を意味します。 – fusion3k

0

これはあなたのために機能しますか?

public function transform($text) 
{ 
    $html = preg_replace_callback('/\[bold\]([\w\x20]*)\[\/bold\]/', array($this, 'bold'), $text); 
    return $html;  
} 

あなたはそれが、この場合のマッチの配列を取得しますので、機能boldにもう少しロジックを移動する必要があるかもしれません。

+0

ありがとうございます。関数 'cb'と' bold'を別々に保つ必要があります。実際のアプリケーションでは、ここで太字と呼ばれる関数はもっと複雑です。 – tcdaly

関連する問題