2017-01-04 8 views
8

Znalazłem naprawdę interesujący błąd w wersji 7.0.11, w którym declare(strict_types=1); włączone nie powoduje, że array_map() jest świadomy ścisłego tworzenia haseł. Czytałem gdzieś, że poprzez włączanie ścisłych typów PHP używa również ścisłej funkcji typehinting w podstawowych funkcjach, ale tak nie jest. Spójrz na tym przykładzie kodu, należy go wyrzucić wyjątek TypeError:Po włączeniu ścisłych podpowiedzi typów, array_map konwertuje typy w każdym razie

declare(strict_types=1); 

$myArray = [12, 'string value', 'another string value', 5]; 

array_map('validateMyArrayValues', $myArray); 

function validateMyArrayValues(string $item) 
{ 
    var_dump($item); 
} 

var_dump wynikiem jest:

test.php:13: 
    string(2) "12" 
test.php:13: 
    string(12) "string value" 
test.php:13: 
    string(20) "another string value" 
test.php:13: 
    string(1) "5" 

Wszystkie wartości całkowite są typecasted do łańcucha, który jest oczywiście problemem. To rodzi pytanie, czy powinienem porzucić wszystkie razem declare(strict_types=1); i użyć funkcji is_* i rzucić wyjątek?

+0

można argumentować, jeśli chcesz * ścisłe * typy, nie używaj php. jedną z jego * zalet * są luźne typy: –

+0

@ raina77ow tak, tak, to trochę dziwne bavavour. Dziwnie z int działa poprawnie. Właściwie byłbym bardzo szczęśliwy, gdyby ktokolwiek mógł opublikować raport o błędzie w grupie PHP dev, ponieważ wpływa to również na PHP 7.1; i nie jestem zbyt dobry w pisaniu poprawnych raportów o błędach. –

+0

@Dagon prawy, ale każdy język programowania ma swoje mocne i słabe strony. –

Odpowiedz

5

To nie jest (wskazówka kapelusz do Room 11 dla wskazujące mnie we właściwym kierunku) bug

Oto Strict Types RFC. To naprawdę, naprawdę długi i najbardziej kontrowersyjny dokument RFC w historii PHP (i jestem poważny). Oto odpowiednie porcje wyciąć dla Ciebie

Propozycja ta opiera się w słabej kontroli typu domyślnie (przy użyciu tych samych zasad), na wewnętrznych i użytkownika funkcji.

-

Znaczna część społeczności PHP wydaje się sprzyjać pełni ścisłe typy. Jednak dodanie ściśle skontrolowanych typów deklaracji typu skalarnego spowodowałoby kilka problemów:

Istniejący kod, który (być może nieumyślnie) wykorzystał słabe pisanie PHP, zostałby złamany, gdyby funkcje wywołały dodane parametry skalarne do parametrów. To komplikowałoby dodawanie deklaracji typu skalarnego do parametrów funkcji w istniejących bazach kodu, szczególnie bibliotekach.

To nie jest błąd. Było to częścią wielkiego kompromisu, który to umożliwił (jeśli zechcesz, dziecko idzie w kierunku ściślejszego pisania na klawiaturze). Funkcje ignorują ścisłe pisanie. Tak, jest to niezgodne z innymi językami (dokładnie to RFC zauważa), ale w ten sposób społeczność PHP zdecydowała, że ​​powinno to być na razie.

+0

Tak, wygląda na to, że jest to słaby typ wskazówek ([ wersja demonstracyjna] (https://eval.in/709627)). Każda liczba całkowita może zostać przekształcona w łańcuch, ale tylko "numeryczne" łańcuchy są rzutowane na liczby całkowite. – raina77ow

+0

To jest moment Big-Ahaa. Dziękuję za wyjaśnienie @Machavity. Obecnie czytam Strict Types RFC jest naprawdę interesujący. –

Powiązane problemy