今天, 我在写一个脚本在 PHP 使用在命令行中,当遇到了意外的行为 (至少对我而言).
该脚本应接收三个参数, 其中最后一个包含一个或多个数字代码列表.
尝试验证此最后一个参数得到一个不同的结果,比想象中.
看到我正在使用的代码片段:

// test.php
如果 (php_sapi_name() = = 'cli') {
    $di = 设定($argv[1]) ? $argv[1] : 日期(' Y-m-' d); // 初始日期
    $df = 已设置($argv[2]) ? $argv[2] : 日期(' Y-m-' d); // 最终日期
    $prods = 已设置($argv[3]) ? 爆炸(',', $argv[3]) : 数组(); // 代码列表

    ##### 验证
    // 初始日期
    如果 ($迪 != 日期(' Y-m-' d, strtotime($迪))) {
        回声 "\n";
        回声 "错误! 初始日期无效!\n";
        退出;
    }
    // 最终日期
    如果 ($df != 日期(' Y-m-' d, strtotime($df))) {
        回声 "\n";
        回声 "错误! 无效的最后日期!\n";
        退出;    
    }

    // 代码
    如果 (计数($电棒) >; 0) {
        foreach ($作为 $prod 刺) {
            如果 ($产品 != (int)$产品) {
                回声 "\n";
                回声 "错误! 代码 " . $产品 . " 是无效的!\n" ;
                退出;
            }
        }
    }
    回声 "完成!";
}

有趣的是, 当我跑

# php-f test.php 2015-12-10 2015-12-11 33b

其结果是

# 完成

并将条件反转

        如果 ($刺激 = = (int)$产品)

显示预期的消息.
我试图将分配给单独的变量和仍然不工作.

            $检查 = (int) $产品;
            如果 ($产品 !$check =) {

为什么??

类型比较

!==

不能在这里使用, 因为所有参数都将都是字符串. 当我虽然关于这我得到了答案.

所以我做了一些命令行测试,并检查了PHP比较的实际行为.

当我们做一样的事情:

$字符串 = = $integer

PHP在比较之前总是会将字符串转换为另一种类型, 因此,代码

$字符串 = = (int) $字符串

总是会返回真, 自 $字符串 将更改为 int 在两边都是.

为了避免这种麻烦, 在比较的两边具有相同类型是必要的.

            $conf = (int) $产品;
            如果 ($产品 != (字符串) $conf) {
            // 或者
            如果 ($产品 != (字符串)(int)$产品) {

见你.

留言

您的电子邮件地址将不会发布. 标记必填的字段 *