spl_autoload_extensions 不加载类

问题描述 投票:0回答:1

此代码在我的开发机器(Windows)上运行良好,但在服务器上无法加载类:

set_include_path(get_include_path() . PATH_SEPARATOR . 'class/');
spl_autoload_extensions('.class.php');
spl_autoload_register();

我已经检查了包含路径,看起来没问题。我还尝试包含绝对路径:

$application_root = $_SERVER['DOCUMENT_ROOT'];
set_include_path(get_include_path() . PATH_SEPARATOR . $application_root.'/class/');

结果大致相同:类未加载;

但这有效:

$autoloader = function( $class_name )
{
  $application_root = $_SERVER['DOCUMENT_ROOT'];
  $filename = $application_root . '/class/' . str_replace( '\\', '/', $class_name)  . '.class.php';
  require_once $filename;
};

spl_autoload_register( $autoloader );

但没有那么优雅。

如何让 spl_autoload_extensions 在我的生产机器上运行?

总结

不工作;

set_include_path(get_include_path() . PATH_SEPARATOR .getenv('DOCUMENT_ROOT').'/class');
spl_autoload_extensions('.class.php');
$filter = new Filter();

有了

get_include_path()
,我确实得到了完整的路径
".:/usr/share/pear:/usr/share/php:/home/httpd/vhosts/_hidden_/httpsdocs/class"
。我收到致命错误:未找到“过滤器”类。

工作中:

include getenv('DOCUMENT_ROOT').'/class/Filter.class.php';
$filter = new Filter();
php classloader
1个回答
0
投票

解决了

向我暗示的是 Windows 操作系统上不区分大小写(顺便说一句,文件系统是这样的。),其中 linux not 忽略大小写。 php.net 上的文档有时特别不清楚或不完整。它没有说的是,它对生成的文件(甚至路径)名称执行

strtolower

我必须将我的类文件

Filter.class.php
YearFilter.class.php
重命名为
filter.class.php
yearfilter.class.php
等等,但同时保留类名
abstract class Filter {}
class Yearfilter{}
扩展 Filter`类已加载。

我也不同意@WinterSilence。 spl_autoload_register() 必须至少调用一次,否则类文件不会加载。

重命名类文件

将我的所有类文件重命名为仅包含小写字符后,以下代码有效。

<?php
spl_autoload_register();

set_include_path(get_include_path() . PATH_SEPARATOR . 'class/');
spl_autoload_extensions('.class.php');

$f = new Filter();

我知道它是通过 php 抱怨 Filter 是抽象的来工作的。

超越内置自动加载器:

无需重命名类文件(这很愚蠢,并且会导致未来的错误)。顺便说一句,spl_autoload_extensions 没有任何效果:

<?php

set_include_path(get_include_path() . PATH_SEPARATOR . 'class/');
spl_autoload_extensions('.class.php');
spl_autoload_register(function($class_name) { require_once( $class_name.'.class.php' );},true);
$f = new Filter();

顺便说一句这已经被归档为错误并标记为

will not fix
,因为它将破坏依赖于它的有缺陷的php代码。尽管存在补丁,但似乎尚未在当前的 PHP 版本中实现。

编辑:顺便说一句,这种行为没有被修复的主要原因是,尽管其他一切都是如此,但在 php 中,类名和函数名都不区分大小写。

class FooBar{}
等于
class FOOBAR{}
等于
foorbar{}
。类名不区分大小写,让文件名反映内容是没有意义的,因为它不能,真的。
一个完整的例子

enter code here

© www.soinside.com 2019 - 2024. All rights reserved.