自动加载类

时间:2016-10-08 19:46:17

标签: php

我已经构建了加载另一个类的“核心”类,我想自动加载名为“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();
        }
    }

我需要这样的东西,诅咒它不起作用,它只是向你展示我想用一个例子做什么。
提前致谢。

3 个答案:

答案 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();
     }
}

您可以使用自动加载器,但如果您与其他使用自动加载器的代码集成,但是以不同的方式,这将会变得混乱。