什么可能导致包含语句的PHP错误?

时间:2010-05-20 15:33:36

标签: php magento

好的,这是一个愚蠢的错误。与权限或我认为可能的任何其他事情无关。在我甚至认为没有加载的文件中,这是一个简单的语法错误。

让我想起了我曾经有过的第一位计算机科学老师的引用:

“如果您确定所有代码都是正确的,并且该程序不起作用,那么您确定的是错误的。”

抱歉鹅追。

原帖:

我的PHP代码中有一个错误,现在几天来一直在恐吓我。

我正在尝试将新模块绑定到现有的Magento(v1.4)站点,尽管我对Magento框架非常陌生。我认为我非常接近在后端显示的块上显示“Hello,World”,但是当选择菜单项时我收到500错误。

我设法将它(使用echo stmts)跟踪到Layout.php文件中的一行(app \ code \ core \ Mage \ Core \ Model \ Layout.php,第472行):

        if (class_exists($block, false) || mageFindClassFile($block)) {
            $temp = $block;
            echo "<p>before constructor: $temp</p>";
            $block = new $block($attributes);
            echo "<p>after constructor: $temp</p>";
        }

对于我的块,这只产生“在构造函数之前...”,所以我知道这是失败的。多一点调试显示$ block中的类(我试图显示的新块)不存在。我原以为__autoload函数可以解决这个问题,但__autoload中的回声都没有显示出来。

作为最后的努力,我在Mage.php中尝试了一个包含块类绝对位置的语句,但在回声之前和之后的相似内容显示包含语句成为断线。

我很想开始考虑“权限”,但我并不精通所有这些服务器管理方面,而且我对测试服务器的访问权限有限(测试服务器属于客户端)。 / p>

预测问题:PHP日志文件中没有报告错误。我实际上并不相信这个网站会向日志文件报告错误(我没有看到任何来自此网站的内容),尽管客户端确定所有内容都已打开。

IIS 7.集成模式,我很确定。任何人都知道可能导致这种情况的原因吗?

Per Joe的问题:

该块的名称为 FiveTalent_BikeCompat_Adminhtml_Block_Bikes
该类位于文件 [magento_root] \ app \ code \ local \ FiveTalent \ BikeCompat \ Adminhtml \ Block \ Bikes.php 中。 mageFindClassFile函数确认它找到了该类的文件。

我很确定我正在使用Magento的加载方法。 不可否认,路径模式与您的示例略有不同,但我认为这是因为我正在尝试创建一个Adminhtml块。 这是正在执行的控制器上的操作:

public function indexAction() {
    $this->loadLayout();
    $block = $this->getLayout()->createBlock('adminhtml/bikes', 'bikecompat');
    $this->_addContent($block);
    $this->renderLayout();
}

同样,我回到了有权读取文件的网络服务器(在本例中是IIS)的问题。 我会看看我是否无法抓住有权访问服务器的人来检查这一点。

3 个答案:

答案 0 :(得分:0)

error_log php配置指令可用于设置自定义错误日志
并且log_errors会在那里指出所有错误消息。

答案 1 :(得分:0)

__autoload中的错误将不会显示,evar。你自己在__autoload。 我会认真测试我的__autoload函数。我会检查大写错误,这可能是一个问题。

答案 2 :(得分:0)

Magento自动加载器工作得很好。请回显$ block的值并将其添加到您的问题中。您的块名称可能遵循命名约定:YourCompany_YourModule_Block_Some_Path。如果不是这样,那可能是你的错误。如果是这种情况,请确保该文件(显然,与您的类匹配的切换路径)app/code/local/YourCompany/YourModule/Block/Some/Path.php存在并包含正确的类声明。如果也是如此,请确保Apache有权读取该文件。

一旦你发现了这个问题,你可能需要考虑转向Magento的加载方法。在Magento中执行此操作的“正确”方法(再次假设上述类名称)为:

<?php
Mage::getLayout()->createBlock("yourmodule/some_path");

使用Magento加载程序可以在以后为您节省很多麻烦,并允许其他人更有把握地使用您的Magento代码。

希望有所帮助!

谢谢, 乔