php上的奇怪行为

时间:2009-08-14 20:31:55

标签: php string oop octal

有人可以告诉我为什么我在以下代码中得到奇怪的结果?

<?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属性)它运行正常。 任何建议为什么会发生这种情况以及解决问题的正确方法是什么?

7 个答案:

答案 0 :(得分:6)

027447002位于octal,因为它以零为前缀。将其转换为十进制,你得到6180354!

有关详细信息,请参阅manual page on integers

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

自动基本转换。您甚至不需要所有类代码来查看此操作

echo 027447002;

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

答案 5 :(得分: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

答案 6 :(得分:0)

正如大家所说 - 默认情况下,这被视为八进制值。我认为类构造函数应该测试它是一个有效的整数,并且启动该类应该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);

希望有所帮助!