文档章节

PHP trait使用

eatnothing
 eatnothing
发布于 2016/08/09 14:18
字数 487
阅读 96
收藏 8
点赞 1
评论 0
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 ⋅ 0

TODO:Laravel 内置简单登录

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

OneTODO ⋅ 2016/12/20 ⋅ 0

php中的traits详解

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

stone_ryan ⋅ 2017/05/10 ⋅ 0

php trait 简明教程,多重继承的实现方案

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

雪之丞 ⋅ 2016/03/28 ⋅ 0

【翻译】Traits in PHP

Trait 本质上是无状态的mixin,是PHP解释器自动完成的『粘贴&拷贝』,区别于继承,它提供的重用是水平性的,很好地提高了代码的可重用。然而错误使用会造成冲突,BUG难以调试。先来看看 trai...

amoroso1860 ⋅ 04/04 ⋅ 0

PHP 手册学习-基础语法

基本语法 PHP 标记、分割符、注释 当解析一个文件时,PHP 会寻找起始和结束标记,也就是 <?php 和 ?>,在 HTML 中分离出 PHP代码; 指令分割符:同 C 或 Perl 一样,PHP 需要在每个语句后用分...

SibylY ⋅ 2016/02/22 ⋅ 0

PHP之Traits

【PHP之Traits】  1、Traits基础      2、优先级:当前类中的方法会覆盖 Trait 方法,而Trait方法覆盖了基类中的方法。   3、多个Traits,使用use声明列出多个Traits。      4、...

行走的螃蟹 ⋅ 2016/08/24 ⋅ 0

PHP简明教程-面向对象基础 2

PHP简明教程 面向对象基础 2 其他的几个魔术方法 方法名 触发时机 参数1 参数2 备注 callStatic 当调用不存在的静态方法的时候自动执行这个方法 函数名 参数(数组) 该方法必须是static slee...

栗子boomboomboom ⋅ 2017/07/03 ⋅ 0

PHP之新手自学基础知识(五)——拓展篇之魔术变量及魔术函数

PHP 魔术变量 魔术变量就是指那些根据不同环境有不同的取值,以下介绍的是魔术常量,由于在不同环境有不同的取值所以也叫魔术变量。知道本质是个常量就好了。 PHP 向它运行的任何脚本提供了大...

天谴残魂 ⋅ 01/06 ⋅ 0

PHP_007 魔术变量和魔术函数

魔术变量 PHP 向它运行的任何脚本提供了大量的预定义常量。 不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。 有八...

g00m ⋅ 2015/02/23 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

BS与CS的联系与区别【简】

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或 SQL Server。客户端需要安装专用的客户端软件。 B/S是Brower/...

anlve ⋅ 50分钟前 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部