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基類構架方法<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方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM