Piszę aplikację internetową (PHP) dla mojego przyjaciela i zdecydowałem się użyć mojego ograniczonego szkolenia OOP z Javy.Wyjątki PHP w klasach
Moje pytanie brzmi: jaki jest najlepszy sposób na odnotowanie w mojej klasie/aplikacji, że pewne krytyczne rzeczy zawiodły, nie powodując w rzeczywistości mojej strony.
Mój problem polega na tym, że mam obiekt "SummerCamper", który pobiera argument camper_id jako jego argument, aby załadować wszystkie niezbędne dane do obiektu z bazy danych. Powiedzmy, że ktoś określa identyfikator camper_id w ciągu zapytania, który nie istnieje, przekazuję go do mojego konstruktora obiektów i ładowanie się nie powiedzie. Obecnie nie widzę sposobu, aby po prostu zwrócić false z konstruktora.
Czytałem mógłbym to zrobić z wyjątkami, rzuca wyjątek, jeśli żadne zapisy znajdują się w bazie danych lub jeśli jakiś walidacji nie na wejściu camper_id z aplikacji itp
Jednak ja tak naprawdę nie znalazłem świetnego sposobu na ostrzeżenie mojego programu, że ładowanie obiektów nie powiodło się. Próbowałem zwrócić false z wewnątrz CATCH, ale obiekt nadal występuje na mojej stronie php. Rozumiem, że mogę umieścić zmienną $ is_valid = false, jeśli obciążenie się nie powiedzie, a następnie sprawdzić obiekt za pomocą metody get, ale myślę, że mogą istnieć lepsze sposoby.
Jaki jest najlepszy sposób na uzyskanie podstawowego zakończenia obiektu w przypadku awarii obciążenia? Czy powinienem załadować dane do obiektu spoza konstruktora? Czy jest jakiś wzór, który powinienem sprawdzić?
Każda pomoc zostanie doceniona.
function __construct($camper_id){
try{
$query = "SELECT * FROM campers WHERE camper_id = $camper_id";
$getResults = mysql_query($query);
$records = mysql_num_rows($getResults);
if ($records != 1) {
throw new Exception('Camper ID not Found.');
}
while($row = mysql_fetch_array($getResults))
{
$this->camper_id = $row['camper_id'];
$this->first_name = $row['first_name'];
$this->last_name = $row['last_name'];
$this->grade = $row['grade'];
$this->camper_age = $row['camper_age'];
$this->camper_gender = $row['gender'];
$this->return_camper = $row['return_camper'];
}
}
catch(Exception $e){
return false;
}
}
Gordon, chcesz pójść za tym przykładem tworzyć i używać twojego SummerCamper (jest to kod klienta dla twojej klasy), i USUŃ try {} catch {} z twojego konstruktora SummerCamper. Tak, jak to teraz napisałeś, pochłaniasz wyjątek, zanim kod klienta go zobaczy. – grossvogel
@grossvogel nie ma próby/catch w konstruktorze. Zakładam, że odnosisz się do funkcji statycznej. Tam jest celowo. O ile rozumiem PO, nie jest on tak bardzo zaniepokojony faktycznym wyjątkiem, jak tylko zwykłym brakiem instancji. Ponadto, jeśli blok try/catch znajduje się poza metodą statyczną, musiałby powtórzyć próbę/catch, ilekroć będzie potrzebował stworzyć SummerCamper. To nie DRY. – Gordon