php中traits学习笔记
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学习笔记的更多相关文章
- 转:openwrt中luci学习笔记
原文地址:openwrt中luci学习笔记 最近在学习OpenWrt,需要在OpenWrt的WEB界面增加内容,本文将讲述修改OpenWrt的过程和其中遇到的问题. 一.WEB界面开发 ...
- VS2013中Python学习笔记[Django Web的第一个网页]
前言 前面我简单介绍了Python的Hello World.看到有人问我搞搞Python的Web,一时兴起,就来试试看. 第一篇 VS2013中Python学习笔记[环境搭建] 简单介绍Python环 ...
- VS2013中Python学习笔记[环境搭建]
前言 Python是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色 ...
- spring 中bean学习笔记
spring 中bean 一.bean的定义和应用 1. bean 形象上类似于getXX()和setXX()的一种. 2. 由于java是面向对象的,类的方法和属性在使用中需要实例化. 3. 规律: ...
- VS2013中Python学习笔记[基础入门]
前言 在上一节中简单的介绍了在VS2013中如何进行开发Hello World,在VS2013中进行搭建了环境http://www.cnblogs.com/aehyok/p/3986168.html. ...
- java中log4j学习笔记
Log4j是apache的一个开源项目,用来操作程序日志信息的框架.因便于管理,在工程中用来代替System.out打印语句.通过配置Log4j中的log4j.properties,可以指定日志信息的 ...
- Java中ArrayList学习笔记
1. 先看两段代码 这段代码在执行的时候会报 但是这样写就好着呢: 总结,研究报错的代码 ,在for循环的时候调用next()方法,next方法中调用了checkForComodification这个 ...
- [Union]C++中Union学习笔记
C++ union结构式一种特殊的类.它能够包含访问权限.成员变量.成员函数(可以包含构造函数和析构函数).它不能包含虚函数和静态数据变量.它也不能被用作其他类的基类,它本身也不能有从某个基类派生而来 ...
- web自动化测试中接口测试学习笔记
一.web基础 web是实现:客户端浏览器端<—————>服务端 交互的应用: web通常包含两部分:web客户端.web服务端:web客户端技术包含html.javascript.aj ...
随机推荐
- ASP.NET如何显示农历时间
ASP.NET如何显示农历时间 CS部分代码如下: 代码如下: public string ChineseTimeNow = ""; public string ForignTi ...
- C语言连接Oracle
原文:C语言连接Oracle 最近在搞C语言连接Oracle.DB2数据库,现把C连接Oracle的文章总结下: 用C语言连接ORACLE数据库.有两个思路和目的 思路一)本地环境:UBUNTU 7. ...
- ASPX的Timer位置没放正确,导致整页刷新,而不是UpdatePanel里的内容刷新。
提示:Timer应该放在UpdatePanel的ContentTemplate标签里,才行.放在外面的话,会导致整页刷新.
- jQuery EasyUI API - Grid - DataGrid [原创汉化官方API]
最近在学习jQuery EasyUI,发现中文的文档好少,部分文档不错但它是鸟语的,为了大家也为了自己学习吧,汉化做一下笔记. 有没有说清楚的,或者翻译不正确的地方还请大家谅解指出.. 由于工作时间原 ...
- DDD分层架构之值对象(介绍篇)
DDD分层架构之值对象(介绍篇) 前面介绍了DDD分层架构的实体,并完成了实体层超类型的开发,同时提供了验证方面的支持.本篇将介绍另一个重要的构造块——值对象,它是聚合中的主要成分. 如果说你已经在使 ...
- MUI初始化滚动区域
mui(".mui-scroll-wrapper").scroll().refresh(); 如果不是MUI对象,需要转一下才可 mui($("#areaDiv" ...
- Asterisk 未来之路3.0_0002
原文:Asterisk 未来之路3.0_0002 伟大的变化需要可扩展性技术 每一个现有的PBX都因为其自身的缺点变的糟糕,不管其功能如何丰富,总有一些东西会漏掉.具备非常完全功能的PBX 也不能预见 ...
- 基于C# 语言的两个html解析器
基于C# 语言的两个html解析器 1)Html Agility Pack http://nsoup.codeplex.com/ 代码段示例: HtmlDocument doc = new HtmlD ...
- QTP DataTable全攻略(1)
上一篇 / 下一篇 2009-07-27 00:14:16 / 个人分类:qtp 查看( 575 ) / 评论( 0 ) / 评分( 0 / 0 ) 下面的代码可能有点乱,基本涉及到常用的datat ...
- document对象属性documentMode与CompatMode
DOCTYPE DOCTYPE全称Document Type Declaration(文档类型声明,缩写DTD) DTD的声明影响浏览器对于CSS代码及Javascript脚本的解析. 渲染模式 渲染 ...