2011-04-24 89 views
2

我聽說你不能使用擴展兩次。PHP中的多個擴展

我有兩個類:

Base32和SecureRandom的

,我需要爲TOTP。

我怎樣才能使用這兩個呢?

+0

我也可能這樣做不對,我應該做一個公共職能的setkey()和傳遞的$輸出secRand->字節(10); ? – Steven 2011-04-24 03:51:17

+0

你可以實例化你所需要的類中的類。 – 2011-04-24 03:52:10

+0

你仍然可以鏈接類: http://stackoverflow.com/a/9818728/277619 – FlycKER 2013-07-25 17:31:14

回答

5

使用interfacescomposition(包括其中一個類的實例作爲該類的成員變量)。

接口允許您定義類中方法的原型。一個類然後implements接口,並且必須爲接口中的每個原型定義一個方法。您只能從一個類直接繼承(extends),但您可以implements任意數量的接口。

如果您發現接口不適合您的任務,只需使用組合。

+1

組合絕對是在這種情況下走的路。僅僅因爲你想讓一個類繼承另一個對象的功能並不意味着它非常適合繼承。 – 2011-04-25 14:29:54

0

PHP不允許多重繼承。你需要擴展其中的一個,把另一個作爲私有變量,或者類似的東西。

2

看看PHP5.4 Traits他們那種解決多重延伸的問題。

將它們與接口組合以獲得instanceof功能。

例如:

interface ClientAwareInterface { 
    public function setClient($client); 
} 

trait ClientAwareTrait { 
    protected $client; 

    public function setClient($client) 
    { 
     $this->client = $client; 
    } 
} 

class Shop implements ClientAwareInterface extends SomeClass { 
    use ClientAwareTrait; // use our trait to implement interface methods 
    use OtherTrait; 
} 

$shop = new Shop(); 
if($shop instanceof ClientAwareInterface) { 
    $shop->setClient('test'); 
    var_dump($shop); 
} 

結果將是:

object(Shop)[1] 
    protected 'client' => string 'test' (length=4)