我有一个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()
会有点过分。有更好的方法吗?
答案 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()
静态方法或任何初始化。