php使用trait报错,PHP系列 | 代码复用trait的构造函数使用

在ThinkPHP5.1 框架中自己封装了一个 trait 类,每次都在控制器中使用,但是在使用框架自身的验证器类(框架控制器方法)报错

在控制器中使用自定义验证器

$param = $this->request->post();

$result = $this->validate($param, LiveValidate::class);

if (true !== $result) {

return response_json(1, $result);

}

日志错误信息:

[ error ] [0]致命错误: Call to a member function validate() on null[/var/www/www.tinywan.com/thinkphp/library/think/Controller.php:251]

以上错误就是由于应用了自定义的  trait 类导致的,如果移除该 trait 类则不会报错,加入以后就会报错。、

原因分析:

为何调用不了父类的控制器方法。由于自定义 trait 类 没有继承框架的构架方法。

解决办法:

在trait 类的构架方法中,继承父类的构架方法,解决问题

测试案例

基类控制器(模拟TP自带控制器)

class MyBaseController

{

/**

* MyBaseController constructor.

*/

public function __construct()

{

echo " MyBaseController基类构架方法
";

}

/**

* @desc: 基类-验证器

*/

public function validate()

{

echo "基类-验证器
";

}

}

自定义trait 类

trait MyTrait

{

protected $var = "MyTrait_var";

/**

* MyTrait constructor.

*/

function __construct()

{

parent::__construct();

echo "MyTrait 构架方法
";

}

/**

* @desc: 添加

*/

function create()

{

echo "MyTrait create方法
";

}

}

控制器子类,继承控制器父类 MyBaseController

class MyBaseController

{

/**

* MyBaseController constructor.

*/

public function __construct()

{

echo " MyBaseController基类构架方法
";

}

/**

* @desc: 基类-验证器

*/

public function validate()

{

echo "基类-验证器
";

}

}

调用控制器子类

public function traitsDemo()

{

$obj = new MyController();

var_dump($obj->validate());

var_dump($obj->create());

var_dump($obj->hello());

}

打印结果

MyBaseController基类构架方法

MyTrait 构架方法

基类-验证器

MyTrait create方法

MyController 子类 hello方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值