W php7 wykonałem to tak:
<?php class test_class { function arg(int $var, string $var2, string $var3) { if($var && $var2 && $var3) { return 'OK, function execute correct'; } else { return 'ERROR, if variable is empty or not exist I not want execute method!'; } } } $object = new test_class(); $var = 50; $var2 = 50; //$var3 = 50; ?>
Po prostu jeśli $var3 jest pusta to nie jest ona zmienną typu string i kod się nie wykonuje:
Fatal error: Uncaught TypeError: Argument 3 passed to test_class::arg() must be of the type string, null given, called in D:\xampp\htdocs\argument.php on line 26 and defined in D:\xampp\htdocs\argument.php:5 Stack trace: #0 D:\xampp\htdocs\argument.php(26): test_class->arg(50, '50', NULL) #1 {main} thrown in D:\xampp\htdocs\argument.php on line 5
Ewentualnie wymyśliłem rozwiązanie mojego problemu dla wcześniejszej wersji php ale bardzo nie dobrze to wygląda:
<?php class test_class { function arg($var, $var2, $var3) { // My temporary solution $count = 0; foreach ($list as $value) { if($value) $count++; } return false; } // My temporary solution end if($var && $var2 && $var3) { return 'OK, function execute correct'; } else { return 'ERROR, if variable is empty or not exist I not want execute method!'; } } } $object = new test_class(); $var = 50; $var2 = 50; //$var3 = 50; ?>
Tworzona jest po prostu lista podanych argumentów z podanymi wartościami, w pętli sprawdzane są wartości czy nie są NULL, zliczane są wszystkie i porównywane z ilością wymaganych argumentów ( func_num_args() ). Jeśli liczba się nie zgadza przerywana jest metoda ( return false ).
Jednak rozwiązanie ma taki minus, że trzeba to wklejać na początku każdej funkcji no i nie wygląda zbyt dobrze z mojego punktu widzenia takie rozwiązanie.
Ktoś ma jakieś pomysły na lepsze rozwiązanie tego problemu?
Nie mogę nawet tego kodu wrzucić do osobnej funkcji i tylko w każdej wywoływać, bo wtedy func_*_args() nie spełnia swojego zadania.