分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

php中traits学习笔记

发布时间:2023-09-06 01:49责任编辑:赖小花关键词:暂无标签
 

traits学习

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

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

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

单个的例子:

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

多个trait的例子:

<?phptrait 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 操作符来明确指定使用冲突方法中的哪一个。例如:

<?phptrait 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:

<?phpnamespace 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学习笔记

原文地址:https://www.cnblogs.com/piwefei/p/8819548.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved