文档章节

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

雪之丞
 雪之丞
发布于 2016/03/28 18:04
字数 524
阅读 84
收藏 4

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

自PHP5.4.0起,PHP实现了代码复用的一个方法,称为traints。

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

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

在我理解说白了就是在继承类链中隔离了子类继承父类的某些特性(就是子类“要用父类的特性的时候”,如果trait有,就优先调用trait的方法、属性等)。

<?php
/**
 * Date: 2016/3/28
 * Time: 16:38
 */

trait MyTrait
{
    protected $var = "MyTrait_var";
    protected $var1 = "MyTrait_var";

    function __construct()
    {
        echo $this->var.PHP_EOL;
    }

    function a()
    {
        echo "a".PHP_EOL;
    }

}

interface MyInterface
{
    function __construct();
    function b();
}

abstract class MyAbstract
{
    protected $var2 = "MyAbstract_var";
    use MyTrait;
    function b()
    {
        echo "b".PHP_EOL;
    }
}

class MyClass extends MyAbstract implements MyInterface
{
    protected $var3 = "MyClass_var";

    //也可以在这里引用,不区分继承关系
    //use MyTrait
    function c()
    {
        echo "c".PHP_EOL;
    }
}

$class = new MyClass();
$class->a();
$class->b();
$class->c();




输出结果:

总结

① 从本质上说,trait和include文件的概念差不多

②trait可以更加方便的实现代码复用,因为我们用继承关系实现的无法在父类中访问子类的private属性与方法,而trait就和把代码直接写在对象里的效果一样

③使用trait时候应该坚决避免命名冲突,尤其是同时使用多个trait时。

④如果产生了命名冲突,如果两者的可见性、初始值、static与否完全相同,则trait中的会覆盖掉对象中的,并抛出E_STRICT错误,否则会抛出E_COMPILE_ERROR错误,终止编译。

本文转载自:http://www.4wei.cn/archives/1002433

雪之丞
粉丝 13
博文 219
码字总数 51065
作品 0
浦东
程序员
私信 提问
trait 了解下-可以实现多重继承_已整理

Trait 是 PHP5.4 中的新特性,是 PHP 多重继承的一种解决方案。例如,需要同时继承两个 Abstract Class, 这将会是件很麻烦的事情,Trait 就是为了解决这个问题。 相关文章 简明教程 Trait特...

辣条拌鱼翅
2015/08/24
13
0
PHP简明教程-面向对象基础 2

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

栗子boomboomboom
2017/07/03
0
0
PHP中实现代码复用的Trait方法的一些特性

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

尘世如潮
2016/04/12
675
0
深入理解 Rust 的动态分派模型

让我做个开场白,我是rust世界的新手(虽然我喜欢它很久了),如果我犯了技术性错误,请让我知道并且我会尽力纠正它们。说到这为止,让我们开始吧! 在下面的代码片段中可以看到我深入研究动...

xiaoaiwhc1
2018/05/09
3.1K
0
关于Scala多重继承的菱形问题

在Scala中的trait中引入了混入的概念,即Mixin of trait。 什么是混入(mixin) 可能翻译不准确,有人也称之为混入类(mixins),混入是一种组合的抽象类,主要用于多继承上下文中为一个类添加...

Barudisshu
2015/05/25
2.9K
1

没有更多内容

加载失败,请刷新页面

加载更多

高速PCB设计软件allegro中与网络有关的约束规则设置

在allegro pcb的设计过程中,设计约束规则包括时序规则、间距规则、信号完整性规则以及物理规则等,本期主要详细讲解与物理、间距与电气约束中的线宽、线间距物理规则的设置。 一、线宽设置 ...

demyar
17分钟前
2
0
Linux 启动停止SpringBoot jar 程序部署Shell 脚本

#!/bin/bash #这里可替换为你自己的执行程序,其他代码无需更改 APP_NAME=algorithm.jar #使用说明,用来提示输入参数 usage() { echo "Usage: sh 执行脚本.sh [start|stop|restart|status]...

草庐过客
19分钟前
3
0
mysql-connector-java驱动升级到8.0后数据库保存时间出现时差

1.问题:在一个新项目中用到了新版的mysql jdbc 驱动后,发现保存到数据库的时间出现了时差 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId>......

ValSong
21分钟前
3
0
好程序员大数据教程Scala系列之隐式转换和隐式参数

5.1. 概念 隐式转换和隐式参数是Scala中两个非常强大的功能,利用隐式转换和隐式参数,你可以提供优雅的类库,对类库的使用者隐匿掉那些枯燥乏味的细节。 5.2. 作用 隐式的对类的方法进行增强...

好程序员官网
25分钟前
2
0
多线程必备

初次接触线程,可能有很多初学者搞不明白,始终云里雾里,那么本篇文章直接带大家介绍多线程必须知道的几个点 接下来没有多余,直接上干货 1. 进程和线程的区别是什么? 进程是执行着的应用程序,...

理性思考
28分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部