Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]isint || (int)
Forum PHP.pl > Forum > Przedszkole
-marshal-
witam

czy uzywanie if(isint($var)) jest rownoznaczne z if((int)$var)? Jak sie domyslam, drugi sposob ma przewage pod wzgledem wydajnosci?

Chodzi mi o uzywanie tego do walidacji danych od usera.
blooregard
Nie jest.

is_int() sprawdza, czy zmienna jest typu int.
(int)$var RZUTUJE zmienną do int-a - w przypadku float po prostu ucina część ułamkową, jeśli float mieści się w zakresie przewidzianym architekturą dla liczby całkowitej (jeśli jest większy, wynik takiego rzutowania jest nieokreślony).

Na przykładzie zmiennej typu float można sprawdzić, że is_int($var) != (int)$var

  1. $var = 1.23;
  2.  
  3. if (is_int($var)) echo "pierwszy warunek true<br />";
  4. if ((int)$var) echo "drugi warunek true<br />";



wynik:
Cytat
drugi warunek true
-marshal-
Dzieki za odpowiedz

do walidacji w sumie mozna by bylo tego uzywac, prawda?
blooregard
Tak, jeśli spodziewasz się zmiennej liczbowej typu całkowitego, is_int() załatwia sprawę smile.gif
by_ikar
Do walidacji danych używaj is_numeric(); jeden z mankamentów dynamicznego typowania.

Kod
<?php

var_dump(is_int(2423)); //true
var_dump(is_int('2423')); //false

var_dump(is_numeric(2423)); //true
var_dump(is_numeric('2423')); //true
Crozin
@by_ikar: is_numeric zwróci TRUE również w przypadku wartości 11e4, a to w większości takich przypadków jest niepożądane.
croc
Pamiętajcie, że taka instrukcja:

  1. echo is_int('1') ? 'TAK' : 'NIE';


Wypisze nam NIE. Dlatego w PHP funkcja is_int nie nadaje się do walidacji danych, które przeważnie są łańcuchem znaków. is_numeric też się nie nadaje, z powodów które podał kolega powyżej.

Ja napisałem sobie taką prostą funkcję:

  1. function is_integer_2($value) { // głupia nazwa funkcji, nie? :)
  2. return preg_match('/^[1-9][0-9]*$/', $value);
  3. }


Ta funkcja odrzuci też wartości z zerami wiodącymi, które dla mnie liczbami nie są.
Crozin
@croc: Pomijając fakt, że użycie wyrażeń regularnych do czegoś takiego jest po prostu głupie (w momencie gdy wystarczy return $val == (int) $val;) to na prawdę uważasz, że 0 czy -5 to nie są liczby całkowite?
nospor
@Crozin drzazgę w oku u brata swego widzisz, a belki we własnym nie dostrzegasz...
  1. $val = '4r';
  2. if ($val == (int) $val) echo 'ok';

wink.gif

ps: dla potomnych
  1. $val = '4r';
  2. if ($val === (string)(int) $val) echo 'ok';


a jesli dane nie będą szły wyłącznie z forma, to wówczas można dodac jeszcze (string) do lewej strony
  1. $val = '4r';
  2. if ((string)$val === (string)(int) $val) echo 'ok';

croc
Masz rację, ja tego używałem do sprawdzania ID. Funkcja powinna się nazywać is_natural_number tongue.gif

nospor - Twoja wersja też jest nie teges biggrin.gif Sprawdź dla $var = 4.
kaem
Najlepiej jak croc napisał używać wyrażeń regularnych. Ja mam tak
  1. return (!preg_match(self::$regExp['integer'], $var)) ? false : true;
, gdzie $regExp['integer'] ma wartość '/^[0-9]+$/'. Jeśli liczba będzie miała jakieś zera na początku to i tak zostanę one 'olane'.
Ewentualnie do walidacji polecam zapoznać się z wbudowaną w php funkcją filter_var .
nospor
@kaem twoje wyrażenie leje na liczby ujemne, o których wspominał Crozin

@croc
po pierwsze: mowa tu o danych z forma, które zawsze są tekstem
po drugie: sprawdź edita, który był zanim pojawił się twój post tongue.gif
croc
Zastanawia mnie tylko czy takie żonglowanie typami danych nie jest powolniejsze od wyrażeń regularnych biggrin.gif Może zrobimy teścik?
Crozin
@nospor: Ah, mój błąd. Durne rzutowanie na INT przy porównywaniu. Właśnie sobie przypomniałem dlaczego nie znoszę tak dynamicznych języków. wink.gif
croc
Ja też nie lubię braku restrykcji w typach danych!!!
nospor
Cytat
Może zrobimy teścik?
Zamiast się głupio pytać to już dawno byś go zrobił i nam przedstawił wyniki tongue.gif
Cytat
Ja też nie lubię braku restrykcji w typach danych!!!
Lizus.... Crozin i tak nie pójdzie z Tobą do kina wink.gif
croc
Wyniki testu:

Test REGEX: 0.0897271633 - return preg_match('/^(?:-?[1-9][0-9]*|0)$/', $value);
Test TYPE: 0.0464580059 - return (string) $value === (string) intval($value);
Test NATURAL: 0.0816020966 - return preg_match('/^[1-9][0-9]*$/', $value);

Czyli rzutowanie wygrało smile.gif

EDIT
Sprawdziłem z (int) zamiast intval i jest jeszcze szybciej - 0.0353209972.
-marshal-
Sie rozpisalo;p

Dzieki za odpowiedzi.
Korzystajac z okazji zapytam jeszcze - walidujecie w kontrolerze(powiedzmy controllers/sites/userPage.php), czy w klasie(users::get_byId)?
croc
Tam gdzie masz obsługę błędów. Ja bym zrobił w klasie, a klasa zwracałaby błąd.
-marshal-
Czyli dobrze zrobilem.

z tym, ze jesli ID nie przejdzie walidacji, to nie bawie sie w zwracanie bledu typu "niepoprawny format atrybutu ID", tylko "return FALSE" i tyle;p

jak jest blad typu "niepoprawny format adresu e-mail", albo "nick musi zawierac conajmniej 3 znaki", to wtedy robie $this->errors[]='invalidMail'; i return FALSE
errors is public
croc
Obsługę błędów najlepiej zrobić w kontrolerze (który powie o nim widokowi jeśli trzeba). Poczytaj sobie o obsłudze błędów z prawdziwego zdarzenia: http://php.net/manual/en/language.exceptions.php
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.