如何在自动加载类时调用函数? (作曲)

时间:2017-01-07 19:05:21

标签: php composer-php

我有一个Model课程:

// core/Model.php
namespace Core;

class Model {

    protected static $class_name;

    // This methods needs to be called when a child class is autoloaded:
    protected static function init() {
        // Set the classname of the child class using late static binding
        static::$class_name = get_called_class();
    }

    public static function className() { return static::$class_name; }
}

User类,User扩展Model

// app/models/User.php
namespace App\Models;
use Core\Model;

class User extends Model {

}

在我的UserController中,我想访问User模型:

// app/controllers/UserController.php
namespace App\Controllers;
use App\Models\User;

class UserController {
    public function index() {
        $class = User::className();
        echo $class; // -> 'User' and NOT 'Model'!
    }
}

正如您所看到的,在控制器中我试图在className模型上调用静态方法User,并期望得到'User'作为结果归功于后期静态绑定。但是,为了实现这一点,我需要确保每加载User.php类时,一个名为init的方法(在User中定义&# 39; s父类 - Model应该被称为

如果我使用Composer自动加载我的课程,我怎样才能实现这一目标? (希望没有修改任何Composer的内部文件)我试图在spl_autoload_register('init')中的文件的最后调用Model.php但是它导致致命的错误

修改

有一些十二个更多的类扩展Model.php。因此,在每个文件的末尾调用<ModelClass>::init()会有点过分。有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

自5.5.0以来已经内置了PHP功能:

class UserController {
    public function index() {
        $class = User::class; // magic constant inside every class
        echo $class; // outputs the fully qualified class name: "App\Models\User"
    }
}

无需classname()静态方法或任何初始化。