使用PHP创建目录中所有类的实例

时间:2014-02-04 18:01:40

标签: php function class directory

我有一个包含多个PHP文件的目录,这些文件由与文件同名的类组成。 (Sample.php的班级将被称为Sample。)

这些类中的每一个都有一个名为OnCall()的函数。

如何在目录中创建每个类的实例并执行所有OnCall()个?

我不能手动($sample = new Sample(); $sample->OnCall();等等),因为用户会添加,编辑和删除更多的课程。

6 个答案:

答案 0 :(得分:4)

这样的事情应该完成工作:

<?php

    foreach (glob('test/class/*.php') as $file)
    {
        require_once $file;

        // get the file name of the current file without the extension
        // which is essentially the class name
        $class = basename($file, '.php');

        if (class_exists($class))
        {
            $obj = new $class;
            $obj->OnCall();
        }
    }

答案 1 :(得分:4)

这是一个老问题,但我认为this是一个更好的解决方案。

只是这样做:

use Symfony\Component\ClassLoader\ClassMapGenerator;

var_dump(ClassMapGenerator::createMap(__DIR__.'/library'));

你得到:

Array
(
    [Acme\Foo] => /var/www/library/foo/Bar.php
    [Acme\Foo\Bar] => /var/www/library/foo/bar/Foo.php
    [Acme\Bar\Baz] => /var/www/library/bar/baz/Boo.php
    [Acme\Bar] => /var/www/library/bar/Foo.php
)

(取自文件)

答案 2 :(得分:0)

这就像是

public function includeClasses($classes) {
    $tmpMerge = array(
        "classes" => array()
    );
    foreach ($classes as $class) {
        if (file_exists("./Classes/" . $class)) {
            require_once("./Classes/" . $class);
            $classname = explode(".", $class);
            $tmpMerge['classes'][] = $classname[1];
            $this->log->info($this->conf["messages"]["class_includedClassSucessfull"] . $classname[1]);
        } else {
            // File does not exist
        }
    }
    $this->conf = array_merge($tmpMerge, $this->conf);
}

我将在该函数中直接使用该文件,是的,稍后将初始化该类。

此函数接收一个类似于以下内容的数组:

array(3) {
  [0]=>
  string(22) "class.setFunctions.php"
  [1]=>
  string(24) "class.renderFrontEnd.php"
  [2]=>
  string(22) "class.getFunctions.php"
}

它会将类名添加到一个只包含类名的新数组中。然后我会遍历类名并初始化类。

foreach ($this->conf["classes"] as $class) {
                        $this->$class = new $class($this->conf);
}

答案 3 :(得分:0)

您在目录中创建一个自定义循环并获取所有必需的文件名,然后进行类似的操作。

如果$ filename =您的文件名

require_once $filename;
$className = basename($filename, ".php");
$class = new $className;
$class->OnCall();

另一种解决方案是将所有必需的文件名存储在数组中,然后循环其数组。

答案 4 :(得分:0)

Symfony ClassLoader component is deprecated 开始,您可以使用 Composer 的 ClassMapGenerator

您首先需要添加 Composer 文件:

composer require composer/composer

然后你可以使用:

$map = ClassMapGenerator::createMap(__DIR__ . '/mydirectory');

您将获得具有完全限定名称和文件路径的相关关联表。

答案 5 :(得分:-2)

foreach (glob('../'.$GO ['name-model'].'/*.php') as $item) 
{
    require_once $item;$className =  ucfirst (basename ($item, '.php'));$class  [$className] =  new $className ();
}
extract($class);