为什么PHP警告出现在Chrome,而不是在任何其他浏览器


Why a PHP warning appearing in Chrome but not in any other browser?

我正在用PHP编写一个web应用程序,并且我只在Google Chrome中获得以下警告:

警告:不能使用标量值作为数组M:'xampp'htdocs'MyProjectTitle'php'classes.php on line 18

背景:请注意,web应用程序在我测试的所有浏览器(Firefox, Chrome, IE)中工作得很好,但在Chrome中出现的警告让我很恼火。

注意:我已经尝试重新启动Chrome并清除Chrome缓存。我试过重新启动电脑。我试着在FF和IE中搜索源代码,看看警告是否只是隐藏,但无济于事。这个警告只在谷歌浏览器中弹出,我不知道为什么。

更新:即使Safari也使用WebKit,它也不会显示PHP警告。由于某种原因,Chrome是唯一一个有PHP警告的浏览器。奇怪的东西!

更新:这里是前21行代码:

class Presenter {
    public function includeFile($filePath) {
        if (is_readable($filePath)) {
            include $filePath;
        } else {
            echo '<p><strong>ERROR 404</strong></p>';
            echo '<p>The resource you requested could not be located.</p>';
        }
    }
    public function sanitize($string) {
        return preg_replace("/'s/","_",$string);
    }
    public function set($varname,$value) {
        $this->$varname = $value;
        $_SESSION[$this->name][$varname] = $value;
        return $this;   // enables chaining!
    }
    // And there's more code after this, but I have cut it out here.
}

注意:上面的代码在一个PHP类中。

更新:我确切地知道哪些代码行导致Chrome中的警告(尽管我仍然不知道为什么Chrome是唯一显示警告的浏览器)。由于我的webapp工作完美,尽管在Chrome浏览器的警告,我已经使用@来抑制在Chrome浏览器的警告(我将修复以后的警告)。

最有可能的是:

$_SESSION[$this->name][$varname] = $value;

如果$_SESSION[$this->name]之前没有定义为数组,您将得到"不能使用标量作为数组"错误。例如,如果你做

$_SESSION[$this->name] = 42;
$_SESSION[$this->name][$varname] = 'will not work';

错误触发

我有感觉,Chrome发送不同的数据到服务器,因此你有这个错误。如果有任何 $_POST数据,或$_GET数据,请验证与其他浏览器发送。您可以轻松地使用print_r()var_dump()显示您选择的内容。

这通常是因为你做了一些特定于浏览器的事情(也许你做了一些特定于IE和firefox的事情,但忘记为其他浏览器添加"默认"大小写?)

更新:我确切地知道哪些行代码导致Chrome中的警告(尽管我仍然不知道为什么Chrome是唯一显示警告的浏览器…如果你知道,请告诉我!)。由于我的webapp工作完美,尽管在Chrome浏览器的警告,我已经使用@来抑制警告作为临时修复,直到我可以修复它真正的以后。

这基本上是因为你试图访问一个未定义的变量(或未设置的变量)。

PHP省略了许多常见的编程错误,这是其他语言不允许的。

如果你启动一个程序:

<?php if(eregi("hi",$hello)) { echo "hi"; } ?>

将得到这个"message"注意:未定义的变量:hello在C:'var'www'test.php第1行

你应该将其预定义为:<?php $hello = "hello"; if(eregi("hi",$hello)) { echo "hi"; } ?>

或有条件地避免消除先前的值:$hello = isset($hello) ? $hello : null;

此代码还将向您发送一个已弃用的函数消息。

为什么这个消息是由你的服务器上的PHP.INI配置引起的,这是因为你有这样的东西:

display_error = on;

应该是这样的:

display_error = on;error_reporting = E_ALL &~ E_NOTICE,~代码

这将删除所有的通知消息,使PHP更允许,也可以添加~E_DEPRECATED如果你得到不赞成的消息,

如何得到这个消息,意味着你需要成为一个更敏感的程序员!是的更无聊,但总有人要做到!

可能是因为您需要在其他浏览器中执行ctrl +f5或重新启动。它可能缓存了以前版本的页面,我在使用ie8时经常遇到这种情况。