php中traits学习笔记
2016-04-24 20:39
393 查看
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编程----for循环的妙用
- php课堂笔记
- php模拟post上传图片
- php关键字
- PHP数组学习笔记
- PHP中的变量
- frontpage 2010.2003绿色版
- PHP 字符串处理
- php封装数据库mysql, mysqli
- PHP笔记
- PHP网上教程
- 三,PHP中错误日志display_errors与error_reporting配置
- TP-LINK WR886N路由器登录过程分析
- 夺命雷公狗ThinkPHP项目之----企业网站15之文章删除的完成(单个)
- 夺命雷公狗ThinkPHP项目之----企业网站14之文章修改页的完成
- yii2集成富文本编辑器redactor
- 小菜鸟的PHP入门笔记(一:PHP简介与数据类型)
- php基础之二 函数
- 安装PHP时的问题
- 高性能 PHP socket 框架 Workerman