加载所有类,然后执行所有现有的{classname} :: __ initiation();

时间:2015-03-24 19:06:12

标签: php function class

我想做标题中的内容。例如,我包含了我的类的所有文件:

foreach(glob("library/*.php") as $file)
    include $file;

之后我定义了所有课程。其中一些具有静态功能,例如 __ initiation 。包括之后如何执行所有这些?像这里的东西:

foreach( {classes} as $class ){
    if( function_exists( $class . '::__initiation' ) )
        $class::__initiation();
}

我想这样做是因为必须准备一些类(例如数据库连接),而某些类必须使用其他类。通常,在两个方向上(名为 foo 的类必须使用名为 bar 的启动类,而名为 bar 的类必须使用名为 foo的类)。有谁知道怎么做?

例如:

class database{
    // some stuff
    public static __initiation(){
        database::connect();
        foo::bar();
    }
}
class foo{
    // some stuff
    public static bar(){/* blah blah blah */}
    public static __initiation(){
        database::select(/* blah blah blah */);
        foo::start();
    }
}

// Execute all declared {classname}::__initiation() function right now.

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您将遇到的主要问题是文件是按字母顺序进行的。但是它们之间的依赖关系不是这样的顺序,例如bar引用foo,foo尚未加载,当加载bar时。

您知道__autoload功能吗?这是我的AutoLoader类,可以帮助您:

<?php
namespace de\g667\util;

class AutoLoader
{
    /**
     * Registers the autoload-function. All needed classes and interfaces will be
     * automatically loaded on demand.
     */
    static function register() {
        spl_autoload_register(
        function ($class) {
            $class = str_replace ("\\", "/", $class);
            $cwd = getcwd();
            $filepath = $class.'.php';
            $path = PATH . DIRECTORY_SEPARATOR . $filepath;
            if( ! file_exists($path) ){
                error_log("Autoloading $class failed");
            }
            require_once $path;
        }
        );
    }

    static function setPath($path) {
        define("PATH", $path);
    }
}
?>

将此代码保存在/library/de/g667/AutoLoader.php

使用AutoLoader:

  <?php
  require_once 'library/de/g667/util/AutoLoader.php';

  use de\g667\util\AutoLoader;

  AutoLoader::setPath("/path/to/library");
  AutoLoader::register();
  ?>

请注意,libraryFolder中的每个类都有一个文件。在AutoLoader中插入实例化函数,然后您应该能够轻松地实例化您的类。