扩展性状与PHP类?(Extend Traits with Classes in PHP?)

2019-06-23 11:00发布

为什么我们不能带类的PHP扩展性状?

例如:

Trait T { }

Class C use T {}
/* or */
Class C extends T {}

是否有这样的语法任何潜在的冲突? 我不这么认为。

Answer 1:

因此PHP手册规定:

特点是在单继承语言如PHP代码重用的机制。 性状旨在通过使开发人员能够重用集的方法自由地生活在不同的类层次结构几个独立的类,以减少单继承的一些限制。 性状和类的组合的语义是在降低了复杂性,并且避免了与多重继承和混入相关联的典型问题的方式来定义。

如果你正在寻找扩展特性,那么它应该可能是一类。 如果你有一组中的一类,你想在别人使用方法,但感觉不恰当的扩展类(如class Animal extends Vehicle ),然后在PHP 5.4它可以作为一个特点很好地工作。

为了更直接地回答这个问题,你不“扩展”的性状,但你可以创建自己使用其他性状特征。 按照PHP手册:

trait Hello {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait World {
    public function sayWorld() {
        echo 'World!';
    }
}

trait HelloWorld {
    use Hello, World;
}

class MyHelloWorld {
    use HelloWorld;
}

你可以认为这是保持在逻辑组的特点,并介绍一些模块化的方式。

编辑:在看到一些评论,我认为这是值得指出的是使用在基类的性状也意味着,特点是在扩展它的任何类,基因和性状的功能优先于基类的。 把它在子类只会使性状的功能不可用的父/基类。

Parent > Trait > Child

http://php.net/manual/en/language.oop5.traits.php



Answer 2:

你可以稍微延长的特点。 扩大对mrlee的答案,当你use一个特点,你可以重新命名它的方法。

例如说你有一个由你的框架中定义的“父”特点:

trait FrameworkTrait {
    public function keepMe() {
        // Framework's logic that you want to keep
    }

    public function replaceMe() {
        // Framework's logic that you need to overwrite
    }
}

只要拉父特征,其重命名replaceMe方法到别的东西,并定义自己的replaceMe方法。

trait MyTrait {
    use FrameworkTrait {
        FrameworkTrait::replaceMe as frameworkReplaceMe;
    }

    public function replaceMe() {
        // You can even call the "parent" method if you'd like:
        $this->frameworkReplaceMe();

        // Your logic here
    }
}

然后在你的类:

class MyClass {
    use MyTrait;
}

现在,对象这个类可以做到这一点的:

$obj = new MyClass();

$obj->keepMe();             // calls "parent" trait
$obj->replaceMe();          // calls "child" trait
$obj->frameworkReplaceMe(); // calls "parent" trait


Answer 3:

只有类可以延长。 性状类。 它们可用于/由类包括在内,但不是类本身。 如果你认为一个特征需要进行扩展,那么它可能应该是一个类,可能是一个抽象的,而不是一个特质。



文章来源: Extend Traits with Classes in PHP?
标签: php oop traits