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は、接頭辞がゼロであるため、 8進数です。これを10進数に変換すると、6180354が得られます。

詳細については、整数のマニュアルページを参照してください。

于 2009-08-14T20:33:41.300 に答える
3

最初のゼロのため、8進数として解釈されます。

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

印刷時に数値をゼロで埋めたままにする必要がある場合(常に特定の長さです)、sprintf()を使用して、格納されている整数をゼロで埋められた文字列に変換できます。

于 2009-08-14T20:33:43.547 に答える
3

PHPが数値を8進数として扱うようにするため、先行ゼロを削除します。

于 2009-08-14T20:36:48.687 に答える
2

先行ゼロを含む数値リテラルは、8進数(基数8)で何かを指定する方法です。27447002あなたが代わりに書くならあなた027447002は大丈夫でしょう。

于 2009-08-14T20:34:12.437 に答える
1

自動ベース変換。これが実際に動作していることを確認するために、そのクラスコードをすべて必要とする必要はありません。

echo 027447002;

問題は、027447002は、数値の観点から、8進数(基数8)であり、ゼロで埋められた10進数(基数10)の整数ではないということです。

于 2009-08-14T20:35:44.510 に答える
1

他のみんなが言っていること以外に一つコメントがあります。

0の数字が必要なようですよね?左側にゼロが埋め込まれた9桁の数字?

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

誰もが正しく言っているように、これはデフォルトで8進値と見なされます。クラスコンストラクターはそれが有効な整数であることをテストする必要があり、クラスを開始すると値を型キャストする必要があると思います...

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 に答える