我已经构建了加载另一个类的“核心”类,我想自动加载名为“class”的特定文件夹中的所有类,我已经开始构建一些东西,但我不知道它是否合适。
在核心类的构造函数中,我得到一个带有要加载的类名的数组。
构造函数调用名为_loadClasses的函数,在_loadClasses函数中,我使用require_once()函数加载类。
然后在页面顶部,我正在添加具有类名称的公共变量。
例如,“public $ example;”
现在,剩下的就是创建类的对象,这就是我所做的。
_loadClasses方法的示例:
require_once("class/user.class.php");
self::$user = new User();
这是“自动机”部分。
我希望函数_loadClasses获取一个数组,例如:
private function _loadClasses( $classesToLoad = array('security', 'is') );
现在,我使用glob从文件夹“class”加载类,文件夹“class”中的classes文件的名称语法是classname.class.php。
$classesArray = array(); // initialize the variable of all the web classes
$classesFiles = glob("class/*.php"); // gets all the web classes from the folder 'class'
foreach($classesFiles as $file) { // loop on the classes in the folder 'class'
$filename = explode('class/', $file);
$filename = $filename[1];
$className = explode('.class.php', $filename);
$className = $className[0];
if($className != 'index.php' || $className != 'database') {
array_push( $classesArray, $className ); // adds the class name into the array 'classesArray'
}
}
foreach( $classesArray as $className ) {
if( in_array($className, $classesToLoad) ) {
require_once("class/$className.class.php");
$classLines = file( "class/$className.class.php" );
$classNameLine = $classLines[1];
$classNameLine = explode(' ', $classNameLine);
$classObjectName = $classNameLine[1];
$classObjectName = explode(" ", $classObjectName);
self::$$classObjectName = new $classObjectName();
}
}
我需要这样的东西,诅咒它不起作用,它只是向你展示我想用一个例子做什么。
提前致谢。
答案 0 :(得分:2)
对于这种特殊方法,我建议如下:
// Your custom class dir
define('CLASS_DIR', 'class/')
// Add your class dir to include path
set_include_path(get_include_path().PATH_SEPARATOR.CLASS_DIR);
// You can use this trick to make autoloader look for commonly used "My.class.php" type filenames
spl_autoload_extensions('.class.php');
// Use default autoload implementation
spl_autoload_register();
要开始使用,不需要为“核心”对象实现父类自动加载功能,因为它们应该只知道它们的角色功能。使用php标准库。
答案 1 :(得分:-1)
为此,您可以使用__autoload()
功能。它将在您创建新对象时调用。
__autoload($class)
{
require 'dir/to/your/classes/'. $class. '.php'
}
每个文件必须使用一个类,并将文件命名为与它们描述的类相同。
答案 2 :(得分:-1)
"它没有工作"不是一个有用的诊断。什么不起作用?错误信息是什么?它失败了哪条线?看看代码,第一个循环,虽然有点凌乱(为什么你在这个目录中有一个名为index.php的文件?为什么不只是你的* .class.php的glob?)应该可以正常工作。但第二个循环太可怕了。
首先,为什么要在一个循环中将所有文件名加载到一个数组中,然后使用第二个循环来加载其中一些?至于读取类文件以确定对象名称....单词使我失望。只需将其命名为不带.class.php的文件名
$classesFiles = glob("class/*.class.php"); // gets all the web classes from the folder 'class'
foreach($classesFiles as $file) {
$prefix=array_shift(explode('.', basename($file)));
if (in_array($prefix, $classestoload)
&& !isset($this->$prefix)) {
if (!class_exists($prefix)) {
require($file);
}
$this->$prefix=new $prefix();
}
}
您可以使用自动加载器,但如果您与其他使用自动加载器的代码集成,但是以不同的方式,这将会变得混乱。