Czy możliwe jest wyjście z nadfunkcji?

1

Cześć!

Tworzę dla pewnych szkół aplikację webową pomocną w zażądaniu placówką. Mam już sporo funkcji, które zależą od tego, czy został wybrany aktualny plan lekcji - pamiętany w $_SESSION['pla_id']

Zrobiłem funkcję, która sprawdza obecność tej zmiennej sesyjnej:

function no_pla_sel($unit="", $info_type="html") {
	if (!isset($_SESSION['pla_id']) or $_SESSION['pla_id']=="") {
		if ($info_type == "html")
			return array("no"=>1, "msg"=>'<div><b UWAGA:</b> <u>Brak aktywnego planu</u> => proszę go wybrać.</div>');
		else
			return array("no"=>1, "msg"=>'UWAGA: Brak aktywnego planu => proszę go wybrać.');
	}
	else	return array("no"=>0, "msg"=>"");
}

W każdej funkcji potrzebowałbym teraz wywołać no_pla_sel() i sprawdzić, czy zwrócona tablica ma klucz "no" o wartości 1 (np. tak):

function jakas_funkcja($par1, $par2) {
  $unit = "jakas_funkcja";
  //...
  /* sprawdzenie, czy wybrano plan i wyjście z komunikatem w przypadku braku planu */
  $noPla = no_pla_sel($unit);
  if ($noPla["no"] == 1) {
      return $noPla["msg"];
  }
  //...
}

Czy jest jakiś trik pozwalający na to, by nie trzeba było w każdej funkcji pisać kodu jak ten powyżej, ale np. coś takiego?

function jakas_funkcja($par1, $par2) {
  //...
  no_pla_sel_trick("jakas_funkcja");
  //...
}

Funkcja no_pla_sel_trick musiałaby jakoś powodować (po spełnieniu logiki w niej określonej) wyjście także z funkcji, w której została wywołana.
Chciałbym po prostu ułatwić sobie pisanie i uprościć kod.
Da się tak?

PS. Nie miałem pomysłu na tytuł, więc taki został. Jakieś pomysły na inny?

5

Cześć @Blackhole! 👋 Super że jesteś na forum!

Samo wyjście z nadfunkcji istnieje w językach programowania i są to wyjątki. Z poziomu niższej funkcji wystarczy zrobić throw new NoPlanSelected() i to poskutkuje kaskadowym wyjściem z kolejnych nadfunkcji, do funkcji która taki wyjątek złapie. Takie rozwiązanie byłoby dobre, gdyby to była sytuacja wyjątkowa i miała się nie zdarzyć za często.

Ja napisałbym kod w taki sposób:

class NoSelectedPlan extends RuntimeException {}

function getSelectedPlanId(): int {
  if (isset($_SESSION['pla_id']) && $_SESSION['pla_id'] !== "") {
    return $_SESSION['pla_id'];
  }
  throw new NoSelectedPlan();
}

function jakas_funkcja($par1, $par2) {
  $unit = "jakas_funkcja";

  $planId = getSelectedPlanId(); // w $planId na pewno znajduje się id planu, w przeciwnym wypadku
                                 // funkcja zostanie przerwana, i wykona się kod z catch

  $value = "Mam id planu: $planId!";
}

Następnie, w jednej z wyższych funkcji możesz skorzystać z tego tak:

<?php

try {
  jakas_funkcja();
}
catch (NoSelectedPlan $noPlan) {
  if ($format == 'html') {
    echo "<b>Nie ma planu</b>";
  } else {
    echo "Nie ma planu";
  }
}

0

Dzięki @Riddle. To mi wystarczy 🙂

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.