php garip davranışlar

7 Cevap php

Ben aşağıdaki kodu garip sonuçlar rurning olsun neden Bazı biri bana söyleyebilir misiniz?

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

Şimdi yankı çalıştığınızda:

$b->ID

Instead of the expected 027447002 I get an odd 6180354, but if I initiate the object like this :

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

(notice I quoted the id property) it works OK. Any suggestion why is this happening and what is the right way to fix it?

7 Cevap

Bir sıfır öneki gibi 027447002, octal içinde. Ondalık dönüştürmek olduğunu ve 6180354 olsun!

Ayrıntılar için manual page on integers bakın.

PHP sekizlik bir sayı olarak dizi tedavi yapar çünkü, baştaki sıfırı kaldırın.

Çünkü ilk sıfır, sekizlik bir sayı olarak yorumlanır.

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

Yazdırıldığında sayı sıfır ile yastıklı bırakılmalıdır (onlar her zaman belirli bir uzunlukta) sonra sprintf() sıfır yastıklı dize depolanan tamsayı dönüştürmek için kullanabilirsiniz.

Önde gelen sıfır ile Sayısal değişmezleri size sekizlik bir şey (baz 8) belirtmek nasıl vardır. Eğer 27447002 yerine yazarsanız 027447002 iyi olacak.

Otomatik temel dönüşüm. Hatta Bu eylemi görmek için tüm sınıf kod gerekmez

echo 027447002;

not, sıfır dolgulu ondalık (baz-10) tam sayıdır - şey 027447002, sayı bakımından, sekizli (baz-8) olmasıdır.

Ben herkes ne söylediğini dışında bir yorum var.

Bu doğru, bir 0 yastıklı numara istiyorum görünür? Soldaki sıfırlar ile yastıklı bir dokuz haneli bir numara?

Str_pad işlevini kullanarak düşünün. Şöyle:

...
function bank($name, $id, $bal=0)
{
 ...
 $this->id = str_pad($id, 9, '0', STR_PAD_LEFT);
 ...
}
...

Sonra fonksiyonu çağırabilir:

$b = new bank('John Doe', 12345678, 1.25);

Eğer çıkış kimliği varsa, yastıklı olurdu

012345678

Herkesin haklı olarak dediği gibi - Bu, varsayılan olarak bir sekizlik değeri olarak kabul edilir. Ben sınıf yapıcısı geçerli bir tamsayı olduğunu test ve sınıf gerektiği typecast değeri başlatılması gerektiğini düşünüyorum ...

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

Umarım ki olur!