文档章节

PHP trait使用

eatnothing
 eatnothing
发布于 2016/08/09 14:18
字数 487
阅读 97
收藏 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();

© 著作权归作者所有

共有 人打赏支持
eatnothing
粉丝 36
博文 128
码字总数 68736
作品 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
12,关于PHP依赖注入、对象序列化、Trait的使用心得

依赖注入 PHP依赖注入时,在方法定义参数注入类型时,可以用接口作为提示,也可用抽象类作为提示 对象序列化 如上,如果,直接将序列化的字符串进行反序列化那么,如果能找到aaa这个类(或根...

o半醒的狐狸
01/13
0
0
PHP traits (复用机制)

最近在学习Laravel中,遇到了很多关于Traits ,查了下资料,分享下。 提到 php 的代码复用,我们可能第一时间会想到继承,但是这种单继承语言一旦派生的子类过多,那么会产生一系列的问题,比...

Coding_ff
2017/05/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

中国发布域名系统基础软件 “红枫”

9月12日消息,域名工程中心(英文缩写 ZDNS)发布了宣称自主开发的域名系统基础软件 “红枫(Maple DNS)”。 9月12日消息,域名工程中心(英文缩写 ZDNS)发布了宣称自主开发的域名系统基础软...

问题终结者
27分钟前
1
0
Shell编程(分发系统介绍、expect远程登录、expect远程执行命令、expect传递参数)

分发系统介绍expect 分发系统expect即分发脚本,是一种脚本语言;通过他可以实现传输,输入命令(上线代码) 应用场景:业务越来越大,网站app,后端,编程语言是php,所以就需要配置lamp或者...

蛋黄_Yolks
31分钟前
1
0
Java Http请求工具类

public static String httpPost(String source, String params) {URL url = null;HttpURLConnection conn = null;OutputStream os = null;String ret = null;try {......

yuewawa
38分钟前
1
0
C++11 智能指针

C++11提供了三个智能指针,std::shared_ptr,std::unique_ptr,std::weak_ptr。最常用的是shared_ptr和unique_ptr。 (1)std::shared_ptr shared_ptr是共享指针,通过在控制块中增加引用计数...

yepanl
39分钟前
1
0
React 服务器渲染原理解析与实践

网盘下载地址 React 服务器渲染原理解析与实践 本套课程,讲解了React中SSR技术的整个搭建思路及流程,完整的从原理上讲清楚了SSR的概念,重点在于讲解编写SSR框架遇到的各种知识点,以及细节...

qq__2304636824
51分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部