php Trait

作者: taobao | 来源:发表于2020-12-16 11:08 被阅读0次

自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。

Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。

Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。

<?php
class Base {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}

class MyHelloWorld extends Base {
    use SayWorld;
}

$o = new MyHelloWorld();
$o->sayHello();
?>

多个 trait
通过逗号分隔,在 use 声明列出多个 trait,可以都插入到一个类中。

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

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

class MyHelloWorld {
    use Hello, World;
    public function sayExclamationMark() {
        echo '!';
    }
}

$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>

冲突的解决
如果两个 trait 都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。

为了解决多个 trait 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。

以上方式仅允许排除掉其它方法,as 操作符可以 为某个方法引入别名。 注意,as 操作符不会对方法进行重命名,也不会影响其方法。

示例 #5 冲突的解决

在本例中 Talker 使用了 trait A 和 B。由于 A 和 B 有冲突的方法,其定义了使用 trait B 中的 smallTalk 以及 trait A 中的 bigTalk。

Aliased_Talker 使用了 as 操作符来定义了 talk 来作为 B 的 bigTalk 的别名。

<?php
trait A {
    public function smallTalk() {
        echo 'a';
    }
    public function bigTalk() {
        echo 'A';
    }
}

trait B {
    public function smallTalk() {
        echo 'b';
    }
    public function bigTalk() {
        echo 'B';
    }
}

class Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
    }
}

class Aliased_Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
        B::bigTalk as talk;
    }
}
?>

相关文章

  • php中的trait机制提高代码复用

    什么是trait 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。 Trait 是...

  • 第十二章:Trait

    自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。 Trait 是为类似 PHP 的...

  • php Trait

    自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。 Trait 是为类似 PHP 的...

  • Modern PHP: namespace's prac

    --- mysql_trait.php --- --- News.php --- --- test.php ---

  • trait PHP 实现了一种代码复用的方法(PHP5.4.0起

    自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。 Example #1 Trait...

  • PHP trait

    官方解释 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。 Trait...

  • PHP实现多继承

    方法一 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。 Trait 是为类似 P...

  • 7.9 Trait

    trait 是PHP为类只能单继承而实现的代码复用机制。 trait 不能继承,也不能实现接口。 trait 不能...

  • PHP Trait

    PHP类只能继承一个父类(单继承),trait就是用来解决这个问题的。 Trait 是为类似 PHP 的单继承语言...

  • auth登录

    In LoginController.php they use a trait called Authentica...

网友评论

    本文标题:php Trait

    本文链接:https://www.haomeiwen.com/subject/pbjngktx.html