2012-01-15 11 views
0

私は多くのオブジェクトの間で共有された$sdkオブジェクト参照(Facebook PHP SDK)を持っています。私はにアクセストークンを保存し、$this->sdk->api呼び出しの後に関数呼び出しと復元の非常に初期にする必要があります。例えば、getAlbums()機能を参照してください。各インスタンスメソッド呼び出しの前後にコールバックを実行しますか?

はどのように自動的に後/前にすべてのFBItemインスタンス上のすべての関数呼び出しをコールバックを実行することができますか?

abstract class Item 
{ 
    protected $id, $sdk, $auth;  

    public function __construct(Facebook $sdk, $auth = null) 
    { $this->sdk = $sdk; $this->auth = $auth; } 

    public function getAlbums() // Require access token change 
    { 
     // Am i FBUser or FBPage? Call setAccessToken to set auth 
     $backup = $this->sdk->getAccessToken(); 
     $this->sdk->setAccessToken($auth ?: $backup); 

     $as = array(); 
     $rs = $this->sdk->api(sprintf('/%s/albums', $this->id)); 
     foreach($rs['data'] as $i) $as[] = new Album($this->sdk, $this->auth); 

     // Restore previous token backup 
     $this->sdk->setAccessToken($backup); 
    } 

} 

class User extends Item 
{ 
    $ps = array(); $rs = $this->sdk->api(sprintf('/%s/accounts', $this->id)); 

    foreach($rs['data'] as $i) $ps[] = new Page($this->sdk, $i['access_token']); 

    return $ps; 
} 

class Page extends Item { } 

答えて

1

おそらく唯一の方法は、このようなラッパーを準備している(PHPのルートキットを使用するか、クラス全体を書き換えることなく):

class FBItemWrapper { 
    public $item = new FBItem(); 

    public function __call($functionName, $args){ 
     // Pre callback 
     $result = call_user_func_array(array($this->item, $functionName), $args); 
     // Post callback 
     return $result; 
    } 
} 

あなたがオブジェクトを動的に設定することができので、1ラッパーはすべてのための十分でしょう。

関連する問題