странное поведение на php

Может ли кто-нибудь сказать мне, почему я получаю странные результаты, выполняя следующий код?

<?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) он работает нормально. Любое предложение, почему это происходит и как правильно это исправить?


person Yaniv Golan    schedule 14.08.2009    source источник


Ответы (7)


027447002 находится в восьмеричном формате, так как перед ним стоит ноль. Преобразуйте это в десятичное число, и вы получите 6180354!

Подробнее см. страницу руководства по целым числам.

person Paul Dixon    schedule 14.08.2009
comment
удивительно ... +1, насколько мне известно =) - person ; 05.01.2012

Удалите начальный нуль, потому что он заставляет PHP рассматривать число как восьмеричное.

person arsenbonbon    schedule 14.08.2009

Из-за начального нуля оно интерпретируется как восьмеричное число.

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

Если число должно быть дополнено нулями при печати (они всегда имеют определенную длину), вы можете использовать sprintf() для преобразования сохраненного целого числа в строку, дополненную нулями.

person gapple    schedule 14.08.2009

Числовые литералы с ведущими нулями - это то, как вы указываете что-то в восьмеричном формате (база 8). Если вы напишете 27447002 вместо 027447002, все будет в порядке.

person chaos    schedule 14.08.2009

Автоматическое преобразование базы. Вам даже не нужен весь этот код класса, чтобы увидеть это в действии.

echo 027447002;

Дело в том, что 027447002, с точки зрения чисел, является восьмеричным (по основанию 8) — не десятичным (по основанию 10) целым числом, заполненным нулями.

person Peter Bailey    schedule 14.08.2009

У меня есть один комментарий помимо того, что говорят все остальные.

Похоже, вам нужно число с нулевым дополнением, верно? Девятизначное число, дополненное нулями слева?

Подумайте об использовании функции 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);

Если вы выводите идентификатор, он будет дополнен

012345678

person Daniel    schedule 14.08.2009
comment
Большое спасибо за это, на самом деле я получу это число в качестве ввода от пользователя, и он, вероятно, введет ноль, поэтому мне нужно найти способ получить это число в виде строки или что-то в этом роде... :) - person Yaniv Golan; 15.08.2009
comment
Просто скажу вам, что php не различает строки. Все является строкой, и все является числом. Таким образом, если пользователь вводит число в форму, оно будет рассматриваться как число и строка, и нет необходимости преобразовывать его, кроме как убедиться, что это допустимый ввод. - person Daniel; 15.08.2009
comment
Также поищите проверки is_. Чтобы проверить числовой ввод, попробуйте is_numeric. Он сообщит вам, является ли ввод числовым. - person Daniel; 15.08.2009
comment
Наконец, ваш пример кода явно сказал php использовать восьмеричные значения (что не входило в ваши намерения). В исходном коде, если пользователь вводит 012345678 из переменной _POST/_GET на веб-странице, он будет работать КАК ОЖИДАЕТСЯ. - person Daniel; 15.08.2009
comment
Спасибо Даниэль :) ваша помощь очень ценится! Большое спасибо за ваше время - person Yaniv Golan; 15.08.2009

Как все правильно сказали - по умолчанию это считается восьмеричным значением. Я думаю, что конструктор класса должен проверять, является ли он допустимым целым числом, и инициировать класс должен приведение типа значения...

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

Надеюсь, это поможет!

person Al.    schedule 14.08.2009