文档章节

PHP trait使用

eatnothing
 eatnothing
发布于 2016/08/09 14:18
字数 487
阅读 100
收藏 8
PHP

php使用关键字trait

php只能继承一个父类,但是,使用trait,类可以使用多个方法来实现想要做的事情,相当于实现多继承。

class Base{
    public function sayHello(){
        echo 'hello';
    }
}
trait SayHello{
    public function sayHello(){
		//调用父类的方法
        parent::sayHello();
        echo 'world';
    }
}
class MyHelloWorld extends Base{
    use SayHello;
}

$o =  new MyHelloWorld();
$o->sayHello();
//输出 hello world!

trait中的方法和类中的方法相同的时候,优先级的顺序是类中的方法会将trait中的方法覆盖,eg:

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

class TheWorldIsNotEnough {
    use HelloWorld;
    public function sayHello() {
        echo 'Hello Universe!';
    }
}

$o = new TheWorldIsNotEnough();
$o->sayHello();   //此处输出 'Hello Universe!'

使用多个trait

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();
//以上会输出HelloWorld!

如果两个trait使用了同一个方法,没有明确解决会发生报错, 为了解决多个trait在同一个类的命名冲突,需要使用insteadof操作符明确指定使用冲突方法的哪一个,as 操作符可以将其中的一个冲突的方法以另一个名称来引入。

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;
 		A::bigTalk insteadof SB;
    }
}

class Aliased_Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
        B::bigTalk as talk;
    }
}
$o = new Talker();
$o->smallTalk();
$o->bigTalk();
$o-SB();

trait来组成trait

trait Hello{
    public function sayHello(){
        echo 'Hello';
    }
}
trait World{
    public function sayWorld(){
        echo 'world';
    }
}
trait HelloWorld{
    use Hello,World;
}
class my_hello{
    use HelloWorld;
}
$a = new my_hello();
$a->sayHello();
$a->sayWorld();

trait支持抽象方法的使用

trait Hello{
    public function sayHelloWorld(){
        echo 'Hello'.$this->getWorld();
    }
    abstract public function getWorld();
}

class Myhello{
    private $world;
    use Hello;
    public function getWorld(){
       return  $this->world;
    }
    public function setWorld($val){
        $this->world = $val;
    }
}


$a = new Myhello();
$a->setWorld('123');
$a->sayHelloWorld();

可以定义变量和方法

trait StaticExample{
    //可以定义变量
    public $x = '100';
    //可以定义方法
    public static function  doSomething(){
        return 'do something';
    }
}

class Example{
    use StaticExample;
}
$e = new Example();
echo $e->x;
echo Example::doSomething();

© 著作权归作者所有

共有 人打赏支持
上一篇: JavaScript学习(一)
下一篇: yaf 学习
eatnothing
粉丝 38
博文 128
码字总数 68736
作品 0
昌平
程序员
私信 提问
php trait特性详解及使用注意事项

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HobHunter/article/details/80721260 php trait特性 简介 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称...

库塔姆斯
2018/06/17
0
0
PHP中实现代码复用的Trait方法的一些特性

在整理“PHP基础”这篇文档时,看到了trait方法,感觉比较陌生,所以今天上午用两个小时的时间,查阅测试了trait方法的一些特性及用法,整理发布了这篇博客。 Trait 是 PHP5.4 中的新特性,是...

尘世如潮
2016/04/12
447
0
TODO:Laravel 内置简单登录

TODO:Laravel 内置简单登录 激活Laravel的Auth系统Laravel 利用 PHP 的新特性 trait 内置了非常完善好用的简单用户登录注册功能,适合一些不需要复杂用户权限管理的系统,例如公司内部用的简...

OneTODO
2016/12/20
13
0
php中的traits详解

PHP是单继承的语言,在PHP 5.4 Traits出现之前,PHP的类无法同时从两个基类继承属性或方法。php的Traits和Go语言的组合功能类似,通过在类中使用use关键字声明要组合的Trait名称,而具体某个...

stone_ryan
2017/05/10
0
0
php trait 简明教程,多重继承的实现方案

http://php.net/manual/en/language.oop5.traits.php 自PHP5.4.0起,PHP实现了代码复用的一个方法,称为traints。 Traits是一种为类似PHP的单继承语音而准备的代码复用机制。Trait为了减少单...

雪之丞
2016/03/28
53
0

没有更多内容

加载失败,请刷新页面

加载更多

ZStack--工作流引擎

在IaaS软件中的任务通常有很长的执行路径,一个错误可能发生在任意一个给定的步骤。为了保持系统的完整性,一个IaaS软件必须提供一套机制用于回滚先前的操作步骤。通过一个工作流引擎,ZStac...

ZStack社区版
18分钟前
2
0
Eclipse 安装lombok

1.首先打开lombok官网:https://projectlombok.org/ 2.选择下载 3.使用java -jar 运行jar包(一般情况下双击即可) 4.安装 5.重启IDE...

hengbao5
22分钟前
4
0
混合式开发框架资料汇总

1.quickhybrid 2.kerkee 3.Hybrid

IT追寻者
29分钟前
2
0
PyCharm入门教程——基本编辑程序

PyCharm最新版本下载 JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外,该IDE提供了一些高级功能,以用于Django框架下的专业Web...

电池盒
32分钟前
2
0
分布式、高并发、多线程

分布式 分布式是为了解决单个物理服务器容量和性能瓶颈问题而采用的优化手段。包括但不限于:分布式文件系统,分布式缓存,分布式数据库,分布式计算。 分布式的实现有两种形式: 水平扩展:...

细节探索者
35分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部