2012-01-15 4 views
0

У меня есть общая ссылка объекта $sdk (это PHP SDK для PHP) между многими объектами. Мне нужно сохранить токен доступа в самом начале вызова функции и восстановить после вызова $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; 
    } 
} 

Вы можете установить объект динамически, один обертка будет достаточно для всего.