1

有人可以告诉我为什么运行以下代码会得到奇怪的结果吗?

<?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 

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

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

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

4

7 回答 7

6

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

有关详细信息,请参阅整数手册页

于 2009-08-14T20:33:41.300 回答
3

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

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

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

于 2009-08-14T20:33:43.547 回答
3

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

于 2009-08-14T20:36:48.687 回答
2

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

于 2009-08-14T20:34:12.437 回答
1

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

echo 027447002;

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

于 2009-08-14T20:35:44.510 回答
1

除了其他人都在说什么,我还有一条评论。

看来您想要一个 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

于 2009-08-14T20:51:13.620 回答
0

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

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);

希望有帮助!

于 2009-08-14T20:50:31.187 回答