PHP和未定义的变量策略

tru*_*ru7 14 php variables undefined

我是一个以PHP开头的C++程序员.我发现由于未定义的变量,我失去了大部分调试时间(和我的自尊!).据我所知,处理它们的唯一方法是在执行时观察输出.

其他策略是否注意到这些错误?(类似于C++,单个编译为您提供了所需的所有线索)

感谢您的任何见解

cbe*_*ski 10

这是PHP的常见抱怨.以下是一些想法:

  1. 使用代码分析工具.许多IDE,如Netbeans也会有所帮助.

  2. 只需运行代码. PHP没有像C++那样昂贵的编译步骤.

  3. 使用单元测试.常见的副作用包括:更好的代码.

  4. error_reporting(-1)在您的ini文件中设置或等效.

  5. 获取xdebug.这不是预防性的,但堆栈跟踪有助于消除错误.

  6. isset(),=== null(身份运营商)和保护条款是你的朋友.

松散和动态的打字是该语言的一个特征.仅仅因为PHP 对打字严格并不意味着你不可能.如果它真的让你感到烦恼并且你有一个选择,那么你可以尝试使用Python - 它对打字有点严格.


Mch*_*chl 6

将E_NOTICE消息记录到文本文件中.然后,您可以使用自动脚本处理日志,以指示引发这些脚本的文件和行.

  • 这是肯定的.浏览/解析日志只是"观察输出"的"改进"版本,以捕获来自遗留代码的错误,或者那些以某种方式滑入新代码的错误. (2认同)

Art*_*cto 5

不可以.在PHP中,您只能在尝试访问变量时才知道变量不存在.

考虑:

if ($data = file('my_file.txt')) {
    if (count($data) >= 0)
        $line = reset($data);
}
var_dump($line);
Run Code Online (Sandbox Code Playgroud)

您必须重新构建代码,以便所有代码路径都可以定义变量,例如:

$line = "default value";
if ($data = file('my_file.txt')) {
    if (count($data) >= 0)
        $line = reset($data);
}
var_dump($line);
Run Code Online (Sandbox Code Playgroud)

如果没有任何默认值,这仍然比isset你在最后的变量名中输入拼写错误时会发出警告更好if:

$line = null;
if ($data = file('my_file.txt')) {
    if (count($data) >= 0)
        $line = reset($data);
}
if ($line !== null) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用isset1来检查给定点是否存在变量.但是,如果您的代码依赖于此,那么它的结构可能很差.我的观点是,与例如C/Java相反,在编译时,您无法确定对变量的访问是否有效.由于PHP中的块作用域不存在,这会变得更糟.

1严格来说,isset不会告诉您是否设置了变量,它会告诉您它是否已设置且不为空.否则,你需要get_defined_vars.

  • +1:来自C++背景,这应该是习惯.这将防止大量的错误.至于0是一个垃圾值,它根本不存在,因为你知道如果它是0,它还没有被定义.我个人在使用之前声明所有变量.这是一个好习惯,并且很少会导致错误(只要你不做任何愚蠢的事情,比如声明一个int然后再重新分配一个对象)...... (3认同)