【问题标题】:Can PHP throw an error instead of autocasting strings to numbers?PHP可以抛出错误而不是将字符串自动转换为数字吗?
【发布时间】:2013-12-04 15:06:44
【问题描述】:

我正在编写应用程序的 JavaScript 和 PHP,但由于诸如 $desc = $row[0] + " - " + $row[1]; 之类的拼写错误,诸如描述之类的错误会显示为“0”,这让我很恼火。

PHP 是否有禁用自动将字符串转换为数字的设置,所以我在最后一刻没有注意到那些拼写错误?

【问题讨论】:

  • 例子不清楚$desc = $row[0] + " - " + $row[1];。如果这应该是 PHP,那是不正确的。
  • 看起来像 php 和 javascript 在同一行中的混合
  • 您是否正在寻找能够消除因拼写错误引起的问题的 PHP 功能?
  • 使用+ 代替. 不是错字。
  • @CeesTimmerman 我猜你真正寻找的是不错的静态代码分析器(用于 PHP/JS)。有some

标签: php implicit-conversion type-conversion


【解决方案1】:

没有; PHP lovesautoconvert strings:

<?php
$foo = 1 + "10.5";                // $foo is float (11.5)
$foo = 1 + "-1.3e3";              // $foo is float (-1299)
$foo = 1 + "bob-1.3e3";           // $foo is integer (1)
$foo = 1 + "bob3";                // $foo is integer (1)
$foo = 1 + "10 Small Pigs";       // $foo is integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
$foo = "10.0 pigs " + 1;          // $foo is float (11)
$foo = "10.0 pigs " + 1.0;        // $foo is float (11)     
?>

正如commentedmanual code scanning 可以检测到这样的荒谬案例,并且可以通过挂钩保存来自动化。 PHPLint on-line 免费且易于使用:

PHPLint report

PHPLint 1.1_20130803
Copyright 2013 by icosaedro.it di Umberto Salsi
This is free software; see the license for copying conditions.
More info: http://www.icosaedro.it/phplint/


BEGIN parsing of test-p4Gx1L
1:      <?php
2:      $a = "Hi ";
3:      $b = "Bob";
4:      $c = $a + $b;

        $c = $a + $b;
                     \_ HERE
==== 4: ERROR: `EXPR + ...': expected number or array but found string

        $c = $a + $b;
                     \_ HERE
==== 4: ERROR: `... + EXPR': expected number or array but found string
5:      
6:      echo $c;
7:      ?>
END parsing of test-p4Gx1L
==== ?: notice: unused package `stdlib/dummy.php'
==== ?: notice: unused module `mysql'
==== ?: notice: unused module `pcre'
==== ?: notice: required module `standard'
Overall test results: 2 errors, 0 warnings.

不过,与 MySQL 对话仍然可以产生 unexpected results

【讨论】:

    【解决方案2】:

    您可以牺牲一些性能来获得一些一致性并使用 PHP 的 sprintf()sprintf.js

    【讨论】:

    • 在我回答之前在想“是不是有一个我在php中使用过很多的concat函数......?”。
    • 在google之前我并不知道sprint.js的存在。我很高兴它确实存在,虽然它是原生的 javascript 会更好。
    【解决方案3】:

    + 而不是 . 没有错,只是不是你想要的。 如果你对此有很大的问题,你总是可以使用自己的 concat 函数来代替,比如:

    <?php
    function concatString(){
       $list = $arglist = func_get_args();
       $ret = "";
       for($i=0;$i<count($arglist);$i++){
         $ret .= $arglist[$i];
       }
       return $ret;
    }
    echo concatString("Test", "test2", $anotherVar);
    

    【讨论】:

    • 谢谢,但我不想再把 PHP 搞砸了。
    【解决方案4】:

    如果你想得到一个,请使用$desc = $row[0] . " - " . $row[1];

    【讨论】:

    • 这就是我应该输入的内容。相反,我使用了 JavaScript 连接语法,这是一个打字员错误,因此是一个“错字”。
    猜你喜欢
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 2014-04-24
    • 2016-11-01
    • 2017-05-25
    • 1970-01-01
    相关资源
    最近更新 更多