使用PHP创建目录中所有类的实例
我有一个包含几个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
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);