在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基类构架方法<br/>";
} /**
* @desc: 基类-验证器
*/
public function validate()
{
echo "基类-验证器 <br/>";
}
}

自定义trait 类

trait MyTrait
{
protected $var = "MyTrait_var"; /**
* MyTrait constructor.
*/
function __construct()
{
parent::__construct();
echo "MyTrait 构架方法 <br/>";
} /**
* @desc: 添加
*/
function create()
{
echo "MyTrait create方法 <br/>";
}
}

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

class MyBaseController
{
/**
* MyBaseController constructor.
*/
public function __construct()
{
echo " MyBaseController基类构架方法<br/>";
} /**
* @desc: 基类-验证器
*/
public function validate()
{
echo "基类-验证器 <br/>";
}
}

调用控制器子类

public function traitsDemo()
{
$obj = new MyController();
var_dump($obj->validate());
var_dump($obj->create());
var_dump($obj->hello());
}

打印结果

MyBaseController基类构架方法

MyTrait 构架方法

基类-验证器

MyTrait create方法

MyController 子类 hello方法

PHP系列 | 代码复用trait的构造函数使用的更多相关文章

  1. 深入理解JavaScript系列(46):代码复用模式(推荐篇)

    介绍 本文介绍的四种代码复用模式都是最佳实践,推荐大家在编程的过程中使用. 模式1:原型继承 原型继承是让父对象作为子对象的原型,从而达到继承的目的: function object(o) { fun ...

  2. 深入理解JavaScript系列(45):代码复用模式(避免篇)

    介绍 任何编程都提出代码复用,否则话每次开发一个新程序或者写一个新功能都要全新编写的话,那就歇菜了,但是代码复用也是有好要坏,接下来的两篇文章我们将针对代码复用来进行讨论,第一篇文避免篇,指的是要尽量 ...

  3. php5.4.0以后加入trait实现代码复用【摘录】

    在http://www.php.net/manual/zh/language.oop5.traits.php 查看了一下5.4.0提供的特性trait顺便做一个标记(总结): 首先要明确trait和类 ...

  4. PHP代码的多继承 -》 PHP代码复用新的姿势 trait

    本文参考:  http://php.net/language.oop5.traits 一.什么是trait 从PHP 5.4.0 开始 PHP 实现了一种新的代码复用方式 trait. 二.trait ...

  5. PHP 实现了一种代码复用的方法,称为 trait

    自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait. Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.Trait 为了减少单继承语言的限制,使开发人员能 ...

  6. Atitit 代码复用的理解attilax总结

    Atitit 代码复用的理解attilax总结 1.1. 继承1 1.1.1. 模式1:原型继承1 1.1.2. 模式2:复制所有属性进行继承 拷贝继承1 1.1.3. 模式3:混合(mix-in)1 ...

  7. javascript 模式(1)——代码复用

    程序的开发离不开代码的复用,通过代码复用可以减少开发和维护成本,在谈及代码复用的时候,会首先想到继承性,但继承并不是解决代码复用的唯一方式,还有其他的复用模式比如对象组合.本节将会讲解多种继承模式以实 ...

  8. 《JavaScript模式》第6章 代码复用模式

    @by Ruth92(转载请注明出处) 第6章:代码复用模式 GoF 在其著作中提出的有关创建对象的建议原则: -- 优先使用对象组合,而不是类继承. 传统模式:使用类继承: 现代模式:"类 ...

  9. javascript代码复用模式(二)

    前面说到,javascript的代码复用模式,可分为类式继承和非类式继承(现代继承).这篇就继续类式继承. 类式继承模式-借用构造函数 使用借用构造函数的方法,可以从子构造函数得到父构造函数传任意数量 ...

随机推荐

  1. JavaScript 事件(基础)

    一.事件 事件:触发-响应机制. 二.事件三要素 1.事件源:触发事件的元素 2.事件名称:发送了什么方式的事件 3.事件处理程序:事件触发后要执行的代码(函数形式) 三.事件的使用方式 1.获取元素 ...

  2. android解析xml (pull)

    1. xml <persons> <person id="18"> <name>furong</name> <age>2 ...

  3. 【前端_js】array.forEach和$.each()及$().each()的用法与区别

    1.$.each():方法是jQuery中的方法,用于遍历数组或对象.用法:$.each(array,function(index,value){...}),有两个参数,第一个为待遍历的数组或对象,第 ...

  4. expect免交互用法

    一.ssh免交互远程连接linux服务器 ssh在远程连接linux系统时,会有交互,比如输入yes/no,或者需要输入密码.我们怎么避免这些交互呢!比如我们可以用telnet远程登录交换机,去备份交 ...

  5. C++网站学习

    0.C++   一个专门做C++的网站 一.以下内容来自LEARN C++ 的<更好编写C++程序的5个建议>部分 1.C++的一些标准: Coding Standards C++ Cor ...

  6. 项目Beta冲刺--7/7

    项目Beta冲刺--7/7 作业要求 这个作业属于哪个课程 软件工程1916-W(福州大学) 这个作业要求在哪里 项目Beta冲刺 团队名称 基于云的胜利冲锋队 项目名称 云评:高校学生成绩综合评估及 ...

  7. 项目Beta冲刺(团队7/7)

    项目Beta冲刺(团队) --7/7 作业要求: 项目Beta冲刺(团队) 1.团队信息 团队名 :男上加男 成员信息 : 队员学号 队员姓名 个人博客地址 备注 221600427 Alicesft ...

  8. 前端重定向,index.html文件被浏览器缓存,导致整个应用都是旧的

    解决方法:https://github.com/ant-design/ant-design-pro/issues/1365#issuecomment-384496088

  9. Linux SSH 连接安全设置

    一.更换端口, 可以在一定程度上防止扫描攻击 vim /etc/ssh/sshd_config 将 port 一项从 22 更改为高位端口, 然后重启 ssh 服务 systemctl restart ...

  10. "<<"和“>>”运算