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?
można argumentować, jeśli chcesz * ścisłe * typy, nie używaj php. jedną z jego * zalet * są luźne typy: –
@ 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. –
@Dagon prawy, ale każdy język programowania ma swoje mocne i słabe strony. –