【问题标题】:spl_autoload fault on remote server远程服务器上的 spl_autoload 故障
【发布时间】:2014-10-01 16:32:48
【问题描述】:

对不起我的语言不好:)

在我的本地 apache 2.2 php 5.3.13 上一切正常,但在远程服务器上(也是 php 5.3)spl_autoload 抛出逻辑异常:

致命错误:未捕获的异常“LogicException”和消息“类” System\Core\Helper\Helper 无法加载 /home/u737840143/public_html/index.php:6 堆栈跟踪:#0 /home/u737840143/public_html/index.php(6): spl_autoload('System\Core\Hel...') #1 {main} 抛出 /home/u737840143/public_html/index.php 在第 6 行

代码:

<?php

spl_autoload_extensions('.php');
spl_autoload_register();

\System\Core\Helper\Helper::getLanguage();

$router = new \System\Router\Router();
$router->init();

远程文件夹结构对应本地。

【问题讨论】:

  • 您使用的是基于 PHP 的框架吗?这是否安装在两台服务器上?
  • 调试:编辑脚本以使用 'include class_file...' 加载类文件 - 文件加载和类可用吗?如果是这样,那么您的“自动加载”是错误的。如果它没有加载,则更改“include class_file ...”直到它加载。然后整理一下'spl_loader'。
  • 不,我在这个项目中没有使用任何框架,只有 PHP。
  • Ryan,我知道自动加载是错误的,但我想知道 - 为什么?这是一个标准的 PHP 函数,它可以在我的本地服务器上正常工作,我所有的应用程序都基于这个自动加载函数!我需要在服务器上更改哪些设置才能使应用程序正常工作?
  • 您只使用了“默认自动加载器”spl-autoload,它希望通过“包含路径”上的目录查找类文件。请参阅 set-include-path 以添加到脚本中的路径。如果你使用命名空间,'symfony' 组件值得一看。上网搜索:'php auto loader symfony components'

标签: php spl-autoloader


【解决方案1】:

我找到了答案 - spl_autoloader() 在许多操作系统中无法正常使用大写字母,但在 Windows 上它运行良好。 因此,在将所有文件夹重命名为小写(是的,并在所有文件中重写命名空间......)之后,一切都开始工作了。

<?php

spl_autoload_extensions('.php');

spl_autoload_register();


try {

   \system\core\helper\Helper::getLanguage();

   $router = new \system\router\Router();
   $router->init();

} catch (\Exception $e){
   echo $e;
}

【讨论】:

  • 你为什么不相应地编写自动加载器。您无需重命名。为什么您认为 Zend Framework(和其他 ofc)可以在没有小写的 Linux 和 Windows 上运行?以\Zend_Action 为例。
  • 我使用 Windows。但是,所有命名空间、类名和“包含”都是“精确”“字母大小写完美”名称,因此它们可以在“字母大小写操作系统”(例如“unix”或变体)上工作。我有我自己的“自动类加载器”,它可以在两个操作系统上运行,并且在“字母大小写”方面没有做任何特别的事情。我使用各种其他“供应商”的东西,例如“symfony 组件”。
  • Dan,我将使用默认自动加载器,如果我想编写自己的自动加载器,我会这样做 :) Ryan,我在互联网上的某个地方找到了这个提示,重命名文件夹使我的应用程序工作正确,所以我认为这还不错。而且,如上所述,我尝试使用默认类 - 仅用于学习。
猜你喜欢
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
相关资源
最近更新 更多