不知道它是否可能是我想要的,但我正在开发一个需要自定义类来覆盖核心功能的应用程序,如果这些文件存在的话。
举个例子,这是我目前的文件结构(简化,没有'customer_slug')
现在我想检查“custom / User.php”是否存在,并相应地包括并使用它。它应该扩展核心(抽象)用户类。
我的“条目”脚本目前看起来像这样:
<?php
function __autoload($class_name) {
$dispatch = Dispatcher::getInstance();
$dispatch->get($class_name);
}
class Dispatcher {
private static $instance;
private static $customer_slug = 'sony';
private function __clone() {
// Empty magic function to prevent cloning
}
private function __construct() {
// Empty magic function to prevent initialization
}
public static function getInstance()
{
if (!isset(self::$instance)) {
$class = __CLASS__;
self::$instance = new $class;
}
return self::$instance;
}
public static function get($class) {
// Autoload class
$basepath = $class.'.php';
// Include bas class
include('core/'.$basepath);
// Do we have custom functionality
if (file_exists('custom/'.self::$customer_slug.'/'.$basepath)) {
include('custom/'.self::$customer_slug.'/'.$basepath);
}
}
}
$User = new User;
print_r($User);
?>
我试过摆弄命名空间,但似乎无法让它运转起来。我想继续说“$ user = new User;”。不知道我怎么称呼这个类,也许$ user = new $ custom_or_code_classname
所以我也对其他方法持开放态度。也许是一个钩子系统?
答案 0 :(得分:2)
我们使用__autoload()实现了一个解决方案。基本上你有2个变量,一个用于“app”,一个用于“client”。然后在匹配的目录中构建类。 e.g。
classes/app1/User.php
classes/app2/User.php
classes/app1/client1/User.php
等
然后在autoload fxn中构建一系列可能的路径。假设app1,client1,array将是:
$paths = array('classes/app1/client1/User.php', 'classes/app1/User.php', 'classes/User.php');
然后遍历查找file_exists()并调用require_once()。
所有课程本身都应根据他们居住的地点命名:
class User__client1__app1 extends User__client1
class User__client1 extends User__base
class User__base
因此,这里棘手的部分实际上是将正确的名称别名到根名称(用户)。
在自动加载器中,找到合适的类后,执行:
eval("class User extends $found_class { }");