Estoy escribiendo una aplicación web (PHP) para mi amigo y he decidido usar mi entrenamiento OOP limitado de Java.Excepciones de PHP en las clases
Mi pregunta es ¿cuál es la mejor manera de señalar en mi clase/aplicación que cosas críticas específicas fallaron sin realmente romper mi página.
Mi problema es que tengo un Object "SummerCamper" que toma un camper_id como argumento para cargar todos los datos necesarios en el objeto de la base de datos. Supongamos que alguien especifica un camper_id en la cadena de consulta que no existe, lo paso al constructor de objetos y la carga falla. Actualmente no veo una forma de devolver un mensaje falso del constructor.
He leído lo que podía hacer esto con excepciones, lanzando una excepción si no hay registros se encuentran en la base de datos o si algún tipo de error en la validación en la entrada de la camper_id de la aplicación, etc.
Sin embargo, realmente no he encontrado una buena manera de alertar a mi programa de que la carga de objetos ha fallado. Traté de devolver falso desde dentro de la captura, pero el objeto aún persiste en mi página php. Entiendo que podría poner una variable $ is_valid = false si la carga falla y luego verificar el Objeto usando un método get, pero creo que puede haber formas mejores.
¿Cuál es la mejor manera de lograr la terminación esencial de un objeto si falla una carga? ¿Debería cargar datos en el objeto desde fuera del constructor? ¿Hay algún tipo de patrón de diseño que debería estudiar?
Cualquier ayuda sería apreciada.
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, que desea seguir este ejemplo para crear y usar su SummerCamper (este es el código del cliente para su clase), y QUITAR el try {} catch {} de su constructor SummerCamper. La forma en que lo tiene escrito ahora, está tragándose la excepción antes de que el código del cliente pueda verla. – grossvogel
@grossvogel no hay try/catch en el constructor. Supongo que está refiriéndose a la función estática. Ahí está a propósito. Por lo que yo entendí del OP, él no está tan preocupado por la verdadera excepción como por no obtener una instancia. Además, si el bloque try/catch está fuera del método estático, tendría que repetir el try/catch cada vez que necesite crear un SummerCamper. Eso no es SECO. – Gordon