喜迎
春节

php中trait的用法


trait是php的一种代码复用的方法。

用法

1. 通过use Trait类来使用

可以将一些常用的处理封装到trait类里,在其他地方直接use就可以了。
例如:封装单例
先创建Singleton类,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
trait Singleton{
private static $instance;

/**
* @param ...$args
*/
public static function getInstance(...$args) {
if (!isset(self::$instance)) {
self::$instance = new static(...$args);
}
return self::$instance;
}
}

再创建Test类,代码如下:
1
2
3
4
5
6
class Test{
use Singleton;
public function test(){
return 'test';
}
}

调用:
1
echo Test::getInstance()->test();

2. 优先级

当前类中的方法会覆盖trait方法,而trait方法用覆盖了基类中的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Base{
public function sayHello(){
echo 'Hello ';
}
}

trait SayWorld{
public function sayHello(){
parent::sayHello();
echo 'world!';
}
}

class MyHelloWorld extends Base{
use SayWorld;
}

$obj = new MyHelloWorld();
$obj->sayHello();
//output: Hello world!

3. 多个trait

通过逗号分隔,在 use 声明列出多个 trait类

常用的trait类

1. 单例类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 用作单例
* Trait Singleton
*/
trait Singleton{
private static $instance;

/**
* @param ...$args
*/
public static function getInstance(...$args){
if (!isset(self::$instance)) {
self::$instance = new static(...$args);
}
return self::$instance;
}
}

2. 错误处理类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace app\common\helper;

/**
* 错误操作类
* Trait Error
* @package app\common\helper
*/
trait Error{
private $_code;
private $_error;

protected function setError(int $code, string $msg): void{
$this->_code = $code;
$this->_error = $msg;
}

public function getError(): ?array{
return isset($this->_code) ? ['code' => $this->_code, 'msg' => $this->_error] : null;
}
}

使用方法:

1
2
3
4
5
6
7
8
9
10
class A {
use Error;
public function test(){
……
if(){
$this->setError(0, '数据不存在');
return null;
}
}
}

调用:

1
2
3
4
5
6
7
8
9
10
11
$s = new A();
$rs = $s->test();
if ($error = $s->getError()) {
extract($error);
/**
* @var $code
* @var $msg
*/
$this->setError($code, $msg);
return false;
}

参考资料

https://www.php.net/manual/zh/language.oop5.traits.php


文章作者: Crazy Boy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Crazy Boy !
评 论
 上一篇
ThinkPHP5使用笔记
ThinkPHP5使用笔记
1. 报错:Request.php中 variable type error: array 描述:如果在post请求的时候,raw内容中某个参数的值为数组,直接使用$this->request->post(‘field’);,会
2022-04-25
下一篇 
PHP使用ES
PHP使用ES
安装步骤 下载安装javahttps://www.oracle.com/java/technologies/downloads/#jdk18-windows查看版本 java -version 下载eshttps://www.elasti
2022-04-06
  目录
hexo