Widziałem następującą nową linię w PHP 7, ale nikt tak naprawdę nie wyjaśnia, co to znaczy. Przeszukałem go w Google i mówią tylko o tym, czy włączysz to, czy nie, jak w ankiecie.
declare(strict_types = 1);
Co to robi? Jak to wpływa na mój kod? Czy powinienem to zrobić?
Jakieś wyjaśnienie byłoby miłe.
php
php-7.2
strong-typing
weak-typing
sufuko
źródło
źródło
Odpowiedzi:
Z bloga Treehouse :
Domyślnie PHP będzie rzutować wartości niewłaściwego typu na oczekiwany typ skalarny, jeśli to możliwe. Na przykład funkcja, której podano liczbę całkowitą dla parametru, który oczekuje ciągu, otrzyma zmienną typu ciąg.
Ścisłe typy wyłączone ( eval ):
<?php function AddIntAndFloat(int $a, float $b) : int { return $a + $b; } echo AddIntAndFloat(1.4, '2'); /* * without strict typing, PHP will change float(1.4) to int(1) * and string('2') to float(2.0) and returns int(3) */
Możliwe jest włączenie trybu ścisłego dla każdego pliku. W trybie ścisłym akceptowana będzie tylko zmienna o dokładnym typie deklaracji typu lub zostanie wyrzucony błąd TypeError. Jedynym wyjątkiem od tej reguły jest to, że funkcja oczekująca na wartość zmiennoprzecinkową może otrzymać liczbę całkowitą. Na wywołania funkcji z funkcji wewnętrznych nie będzie miała wpływu deklaracja strict_types.
Aby włączyć tryb ścisły, deklaracja deklaracji jest używana z deklaracją strict_types:
Włączono ścisłe typy ( eval ):
<?php declare(strict_types=1); function AddIntAndFloat(int $a, float $b): int { return (string) $a + $b; } echo AddIntAndFloat(1.4,'2'); // Fatal error: Uncaught TypeError: Argument 1 passed to AddIntAndFloat() must be of the type int, float given echo AddIntAndFloat(1,'2'); // Fatal error: Uncaught TypeError: Argument 2 passed to AddIntAndFloat() must be of the type float, string given // Integers can be passed as float-points : echo AddIntAndFloat(1,1); // Fatal error: Uncaught TypeError: Return value of AddIntAndFloat() must be of the type integer, string returned
Przykład pracy:
<?php declare(strict_types=1); function AddFloats(float $a, float $b) : float { return $a+$b; } $float = AddFloats(1.5,2.0); // Returns 3.5 function AddFloatsReturnInt(float $a, float $b) : int { return (int) $a+$b; } $int = AddFloatsReturnInt($float,1.5); // Returns 5 function Say(string $message): void // As in PHP 7.2 { echo $message; } Say('Hello, World!'); // Prints "Hello, World!" function ArrayToStdClass(array $array): stdClass { return (object) $array; } $object = ArrayToStdClass(['name' => 'azjezz','age' => 100]); // returns an stdClass function StdClassToArray(stdClass $object): array { return (array) $object; } $array = StdClassToArray($object); // Returns array function ArrayToObject(array $array): object // As of PHP 7.2 { return new ArrayObject($array); } function ObjectToArray(ArrayObject $object): array { return $object->getArrayCopy(); } var_dump( ObjectToArray( ArrayToObject( [1 => 'a' ] ) ) ); // array(1 => 'a');
źródło
strict_types
wpływa na wymuszenie typu.Używanie podpowiedzi typu bez podpowiedzi
strict_types
może prowadzić do subtelnych błędów.Przed typami ścisłymi
int $x
oznaczało „$x
musi mieć wartość podlegającą przekształceniu na int”. Każda wartość, która mogłaby zostać wymuszona na anint
, przekazałaby wskazówkę dotyczącą typu, w tym:242
),10.17
),true
),null
lub"13 Ghosts"
).Ustawiając
strict_types=1
, mówisz silnikowi, żeint $x
oznacza to, że „$ x musi być tylko int właściwym, nie jest dozwolone żadne wymuszanie typu”. Masz wielką pewność, że otrzymujesz dokładnie i tylko to, co zostało dane, bez jakiejkolwiek konwersji i potencjalnej straty.Przykład:
<?php function get_quantity(): int { return '100 apples'; } echo get_quantity() . PHP_EOL;
Daje potencjalnie mylący wynik:
Notice: A non well formed numeric value encountered in /Users/bishop/tmp/pmkr-994/junk.php on line 4 100
Większość programistów spodziewałaby się, jak sądzę,
int
wskazówki oznaczającej „tylko int”. Ale tak nie jest, to znaczy „coś w rodzaju int”. Włączenie strict_types daje prawdopodobne oczekiwane i pożądane zachowanie:<?php declare(strict_types=1); function get_quantity(): int { return '100 apples'; } echo get_quantity() . PHP_EOL;
Plony:
Fatal error: Uncaught TypeError: Return value of get_quantity() must be of the type int, string returned in example.php:4
Myślę, że są tu dwie lekcje, jeśli używasz wskazówek dotyczących pisania:
strict_types=1
zawsze.strict_types
pragmę.źródło
strict_types
.Ścisłe typy w PHP mają wpływ na typy przymusu.
Ustawiając „strict_types = 1”, mówisz silnikowi, że „int $ x” oznacza, że „$ x musi być tylko wartością typu int, a wymuszenie typu nie jest dozwolone”. Masz wielką pewność, że otrzymujesz dokładnie i tylko to, co zostało dane, bez jakiejkolwiek konwersji lub potencjalnej straty.
Wszystko, co musisz wiedzieć o typach ścisłych w PHP :)
https://medium.com/@chemaclass/strict-types-in-php-d4166bd25394
źródło