PHP中使用中traits方式能做什么,有什么简单实例
Admin 2022-08-15 群英技术资讯 1079 次浏览
越来越多的框架和代码开始使用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.
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
今天小编就为大家分享一篇关于PHP的PDO预处理语句与存储过程,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
在本篇文章里小编给大家整理的是一篇关于php去除deprecated的实例方法,有兴趣的朋友们可以跟着学习参考下。
定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新 能够便利地创建查看目标对象状态的对象,并且提供与核心对象非耦合的指定功能
php关闭数据库的命令是“mysqli_close()”。在php中,当数据库操作完成以后,可以使用mysql_close()函数来关闭数据库连接,语法格式“mysqli_close(要关闭的MySQL连接);”。
对于php7中空合并运算符的使用做一些说明
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008