今天, 我在写一个脚本在 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)$产品) {见你.
留言