我打算使用PHP的自动加载功能,动态地加载需要,只有类文件。 现在,这可以创建一个巨大的混乱,如果每一个功能都有一个单独的文件,所以我希望和要求是有办法有相关的类留在1个的文件,仍然是自动加载
function __autoload($class_name){
include('classes/' . $class_name . '.class.php');
}
比方说,有一类动物的名字,然后又狗类命名。 狗类扩展动物类,现在如果我叫的狗类,但不叫动物类,将动物类文件仍然可以加载?
如果我是叫狗类,但不叫动物类,将动物类文件仍然可以加载?
是。 当装载扩展另一个类的类,PHP必须因此它知道它的延伸称重的基类。
回复:这不会与你所提供的自动加载功能工作:存储多个类,每个文件的想法。 每个文件一类是真正的最佳实践,特别是对于自动加载类。
如果你在一个文件中多个类,你真的不应该从该文件试图自动加载任何类。
你有没有考虑过你的类位置的明确定义是什么? 有时,它使一个很大的意义相关的类。
这里是把它处理一个行之有效的方法。
这个代码被放置在auto_prepend_file
(或第一内含)
class Import
{
public static $_AutoLoad = array();
public static $_Imported = array();
public static function Load($sName)
{
if(! isset(self::$_AutoLoad[$sName]))
throw new ImportError("Cannot import module with name '$sName'.");
if(! isset(self::$_Imported[$sName]))
{
self::$_Imported[$sName] = True;
require(self::$_AutoLoad[$sName]);
}
}
public static function Push($sName, $sPath)
{
self::$_AutoLoad[$sName] = $sPath;
}
public static function Auto()
{
function __autoload($sClass)
{
Import::Load($sClass);
}
}
}
而在你的引导文件,定义类,它们是在什么文件。
//Define autoload items
Import::Push('Admin_Layout', App::$Path . '/PHP/Admin_Layout.php');
Import::Push('Admin_Layout_Dialog', App::$Path . '/PHP/Admin_Layout.php');
Import::Push('FileClient', App::$Path . '/PHP/FileClient.php');
最后,通过调用实现自动加载
Import::Auto()
其中的好处之一是,你可以定义“模块”:
Import::Push('MyModule', App::$Path . '/Module/MyModule/Init.php');
然后在需要时明确加载它们:
Import::Load('MyModule');
而最好的部分之一就是你可以有更多的Import::Push
模块,这将确定在运行时其所有类别的线。
是的,它会加载,除非你不包括/需要的类文件。
你必须始终导入包含所需的PHP代码的任何文件。 PHP本身并不能猜到你给你的类文件的名称。 与Java例如,PHP没有任何文件命名为班级的要求。
常见的方式,以便解决这个问题是在一个单一的文件相关的类。 创建一个“模块”。
有一个解决办法,我只是用它,它似乎工作:
假设我们已经存储在animals.class.php称为动物的自动加载类。 在同一个文件,你可以有其他类扩展的动物
class animals{
static function load(){
return true;
}
}
class dogs extends animals{
}
class cats extends animals{
}
现在...当你需要使用你的类dogs
,你需要PHP自动加载它的父类(这样你确定它也将分析所有同一个文件内extendend类),所以你只需要编写:
animals::load();
$fuffy = new dogs();