【问题标题】:PHP: How to Auto Include & Instantiate Classes?PHP:如何自动包含和实例化类?
【发布时间】:2015-04-20 04:12:56
【问题描述】:

在我的脚本的同一目录中有一个 PHP 文件列表。它们都遵循命名约定(例如 class.foo.php)。当我的脚本运行时,我希望它包含这些文件。对文件执行scandir,对结果数组中的每个项目进行测试,然后对文件进行include,这很简单。

问题是如何在我的脚本中创建这些类的实例(这也是一个类)?文件class.foo.php 将包含class Foo。我需要创建一个Foo 的实例(有时只是访问一个静态方法)。我无法在运行脚本中执行此操作,因为它不知道自动包含的类。

get_included_files 没用,因为它返回类链中所有包含的文件(我只对运行脚本中包含的类感兴趣)。

也许我用错了方法。我有什么方法可以“自动包含”类文件并在运行脚本中使用它们?

【问题讨论】:

  • 你的问题解决了吗?

标签: php oop


【解决方案1】:

创建一个自动加载函数并注册它:spl_autoload_register

一个合适的自动加载函数会在一个类被实例化时加载相应的文件。

来自 php.net 的示例:

function my_autoloader($class) {
    include 'classes/' . $class . '.class.php';
}

spl_autoload_register('my_autoloader');

【讨论】:

  • 谢谢。但是,我仍然有点困惑。如果我这样做 $a = new MyClass; 并且 MyClass 尚未包括在内,自动加载功能将尝试找到适当的文件(在您的示例中,classes/' . $class . '.class.php' 文件),这应该允许我创建该类的实例。太好了——除了我不知道这些课程是什么。我是否要为文件scandir 并从结果中创建实例(当然,我会进行必要的过滤)并且只期望自动加载器能够即时处理包括在内?
  • 你为什么不知道类或文件是什么?您在代码中使用随机文件或类?
  • 我认为值得注意的是,只要您的类的文件名与该文件定义的类的类名相同,那么您的方法将传递所有文件名以查找一个与正在搜索的类匹配的。即:@Devon 显示的上述函数将查找并加载所有 $class= 到以 .class.php 结尾的文件中声明的类名的文件。例如:filename= AclassFile.class.php && 文件“class AclassFile”中的类声明将自动提供给同一目录中的所有类
【解决方案2】:

你可以使用__autoload()魔术方法。看这个例子:

./myClass.php

<?php
class myClass {
    public function __construct() {
        echo "myClass init'ed successfuly!!!";
    }
}

?>

./index.php

<?php
// we've writen this code where we need
function __autoload($classname) {
    $filename = "./". $classname .".php";
    include_once($filename);
}

// we've called a class ***
$obj = new myClass();
?>

输出:

myClass init'ed successfuly!!!

阅读更多:

http://php.net/manual/en/function.autoload.php

【讨论】:

  • 请注意正确的方向是使用 spl_autoload_register 因为 __autoload 已被弃用
  • @FredericYesidPeñaSánchez 你能给我这个信息的链接吗?我刚刚阅读了 php 手册,但找不到有关已弃用的信息
  • 当您需要多个自动加载器时,__autoload() 会变得混乱,例如在另一个库的情况下。
  • 请阅读php.net/manual/en/language.oop5.autoload.php上的第一个提示,建议是spl_autoload_register
  • 此方法在 7.2 中已弃用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 2023-03-07
相关资源
最近更新 更多