【问题标题】:strange behaviour on phpphp上的奇怪行为
【发布时间】:2009-08-14 20:31:54
【问题描述】:

谁能告诉我为什么运行以下代码会得到奇怪的结果?

<?php
class Bank
{
    var $ID;
    var $balance;
    var $name;
    function bank($name,$id,$balance=0)
    {
        $this->ID=$id;
        $this->balance=$balance;
        $this->name=$name;
    }
    function getBalance()
    {
        return $this->balance;
    }
    function setBalance($bal)
    {
        $this->balance=$bal;
    }
    function getId()
    {
        return $this->ID;
    }
    function setId($i)
    {
        $this->ID=$i;
    }
)
$b= new bank(yaniv,027447002, 15000);

现在当我尝试回显时:

$b->ID 

我得到一个奇怪的 6180354,而不是预期的 027447002, 但是如果我像这样启动对象:

$b=new bank(yaniv,'027447002',15000);

(注意我引用了 id 属性)它工作正常。 任何建议为什么会发生这种情况以及解决它的正确方法是什么?

【问题讨论】:

    标签: php string oop octal


    【解决方案1】:

    027447002 在octal 中,因为它的前缀是零。将其转换为十进制,您将得到 6180354!

    详情请参阅manual page on integers

    【讨论】:

    • 太棒了...+1 据我所知 =)
    【解决方案2】:

    删除前导零,因为它使 PHP 将数字视为八进制数。

    【讨论】:

      【解决方案3】:

      由于初始为零,它被解释为八进制数。

      http://www.php.net/manual/en/language.types.integer.php

      如果数字在打印时应该用零填充(它们始终是特定长度),那么您可以使用 sprintf() 将存储的整数转换为填充零的字符串。

      【讨论】:

        【解决方案4】:

        带有前导零的数字文字是您在八进制(以 8 为基数)中指定内容的方式。如果你写 27447002 而不是 027447002 你会没事的。

        【讨论】:

          【解决方案5】:

          自动基础转换。你甚至不需要所有的类代码就能看到它的实际效果

          echo 027447002;
          

          问题是 027447002,就数字而言,是八进制(以 8 为基数)- 不是零填充十进制(以 10 为基数)整数。

          【讨论】:

            【解决方案6】:

            除了其他人所说的之外,我还有一条评论。

            看来您想要一个 0 填充数字,对吧?左边用零填充的九位数字?

            考虑使用 str_pad 函数。像这样:

            ...
            function bank($name, $id, $bal=0)
            {
             ...
             $this->id = str_pad($id, 9, '0', STR_PAD_LEFT);
             ...
            }
            ...
            

            然后在你的函数中你可以调用:

            $b = new bank('John Doe', 12345678, 1.25);
            

            如果你输出id,它会被填充

            012345678

            【讨论】:

            • 非常感谢,实际上我将从用户那里得到这个数字作为输入,他可能会输入零,所以我需要找到一种方法将该数字作为字符串或其他东西像那样... :)
            • 只是告诉你,php 不区分字符串。一切都是字符串,一切都是数字。因此,如果用户在表单上输入“数字”,它将被视为数字和字符串,除了确保它是有效输入外,无需“转换”。
            • 另外,查看 is_ 检查。要检查数字输入,请尝试 is_numeric。它会告诉您输入是否为数字。
            • 最后,您的示例代码明确告诉 php 使用八进制值(这不是您的意图)。在原始代码中,如果用户从网页上的 _POST/_GET 变量中输入 012345678,它将按预期工作
            • 谢谢丹尼尔 :) 非常感谢您的帮助!非常感谢您的宝贵时间
            【解决方案7】:

            正如每个人所说的那样 - 默认情况下这被认为是八进制值。我认为类构造函数应该测试它是一个有效的整数,并且初始化类应该typecast这个值...

            function bank($name, $id, $balance=0)
            {
                if (is_int($id))
                  $this->ID=$id;
                else
                  throw new Exception('ID is not integer');
            
                // and validate these too!
                $this->balance=$balance;
                $this->name=$name;
            }
            
            $b= new bank('yaniv', (int)027447002, 15000);
            

            希望有帮助!

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-04-20
              • 1970-01-01
              • 2014-07-08
              • 2013-08-09
              • 2021-11-21
              • 2018-05-20
              • 2012-01-07
              • 1970-01-01
              相关资源
              最近更新 更多