有人可以告诉我为什么我在以下代码中得到奇怪的结果?
<?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属性)它运行正常。 任何建议为什么会发生这种情况以及解决问题的正确方法是什么?
答案 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);
希望有所帮助!