Page 1 sur 1

Plusieurs constructeurs ? possible ?

Posté : 09 juin 2006, 17:45
par Insomniak
Bonjour à tous,

Désolé pour le titre peu explicite mais c'est pas évident de tout dire en peu de caracteres.
Voilà ma situation : Je suis en train actuellement de me faire un gestionnaire d'erreurs pour mon site.
Pour cela je surcharge la classe Exception. De plus, je souhaite gérer les erreurs php (E_WARNING, E_ERRORS)... comme expliqué dans un tuto que j'ai trouvé.

Pour pouvoir faire tout ca, il faut prendre par le debut :

La surcharge de la classe Exception :

Code : Tout sélectionner

<?php class MyException extends Exception { // Constructeur de la classe. // Il faut bien penser à rapeller le constructeur de la classe Exception. public function __construct($msg) { parent :: __construct($msg); } // Méthode retournant un message d'erreur complet et formaté. public function getError() { // On retourne un message d'erreur complet pour nos besoins. $return = 'Une exception a été gérée :<br/>'; $return .= '<strong>Message : ' . $this->getMessage() . '</strong><br/>'; $return .= 'A la ligne : ' . $this->getLine() . '<br/>'; $return .= 'Dans le fichier : ' . $this->getFile() . '<br/>'; $return .= 'Il était : ' . $this->getTime(); return $return; } }?>
Donc ici rien de bien méchant, on surcharge et voilà tout. On remarque bien que le constructeur comporte un seul parametre.
Maintenant, si je souhaite pouvoir inclure les exceptions php, je dois changer mon error_handler.
Pour cela il faudra que je passe plus de parametres à mon constructeur d'Exceptions. C'est là que ça se gate !

Je n'ai pas encore trouvé le moyen d'envoyer soit un soit plusieurs parametres à un meme constructeur en php (alors que dans d'autres langages c'est largement faisable).

Sauriez vous si cela existe mais que j'ai tout simplement pas trouvé ou bien comment je pourrais faire pour y palier svp ?

Voici comment je voudrais procéder pour la gestion des exceptions php :

Code : Tout sélectionner

function myErrorHandler($level, $string, $file, $line, $context){ throw new MyException($level, $string, $file, $line, $context); } //Définition du gestionnaire d'erreur set_error_handler('myErrorHandler');
Merci d'avance

@++

Posté : 09 juin 2006, 17:53
par jeff
salut
ca peut te donner des idée
//pour les exceptions non catché
function throwException2ErrorHandler($exception){
	$ex = new defaultException($exception);
}

//pour les trigger
function throwTrigger2ErrorHandler($level, $message, $file = "", $line = "", $context = ""){
	try{
		throw new ApplicationControllerException( $message, $level);
	}catch(ApplicationControllerException $e){}
}
et
<?php
class ApplicationControllerException extends Exception implements iException{

	public function __construct($message,$code = 0 ){
		parent::__construct($message,$code);
	    $error = ErrorHandler::singleton();
	    $error->startHandler($this);
	}

	final public function getInfo(){
		return array ("info" => "PHP catched error", "file" => $this->getFile(), "line" => $this->getLine());		
	}
	
	final public function getLevel(){
		return $this->getCode();
	}
	
	final public function getBacktrace(){
		return $this->getTrace();
	}
} 
?>

<?php
class defaultException extends Exception implements iException{

	private $exception = null;
	
	public function __construct($exception ){
		$this->exception = $exception;
		parent::__construct($this->exception->getMessage(),$this->exception->getCode());
	    $error = ErrorHandler::singleton();
	    $error->startHandler($this);
	}

	final public function getInfo(){
		return array ("info" => "PHP catched error", "file" => $this->exception->getFile(), "line" => $this->exception->getLine());		
	}
	
	final public function getLevel(){
		return $this->exception->getCode();
	}
	
	final public function getBacktrace(){
		return $this->exception->getTrace();
	}
}
?>
ca ne marche peut etre pas tout a fait je l'ai fini ce matin

quant a la classe errorHandler géré l'affichage
note que ca repond a des besoin particulier d'un framework

pour ce qui de la surchage de contructeur je ne comprend pas ton pb etant donnée que php n'est pas typé
public function __construct($msg,$code=0) {
        parent :: __construct($msg,$code);
    } 
il n'y a pas besoin d'autre paramatere

Posté : 09 juin 2006, 18:30
par insomniak
Salut,

Merci pour ton code. Mais en fait, il correspond plus ou moins à ce que je veux faire.En gros c'est la meme chose mais dans un seul error manager.

Je vais gérer mes erreurs PHP (levées par php lui meme) + les erreurs applicatives (que je leve moi meme dans mon code) dans la meme classe.

Pour faire bref, lors de la levée d'une erreur par php, il envoie plusieurs parametres interressants (facultatifs mais que je souhaite conserver).
Lors de la levée d'une erreur applicative, il n'y a qu'un parametre qui est le message.

Donc cette difference de nombre de parametres me genait pour le constructeur car d'un coté j'ai

throw new myException($message)

Et de l'autre un :

throw new myException($message, $line, $file, $level)

Donc dans la déclaration de ma classe, c'etait assez embettant. Mais j'ai fini par trouver en fait.

J'ai tout simplement déclaré un constructeur avec le maximum de parametres et ensuite je teste chaque parametre dans ce constructeur pour savoir si je suis dans une erreur php ou dans une erreur applicative.

Voilou !
Merci quand meme en tout cas ;)
@++

Posté : 10 juin 2006, 20:22
par Invité
Tu peux aussi ne pas déclarer de parametre dans ta déclaration de fonction, et utiliser la fonction func_get_args() pour recupérer les parametres passé a la fonction...
de cette facon, tu rends le nombre de param de ta fonction variable.

Posté : 12 juin 2006, 10:44
par jeff
throw new myException($message, $line, $file, $level)
tu na pas besoin d'un constructeur de ce type, tu peut recuper la ligne et le fichier dans ton objet

Posté : 12 juin 2006, 11:26
par insomniak
Salut à tous,

Merci pour vos indications. Seul probleme : j'ai du abandonner l'idée de gérer les erreur PHP via un manager perso car les fonctions __autload et set_error_handler ne cohabitent pas. Je n'ai malheureusement pas trouvé à ce jour de solution pour palier à ca... donc wait and see au cas ou il y aurait une maj de php pour gérer ce probleme. Je n'ai pas non plus compris pourquoi ca ne fonctionne pas mais en tout cas, j'ai remarqué que je ne suis pas le seul dans ce cas...

Encore merci
@++

Posté : 12 juin 2006, 20:24
par rami
Va voir ici. J'ai testé chez en local (PHP5.1.1) et ca fonctionne correctement avec l'autoload. Par contre, il faut renommer la classe RuntimeException qui doit être utilisée en interne.