我有一个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 AppModels;
use CoreModel;
class User extends Model {
}
在我的UserController
中,我想访问User
模型:
// app/controllers/UserController.php
namespace AppControllers;
use AppModelsUser;
class UserController {
public function index() {
$class = User::className();
echo $class; // -> 'User' and NOT 'Model'!
}
}
正如你所看到的,在控制器中,我试图在User
模型上调用一个静态方法className
,并期望由于后期的静态绑定而得到'User'
。但是,为了实现这一点,我需要确保无论何时加载User.php
类,都应该调用一个名为init
的方法(在User
的父类Model
中定义)。
如果我正在使用Composer自动加载我的类,我该如何实现这一点?(希望不修改Composer的任何内部文件)我试图在Model.php
中的文件末尾调用spl_autoload_register('init')
,但它导致了一个致命的错误。
编辑
还有十几个扩展Model.php
的类。因此,在每个文件的末尾调用<ModelClass>::init()
是过分的。有更好的方法吗?
自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: "AppModelsUser"
}
}
不需要classname()
静态方法或任何初始化。