Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Ustawienie argumentu metody jako WYMAGANY., Ewentualnie ustawienie wszystkich jako wymagane inaczej wyjątek
Grzesiek1
post 1.11.2016, 13:02:50
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 5.02.2007

Ostrzeżenie: (0%)
-----


Co prawda rozwiązanie mojego problemu znalazłem ale tylko w PHP 7. Chciałbym jednak żeby kod działał także na wcześniejszych wersjach.
W php7 wykonałem to tak:
  1. <?php
  2. class test_class
  3. {
  4. function arg(int $var, string $var2, string $var3)
  5. {
  6. if($var && $var2 && $var3)
  7. {
  8. return 'OK, function execute correct';
  9. }
  10. else
  11. {
  12. return 'ERROR, if variable is empty or not exist I not want execute method!';
  13. }
  14. }
  15. }
  16. $object = new test_class();
  17. $var = 50;
  18. $var2 = 50;
  19. //$var3 = 50;
  20.  
  21. echo $object->arg($var,$var2,$var3);
  22. ?>

Po prostu jeśli $var3 jest pusta to nie jest ona zmienną typu string i kod się nie wykonuje:
  1. 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:
  1. <?php
  2. class test_class
  3. {
  4. function arg($var, $var2, $var3)
  5. {
  6. // My temporary solution
  7. $list = func_get_args();
  8. $count = 0;
  9. foreach ($list as $value) {
  10. if($value)
  11. $count++;
  12. }
  13. if($count != func_num_args()){
  14. return false;
  15. }
  16. // My temporary solution end
  17.  
  18. if($var && $var2 && $var3)
  19. {
  20. return 'OK, function execute correct';
  21. }
  22. else
  23. {
  24. return 'ERROR, if variable is empty or not exist I not want execute method!';
  25. }
  26. }
  27. }
  28. $object = new test_class();
  29. $var = 50;
  30. $var2 = 50;
  31. //$var3 = 50;
  32.  
  33. echo $object->arg($var,$var2,$var3);
  34. ?>

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.

Ten post edytował Grzesiek1 1.11.2016, 13:09:33
Go to the top of the page
+Quote Post
KsaR
post 1.11.2016, 13:09:24
Post #2





Grupa: Zarejestrowani
Postów: 517
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

Ostrzeżenie: (0%)
-----


Ustaw domyślną wartość na null

  1. <?php
  2.  
  3. function arg($arg = null, $arg2 = null)
  4. {
  5. if (!isset($arg, $arg2)) {
  6. return 'error';
  7. }
  8. }
  9.  
  10. echo arg(0, 0)."\n";
  11. echo arg(0)."\n";
  12. echo arg();

Demo: https://3v4l.org/tu0Fh

Wtedy też możesz rzucać wyjątki zamiast "error".

Ten post edytował KsaR 1.11.2016, 13:12:50


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post 1.11.2016, 13:12:47
Post #3





Grupa: Zarejestrowani
Postów: 7 799
Pomógł: 1373
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


E...

  1. <?php
  2. class test_class
  3. {
  4. function arg($var, $var2, $var3)
  5. {
  6. if(!isset($var, $var2, $var3)) {
  7. return 'NOT';
  8. }
  9. return 'OK';
  10. }
  11. }
  12. $object = new test_class();
  13. $var = 50;
  14. $var2 = 50;
  15. //$var3 = 50;
  16.  
  17. echo $object->arg($var,$var2,$var3);
Go to the top of the page
+Quote Post
Grzesiek1
post 1.11.2016, 13:22:17
Post #4





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 5.02.2007

Ostrzeżenie: (0%)
-----


Cytat(KsaR @ 1.11.2016, 14:09:24 ) *
Ustaw domyślną wartość na null

O to chodzi że argument nie może być NULL, jeśli jest NULL chcę aby metoda się właśnie nie wykonywała.

Cytat(Pyton_000 @ 1.11.2016, 14:12:47 ) *
E...

  1. <?php
  2. class test_class
  3. {
  4. function arg($var, $var2, $var3)
  5. {
  6. if(!isset($var, $var2, $var3)) {
  7. return 'NOT';
  8. }
  9. return 'OK';
  10. }
  11. }
  12. $object = new test_class();
  13. $var = 50;
  14. $var2 = 50;
  15. //$var3 = 50;
  16.  
  17. echo $object->arg($var,$var2,$var3);

No tak to też się sprawdzi, ale to rozwiązanie jest jeszcze mniej wygodne od mojego. Teraz jak mam 10 funkcji i w każdej po 10 argumentów robi się kłopot.

Myślałem bardziej o zastosowaniu może jakiegoś wyjątku w przypadku, gdy któryś z argumentów jest pusty.

EDIT:
Ewentualnie jeszcze w ten sposób można by to rozwiązać ale to jest strasznie zawiłe rozwiązanie

  1. <?php
  2.  
  3. class test_class
  4. {
  5. function check($list)
  6. {
  7. // My temporary solution
  8. foreach ($list as $value) {
  9. if (!$value)
  10. return true;
  11. }
  12. // My temporary solution end
  13. }
  14.  
  15. function arg($var, $var2, $var3)
  16. {
  17. if ( $this->check( func_get_args() ) )
  18. return false;
  19.  
  20. if ($var && $var2 && $var3) {
  21. return 'OK, function execute correct';
  22. } else {
  23. return 'ERROR, if variable is empty or not exist I not want execute method!';
  24. }
  25. }
  26. }
  27.  
  28. $object = new test_class();
  29.  
  30. $var = 50;
  31. $var2 = 50;
  32. //$var3 = 50;
  33.  
  34. echo $object->arg($var, $var2, $var3);
  35.  
  36. ?>


Ten post edytował Grzesiek1 1.11.2016, 14:45:07
Go to the top of the page
+Quote Post
Pyton_000
post 1.11.2016, 14:30:11
Post #5





Grupa: Zarejestrowani
Postów: 7 799
Pomógł: 1373
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


http://php.net/manual/en/reflectionfunctio...fparameters.php
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 17.08.2019 - 22:31