2012-01-22 21 views
13

Mam zamiar wykonać funkcję z zadeklarowanymi typami argumentów, aby szybko sprawdzić, czy są one we właściwym formacie, ale gdy jest ciąg znaków, zwracaj zawsze ten błąd Złapalny błąd krytyczny: Argument 2 przeszedł do myFunction() musi być instancją ciąg, ciąg danym, zwany w ścieżka_do_pliku na linii 69 i zdefiniowane w ścieżka_do_pliku na linii 49php: Deklaracja typu argumentu funkcji

function myfunction(array $ARRAY, string $STRING, int $INTEGER) { 
    return "Args format correct"; 
} 
myfunction(array("1",'2','3','4'), "test" , 1234); 

gdzie jest błąd?

+0

Nie można podpowiedź dla wartości skalarnych. – alexn

+1

Teraz możesz, po prostu użyj PHP 7.0 http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration – sobi3ch

Odpowiedz

29

Według the PHP5 documentation: Można

Type Hints can only be of the object and array (since PHP 5.1) type. Traditional type hinting with int and string isn't supported.

Od string i int nie są klasami, nie „podpowiedź typu” je w swojej funkcji.

Począwszy od PHP 7.0 deklaracja typu argumentu jako string, int, float, bool jest obsługiwana.

+5

ta odpowiedź jest nieaktualna, zobacz http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration – Blauhirn

0

Nie można zdefiniować typu jako string i int. PHP "nie wie", czym one są.

+3

Zna typy, [to po prostu nie obchodzi] (http://en.wikipedia.org/wiki/Type_system#Strong_and_weak_typing). – Gumbo

+1

@Gumbo ...i dlatego zamieszczam podwójne cytaty ... –

1

string, int i inne typy wbudowane nie są klas, w argumencie podasz klasę, z argumentu. Jedynym obsługiwanym typem wbudowanym jest array.

6

można zrobić coś takiego, który zawsze pracował dla mnie

na ciąg

function setData($Name=""){ } 

Zmusza to nazwisko się łańcuch, to nie sprawdza, czy jest to ciąg

dla wartości numerycznych

function setData($age=0){ } 

zmusza wieku być numer, jeśli ciąg jest przekazywana wartość będzie wynosić 0

dla wartości tablicowych, istnieją dwa zmienność

function setData(array $data){ } 

jeśli tablica nie zostanie przekroczony, to wygeneruje błąd

function setData($data=array()){ } 

Byłoby przekazać pustą tablicę o braku wartości jest podana jako $data

+4

Określanie domyślnych wartości dla argumentów jest ważna technika, ale nie należy jej utożsamiać z podpowiedziami typu. Na przykład, nie jest do końca prawdą, że określenie 'func ($ x = 0)' wymusza wartość '$ x' jako liczbę. Raczej, jeśli twoja funkcja zawsze przetwarza wartość '$ x' jako liczbę w całym tekście, to przez przypadek działa. Właściwie jeśli podasz ciąg, który będzie mógł być parsowalny jako liczba, to zostanie on przetworzony w ten sposób. 'func ('5')' użyłoby radośnie 5 jako wartość całkowitą. Ciąg, który nie jest parsable, interpretowany jest jako zero, więc domyślne ustawienie 0 działa przez przypadek. – zerobandwidth

0

Jeśli nie używasz PHP 7.x lub potrzebujesz skomplikowanych sprawdzeń poprawności argumentów (np. "tablica lub \ T "można przechodzić", ponieważ można przechodzić przez tablice, ale są one typami pierwotnymi i nie implementują interfejsu \ Traversable), można użyć modułu args z Non-standard PHP library (NSPL).

use const \nspl\args\numeric; 
use function \nspl\args\expects; 

function sqr($x) 
{ 
    expects(numeric, $x); 
    return $x * $x; 
} 

sqr('hello world'); 

Wyjścia:

InvalidArgumentException: Argument 1 passed to sqr() must be numeric, string given in /path/to/example.php on line 17 

Call Stack: 
    0.0002  230304 1. {main}() /path/to/example.php:0 
    0.0023  556800 2. sqr() /path/to/example.php:17 
0

Według PHP Manual w PHP 5.x nie można używać array jako podpowiedź, ale w PHP 7.xmożna! Spójrz:

  • Class/interface name Parametr musi być instancją danej klasy lub nazwy interfejsu. PHP 5.0.0
  • self Parametr musi być instancją tej samej klasy, na której zdefiniowano tę metodę. Tego można używać tylko w przypadku metod klas i instancji. PHP 5.0.0
  • array Parametr musi być tablicą. PHP 5.1.0
  • callable Parametr musi być poprawną wartością wywołania. PHP 5.4.0
  • bool Parametr musi być wartością boolowską. PHP 7.0.0
  • float Parametr musi być liczbą zmiennoprzecinkową. PHP 7.0.0
  • int Parametr musi być liczbą całkowitą. PHP 7.0.0
  • string Parametr musi być ciągiem. PHP 7.0.0
  • iterable Parametr musi być tablicą lub instancją Traversalable. PHP 7.1.0
0

kiedy trzeba użyć typu podpowiedzi, to zrobić:

<?php 
declare(strict_types=1); 
+1

Dodaj więcej informacji dotyczących odpowiedzi. –