Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP创建目录中所有类的实例_Php_Function_Class_Directory - Fatal编程技术网

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

使用PHP创建目录中所有类的实例,php,function,class,directory,Php,Function,Class,Directory,我有一个包含几个PHP文件的目录,这些文件由与这些文件同名的类组成。(Sample.php的类将被称为Sample) 每个类都有一个名为OnCall()的函数 如何创建目录中每个类的实例并执行它们的所有OnCall()s 我无法手动操作($sample=new sample();$sample->OnCall();,等等),因为用户将添加、编辑和删除更多的类。这类似于 public function includeClasses($classes) { $tmpMerge = array

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

每个类都有一个名为
OnCall()
的函数

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


我无法手动操作(
$sample=new sample();$sample->OnCall();
,等等),因为用户将添加、编辑和删除更多的类。

这类似于

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);
}

您可以在目录中使用创建一个自定义循环,并获取所有必需的文件名,然后创建如下内容

如果$filename=您的文件名

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

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

类似的操作应该可以完成这项工作:

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

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

只要做:

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
)
(摘自文档)

由于,您可以使用from Composer

您首先需要添加具有以下内容的Composer文件:

编写器需要编写器/编写器
然后您可以使用:

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

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

与我的做法类似。我建议@抑制请求上的错误,然后测试访问权限。否则,错误将导致系统停止。我不确定它怎么会无法
要求该文件,因为
glob()
已经找到了它(因此它必须存在)。冲突实例(程序员错误)。我已经构建了很多次这个模式,我总是包括错误抑制+检查。就我的$0.02,因为我同意
glob()
应该是可靠的,php有时会产生“惊人”的结果。感谢您的第一次贡献!:)为了使您的答案更容易阅读,请使用,甚至添加!这很好-已经在Laravel中提供,我想在Symfony中也有;-)该组件似乎已从最新版本的Symfony中删除。是否有其他方法获得此功能?从今天起,您可以使用它
\Composer\Autoload\ClassMapGenerator
foreach (glob('../'.$GO ['name-model'].'/*.php') as $item) 
{
    require_once $item;$className =  ucfirst (basename ($item, '.php'));$class  [$className] =  new $className ();
}
extract($class);