PHP - 致命错误:无法访问以'\ 0'开头的属性

时间:2011-03-30 09:37:27

标签: php

这必须是我遇到错误的最奇怪的错误之一,因为在其他两个系统上完全相同的代码工作正常。

让我解释一下我的设置以及它的工作方式和位置。首先,我使用zend框架,并在第300行的Zend / View / Abstract类中抛出错误。

运行PHP 5.3.3的Windows系统 - 在这里工作正常。 运行PHP 5.3.3的Linux Centos 5.5系统 - 在这里工作正常。 运行PHP 5.3.6的Linux Centos 5.5系统 - 这个系统给了我致命的错误。

PHP - 致命错误:无法访问以'\ 0'

开头的属性

查看设置我首先认为这必须是PHP中的一个错误,但我不太确定。我首先安装了PHP 5.3.5并升级到5.3.6,但这没有帮助。

抛出错误的代码也应该起作用,所以我完全不知道为什么我在这个系统上得到错误而不是其他两个错误。

抛出错误的代码是:

$this->$key = $val;

位于以下方法中:

public function __set($key, $val)
{
        if ('_' != substr($key, 0, 1)) {
            $this->$key = $val;
            return;
        }

        require_once 'Zend/View/Exception.php';
        $e = new Zend_View_Exception('Setting private or protected class members is not allowed');
        $e->setView($this);
        throw $e;
}

非常感谢任何帮助。

我做了一些进一步的调试,它不是导致错误的变量之一。我发现当$ key变量设置为Zend_View_useViewStream时会抛出致命错误,因此我在字符串修剪之前和之后进行了vardumped。

KEY string(25) "Zend_View_useViewStream" 
TRIMMED string(24) "Zend_View_useViewStream" 

正如你所看到的,当变量没有被修剪时,字符串长度是1个字符,但它们看起来与我相同?我想是nul字节[“\ 0”(ASCII 0(0x00)),NUL字节。 ]正在被削减修剪,但为什么它被添加到这个系统而不是其他系统?

3 个答案:

答案 0 :(得分:4)

我会说这是一个地方性的东西。但很显然,这已经在当前的PHP版本中巩固了:

    if (Z_STRVAL_P(member)[0] == '\0') {
            if (!silent) {
                    if (Z_STRLEN_P(member) == 0) {
                            zend_error(E_ERROR, "Cannot access empty property");
                    } else {
                            zend_error(E_ERROR, "Cannot access property started with '\\0'");
                    }
            }
            return NULL;

所以我们可以在PHP 5.3.3到5.3.6中引入一些内容。 (我的版本是5.3.2,效果相同,但可能是一个向后移植的补丁)。在更改日志中找不到任何表明原因的内容。

无论如何,如果不确保它们不以NUL开头,则不能使用二进制属性名称。

-

PHP 5.0.0和PHP 5.1.0之间已经发生了变化:

我怀疑这就是原因:

if (prop_info_name[0] == '\0' && prop_info_name[1] != '*' && !(property_info->flags & ZEND_ACC_PRIVATE)) {
    /* we we're looking for a private prop but found a non private one of the same name */
    return FAILURE;
}

我没有看过这个,但是从那个片段我假设\0字节原本用于不同的东西,然后被禁止...

答案 1 :(得分:2)

__set()Magic Method,当您尝试设置不存在的属性时会调用该trim。如果它在Zend_View_Abstract中抛出错误,则您的一个视图正在尝试设置不存在的实例属性,并且实例属性以空字符开头。

$this->$property = $value;

你可以试试{{3}}财产

$property = trim($property);
$this->$property = $value;

我感觉有些东西试图错误地修改$this。你能跟踪视图中的代码吗?

答案 2 :(得分:0)

我不确定,但我认为$key是一个以"\0"开头的字符串。