2012-10-25 12 views
5

ja czytając podręcznik PHP i natknąłem type jugglingJak traktować jako ciąg znaków, a nie jako int w PHP

byłem zdezorientowany, bo nigdy nie natknąłem się czegoś takiego.

$foo = 5 + "10 Little Piggies"; // $foo is integer (15) 

Kiedy użyłem tego kodu to zwraca mi 15, dodaje się 10 + 5 i kiedy używać is_int() zwraca mi prawdziwe tj. 1 gdzie spodziewałem się błąd, to później odwoływać mi String conversion to numbers gdzie czytam If the string starts with valid numeric data, this will be the value used. Otherwise, the value will be 0 (zero)

$foo = 1 + "bob3";    /* $foo is int though this doesn't add up 3+1 
            but as stated this adds 1+0 */ 

teraz, co należy zrobić, jeśli chcę leczyć 10 Małe świnki ANI bob3 jako string a nie jako int. Używanie settype() również nie działa. Chcę błąd, że nie mogę dodać 5 do ciąg.

+0

-1 na pytanie, poważnie? com'on tchórz iść naprzód i odpowiedź mi, dlaczego zaniechanie moje pytanie i odpowiedzi szeregowo bez powodu? –

Odpowiedz

4

Jeśli chcesz błąd, trzeba wywołać błąd:

$string = "bob3"; 
if (is_string($string)) 
{ 
    trigger_error('Does not work on a string.'); 
} 
$foo = 1 + $string; 

Lub jeśli chcesz mieć jakiś interfejs:

class IntegerAddition 
{ 
    private $a, $b; 
    public function __construct($a, $b) { 
     if (!is_int($a)) throw new InvalidArgumentException('$a needs to be integer'); 
     if (!is_int($b)) throw new InvalidArgumentException('$b needs to be integer'); 
     $this->a = $a; $this->b = $b; 
    } 
    public function calculate() { 
     return $this->a + $this->b; 
    } 
} 

$add = new IntegerAddition(1, 'bob3'); 
echo $add->calculate(); 
+2

Vooooo, więc muszę rzucić niestandardowy błąd? –

+1

@ Mr.Alien: W zależności od potrzeb, tak. PHP nie ma typu zmiennego "string". O to właśnie chodzi w żonglerce. – hakre

+0

Lub prawdopodobnie lepiej sformułowane: PHP nie ma bezpiecznych operatorów do dodawania. – hakre

1

Jest to projekt w wyniku PHP dynamicznie typ maszynowy i oczywiście brak wyraźnego wymogu zgłoszenia typu. Typy zmiennych są określane na podstawie kontekstu.

Bazując na przykład, kiedy to zrobić:

$a = 10; 
$b = "10 Pigs"; 

$c = $a + $b // $c == (int) 20; 

Wywołanie is_int($c) wolę oczywiście zawsze oceniać na Boolean true, ponieważ PHP postanowił przekształcić wynik rachunku do liczby całkowitej.

Jeśli szukasz błędu przez tłumacza, nie dostaniesz go, ponieważ jest to, jak wspomniałem, coś wbudowanego w język. Być może trzeba napisać wiele brzydkich kodów warunkowych, aby przetestować typy danych.

Lub, jeśli chcesz to przetestować argumenty przekazane do twoich funkcji - to jedyny scenariusz, w którym mogę myśleć o tym, gdzie chcesz to zrobić - możesz zaufać klientowi wywołującemu twoją funkcję, aby wiedzieć, co to jest robić. W przeciwnym razie wartość zwracana może być po prostu udokumentowana jako niezdefiniowana.

Wiem, że pochodzę z innych platform i języków, które mogą być trudne do zaakceptowania, ale wierzę w to, że wiele wspaniałych bibliotek napisanych w PHP stosuje to samo podejście.

+0

Dzięki za szczegółowe wyjaśnienie –

Powiązane problemy