【问题标题】:Multiple Extends in PHP [duplicate]PHP中的多个扩展[重复]
【发布时间】:2011-08-11 17:30:50
【问题描述】:

我听说你不能使用两次extend。

我有两个班级:

Base32 和 SecureRandom

我需要 TOTP。

我怎样才能同时使用这两个呢?

【问题讨论】:

  • 如果我执行公共函数 setKey() 并传递 $secRand->bytes(10); 的输出,我也可能做错了。 ?
  • 你可以在你需要的类中实例化类。
  • 你仍然可以链接类:stackoverflow.com/a/9818728/277619

标签: php oop extends


【解决方案1】:

使用interfacescomposition(包括其中一个类的实例作为该类的成员变量)。

接口允许您为类中的方法定义原型。一个类然后implements该接口,并且必须为接口中的每个原型定义一个方法。您只能直接从一个类 (extends) 继承,但您可以implements 任意数量的接口。

如果您发现界面不适合您的任务,请使用组合。

【讨论】:

  • 组合绝对是在这种情况下要走的路。仅仅因为您希望一个类继承另一个对象的功能并不意味着它非常适合继承。
【解决方案2】:

PHP 不允许多重继承。您需要扩展其中一个并将另一个作为私有变量,或类似的东西。

【讨论】:

    【解决方案3】:

    看看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)
    

    【讨论】:

      猜你喜欢
      • 2015-06-19
      • 2016-05-20
      • 2012-10-18
      • 2015-10-16
      • 2011-04-01
      • 2019-02-02
      • 1970-01-01
      • 2016-01-23
      • 2016-07-23
      相关资源
      最近更新 更多