traits学习

越来越多的框架和代码开始使用traits方式去组织一些功能,这是非常高效的代码组织结构。

通过trait来减少不必要的类继承关系,让代码更加复用,形成可以拔插的代码集合。

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

单个的例子:

<?php

trait Seller
{
public function sell()
{
print_r("sell all goods");
}
} class MySeller
{
use Seller;
} $seller = new MySeller();
$seller->sell();

多个trait的例子:

<?php
trait Money
{
public function show()
{
echo "200$";
}
} trait Factory
{
public function run()
{
print_r("running all");
}
} class User
{
use Money, Factory; public function show()
{
echo "I am an user";
}
} $user = new User();
$user->show(); // => I am an user

当引入trait的类也有同名方法或者函数,那么当前类的该方法会覆盖trait中的同名方法。

如上面这个例子中User类和Money trait都有show方法,则执行之后调用的是User类的show方法,打印出"I am an user"的内容。

但是如果两个 trait 都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。我们需要明确指定是否某个trait的方法或者尽量不要让不同trait里面存在同名方法。

1.使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。例如:

<?php
trait Token
{
public function toString($var)
{
return (string)$var . "_token";
} public function tips()
{
print_r("Token tips!");
}
} trait Tester
{
public function toString($var)
{
return (string)$var . "_test";
} public function tips()
{
print_r("Tester tips");
}
} class Controller
{
use Token, Tester {
Token::toString insteadof Tester;
Tester::tips insteadof Token;
}
} $con = new Controller();
$con->toString('hello');
$con->tips('my god!');

或者使用别名方式去避免同名问题,如:

class Controller
{
user Token, Tester {
Token::toString as toTokenString;
Tester::tips as testerTips;
}
}

以上都是一些理论案例,实际上一些优质和现代的php框架已经在使用trait方式组织整个代码。典型的就是laravel。比如/www/larblog/app/Http/Controllers/Controller.php:

<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesResources; class Controller extends BaseController
{
use AuthorizesRequests, AuthorizesResources, DispatchesJobs, ValidatesRequests;
}

这里就使用了四个trait.

php中traits学习笔记的更多相关文章

  1. 转:openwrt中luci学习笔记

    原文地址:openwrt中luci学习笔记 最近在学习OpenWrt,需要在OpenWrt的WEB界面增加内容,本文将讲述修改OpenWrt的过程和其中遇到的问题. 一.WEB界面开发         ...

  2. VS2013中Python学习笔记[Django Web的第一个网页]

    前言 前面我简单介绍了Python的Hello World.看到有人问我搞搞Python的Web,一时兴起,就来试试看. 第一篇 VS2013中Python学习笔记[环境搭建] 简单介绍Python环 ...

  3. VS2013中Python学习笔记[环境搭建]

    前言 Python是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色 ...

  4. spring 中bean学习笔记

    spring 中bean 一.bean的定义和应用 1. bean 形象上类似于getXX()和setXX()的一种. 2. 由于java是面向对象的,类的方法和属性在使用中需要实例化. 3. 规律: ...

  5. VS2013中Python学习笔记[基础入门]

    前言 在上一节中简单的介绍了在VS2013中如何进行开发Hello World,在VS2013中进行搭建了环境http://www.cnblogs.com/aehyok/p/3986168.html. ...

  6. java中log4j学习笔记

    Log4j是apache的一个开源项目,用来操作程序日志信息的框架.因便于管理,在工程中用来代替System.out打印语句.通过配置Log4j中的log4j.properties,可以指定日志信息的 ...

  7. Java中ArrayList学习笔记

    1. 先看两段代码 这段代码在执行的时候会报 但是这样写就好着呢: 总结,研究报错的代码 ,在for循环的时候调用next()方法,next方法中调用了checkForComodification这个 ...

  8. [Union]C++中Union学习笔记

    C++ union结构式一种特殊的类.它能够包含访问权限.成员变量.成员函数(可以包含构造函数和析构函数).它不能包含虚函数和静态数据变量.它也不能被用作其他类的基类,它本身也不能有从某个基类派生而来 ...

  9. web自动化测试中接口测试学习笔记

    一.web基础 web是实现:客户端浏览器端<—————>服务端  交互的应用: web通常包含两部分:web客户端.web服务端:web客户端技术包含html.javascript.aj ...

随机推荐

  1. 表单元素的外观改变(webkit and IE10)

    1.禁止表单默认外观: input,select{ -webkit-appearance:none; appearance:none; }2.伪元素改变ie10表单元素默认外观 select::-ms ...

  2. 学习Easyui

    学习Easyui 社区easyui 论坛:http://bbs.jeasyuicn.com API地址:http://www.jeasyuicn.com/api 简单桌面版:http://app.bt ...

  3. 编程算法 - 二部图确定 代码(C)

    二部图确定 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定一个具有n个顶点的图. 要给图上每一个顶点染色, 而且要使相邻的顶点颜色不同.  ...

  4. Javascript操作阵列

    头操作unshift和shift var arr = [1, 2, 3]; arr.unshift(4); // arr = [4, 1, 2, 3]; 头加 arr.shift(); // arr ...

  5. Ubuntu中改变文件的默认打开方式

    其实最简单的方法是右键,在属性中修改,不过这样做没啥意义. ubuntu中与文件的打开方式相关的配置文件有四个: /etc/gnome/defaults.list 这是全局配置文件 /usr/shar ...

  6. leetcode[87] Partition List

    题目:给定一个链表和一个数x,将链表中比x小的放在前面,其他的放在后头.例如: Given 1->4->3->2->5->2 and x = 3,return 1-> ...

  7. SQL数据库面试题

    SQL数据库面试题 1.SQL SREVER中,向一个表中插入了新数据,如何快捷的得到自增量字段的当前值 这种情况其实我们经常用到,比如我们新建了一个用户,建立完用户后我们希望马上得到这个新用户的ID ...

  8. TortoiseGit for windows安装与配置

    1. 下载地址 TortoiseGit与Language Packs下载: https://code.google.com/p/tortoisegit/wiki/Download?tm=2 msysg ...

  9. iTextSharp生成pdf文档案例

    1.using iTextSharp.text;using iTextSharp.text.pdf; 2.设置页面大小 iTextSharp.text.Rectangle pageSize = new ...

  10. MVC 过滤器3

    ASP.NET MVC 过滤器(三) ASP.NET MVC 过滤器(三) 前言 本篇讲解行为过滤器的执行过程,过滤器实现.使用方式有AOP的意思,可以通过学习了解过滤器在框架中的执行过程从而获得一些 ...