2011-04-24 70 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)