带有大写和小写classname的自动加载器

时间:2009-03-20 13:28:10

标签: php autoload

我在php中使用这个类进行自动加载。 http://pastebin.com/m75f95c3b

但是当我在某个地方时

class Bar extends Foo

我有一个名为foo.class.php的文件,它找不到类。 但是,当我将文件名归为Foo.class.php时,它会找到该类。

我正在尝试向我的类中添加一些函数,以便始终找到该文件,无论文件名是否以大写字母开头。但到目前为止我还没有成功。

任何?

5 个答案:

答案 0 :(得分:5)

如果您的所有文件都有小写名称,请将strtolower应用于班级每种方法中的$className变量值:

$className = strtolower($className);

但我建议你起草一些每个开发人员必须坚持的编码指南。否则,您将必须测试使用大写和小写字母编写文件名的2 <文件名长度> 的每一种。

答案 1 :(得分:2)

Gumbo的解决方案是最好的解决方案,这几乎是每个人都使用的解决方案。我不明白你为什么不喜欢。当然,您可以先检查是否存在类名为大写的文件,如果不存在,则检查是否存在小写版本。这绝对不比Gumbo的解决方案好。毕竟“你的”程序员必须遵循一些约定/规则。

答案 2 :(得分:1)

我或多或少会这样做

function __autoload($class_name) {
    $upperName = strtoupper(substr($class_name,0,1)) . substr($class_name, 1);
    $lowerName = strtolower(substr($class_name,0,1)) . substr($class_name, 1);

    //Check to see if the class file exists as-is
    if(file_exists($class_name . '.php')) {
        require_once($class_name . '.php');
    }elseif(file_exists($upperName . '.php')) {
        require_once($upperName . '.php');
    }elseif(file_exists($lowerName . '.php')) {
        require_once($lowerName . '.php');
    }else {
        throw new Exception("The class $class_name could not be found.");
    }
}

随着不同的命名约定的出现,添加其他条件很容易。

答案 3 :(得分:0)

我使用__autoload()函数,该函数考虑了几种不同的文件命名约定,以提供与以前开发人员的向后兼容性。

它对每个约定执行一个简单的循环,并检查该文件是否存在。如果文件存在,则加载它。

对于我的函数,我为不同的文件扩展名执行此操作,例如.inc,.class或.inc.php。您可以这样做,但搜索上下第一个字符。

我会把它放在searchForClassFile()方法的else部分,注释“找到一个文件”。

编辑(更多信息):

我不是递归地下降到一个类目录中寻找正确的文件,而是将类名映射到一个特定的位置。这是一种常见的做法。例如,foo_bar映射到[CLASS_DIRECTORY]/foo/bar.[EXTENSION]。在我们的例子中,我们检查了几个不同的扩展。

在您的情况下,您必须做出关于如何搜索类文件的设计决策,但需要修改代码:

} else {
  // Found a file
  if ($f == $className . self::$classFileSuffix ||
        $f == strtolower($className) . self::classFileSuffix) {
    return $subPath;
  }
}

你可以编写一个只降低第一个字符的函数,或者使用PHP>而不是strtolower()。 5.3.0(未正式发布)使用lcfirst()函数。

答案 4 :(得分:0)

您可以使用自动加载器扫描目录中的.php文件,并使用正则表达式实际查看每个文件的内容以查找“class Foo”等模式。当然,您需要缓存此内容,最好使用class =>格式的数组。目录。您还需要确保正确使缓存无效,例如当文件夹中有新的.php文件时。

我为我的网站做这个,效果很好。