首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用特征或继承扩展PHP库?

用特征或继承扩展PHP库?
EN

Stack Overflow用户
提问于 2015-10-11 20:32:52
回答 1查看 216关注 0票数 0

作为一个软件开发人员,我想为我的客户提供一个扩展库。不应更改库提供商的原始库。

有几种方法可以做到这一点。除了继承,特征也会在脑海中出现。

假设在原始库中有一个类定义为:

代码语言:javascript
复制
class Super {}

第一种方法:使用特征扩展原始库:

代码语言:javascript
复制
trait MyTrait {
    public function func() {
        echo "func in MyTrait\n";
    }
}

// Customer writes in his code:
class Sub1 extends Super {
    use MyTrait;
}
$sub1 = new Sub1;
$sub1->func();

第二种方法:使用继承扩展原始库:

代码语言:javascript
复制
class LibExtension extends Super {
    public function func() {
        echo "func in LibExtension\n";
    }
}

// Customer writes in his code:
class Sub2 extends LibExtension {
}

$sub2 = new Sub2;
$sub2->func();

在这种情况下,使用特征与继承相比有什么优势?在哪种情况下,哪种方法更受限制?作为软件开发人员和客户,哪一个给了我更大的灵活性?

如果我们在开放源码或封闭源码领域,这些方法有什么不同吗?

对于这种情况,有没有更好的方法?

EN

回答 1

Stack Overflow用户

发布于 2015-10-12 18:15:39

推荐一种方法比推荐另一种方法非常困难,但在许多情况下,组合是为最终用户提供灵活性的更合适的方式。

考虑到你的特征样本:

代码语言:javascript
复制
trait MyTrait {
    public function func() {
        echo "func in MyTrait\n";
    }
}

// Customer writes in his code:
class Sub1 extends Super {
    use MyTrait;
}
$sub1 = new Sub1;
$sub1->func();

它可以这样重写:

代码语言:javascript
复制
interface FuncPrinterInterface
{
    public function funcPrint();
}

class FuncPrinter implements FuncPrinterInterface
{
    public function funcPrint()
    {
        echo "func in MyTrait\n";
    }
}

class UserClass
{
    /**
     * @var FuncPrinterInterface
     */
    protected $printer;

    /**
     * Sub1 constructor.
     *
     * @param FuncPrinterInterface $printer
     */
    public function __construct(FuncPrinterInterface $printer)
    {
        $this->printer = $printer;
    }

    public function doSomething()
    {
        $this->printer->funcPrint();
    }
}

$sub1 = new UserClass(new FuncPrinter());
$sub1->doSomething();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33064993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档