Re : Constructeur de classe

Le
m-e-
"Bloodshed" <bloodshed@xosc.org> a écrit dans le message de news: c50h5a$cbt$1@news-reader4.wanadoo.fr
> Bonjour,
>
> J'essaie d'afficher un message d'erreur si un constructeur
> de classe retourne false, de cette façon si :
>
> [code]
> <?php
> require("myclass.class.php")
> $class = new MyClass("argument") or die("Erreur !");
> ?>
> [/code]
>
> Mais cela ne marche pas ! Je ne comprend pas ?
>
> Merci d'avance,
> Bloodshed


Normal, comme le dis loufoque, un constructeur retourne une instance de la classe. Si tu veux gérer la construction des instances
d'une classe de façon plus avancée, utilise une méthode statique de type "factory", ce qui donne, par exemple et très basiquement :

<?php
class Test {
function Test($nom) {
$this->nom = $nom;
}
function factory($nom) {
if (is_string($nom)) {
return new Test($nom);
} else {
return false;
}
}
}

$myTest = &Test::factory(1) or die("Problème Usinage !");
?>
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Bloodshed
Le #569124
Interessant merci, mais y a-t-il un autre moyen de procéder ? de cette
façon-ci : $class = new myClass("chaine") or die ("Erreur");
m-e-
Le #573313
"Bloodshed"
Interessant merci, mais y a-t-il un autre moyen de procéder ? de cette
façon-ci : $class = new myClass("chaine") or die ("Erreur");


Tu veux que je confirme la confirmation ? Alors je confirme, le "$class = new myClass(...) or die(...)" ne peut pas marcher à cause
du new : son retour sera une nouvelle instance de myClass.
Peut-être que dans certains langages objets cela aurait été possible. Mais en php, je ne vois vraiment pas comment. De tout façon,
cela ne serait pas une très bonne pratique de POO. Sauf, bien-sûr, si myClass héritait de la classe booléen (classe qui n'existe pas
en PHP, les booléens étant un type primitif). Enfin, je ne vais pas me balader dans les diversités et les subtilités de la POO pour
valider ma confirmation.

Bloodshed
Le #573305
J'ai un autre problème

ceci :
[code]
<?php
$class = new Myclass();
$class->fonction() or die ("Erreur");
?>
[/code]

Ne fonctionne pas, il me lance l'instruction die quelque soit le
résultat (false ou true)
m-e-
Le #573061
"Bloodshed"
J'ai un autre problème

ceci :
[code]
<?php
$class = new Myclass();
$class->fonction() or die ("Erreur");
?>
[/code]

Ne fonctionne pas, il me lance l'instruction die quelque soit le
résultat (false ou true)


A un moment j'ai cru que tu m'écrivais à nouveau la même chose ^W^.
Chez moi ça marche sans problème.
Le code de ta classe ?...

Bloodshed
Le #572811
Le voici :
La classe [xerror.class.php]
<?php

/******************************************/
/* Xerror */
/*----------------------------------------*/

#file: xerror.class.php
#create: 2004/04/04 17:41
#modified: 2004/04/04 17:42
#package: Xerror [1.0] #version: 1.0
#licence: GPL [2] #author: Mickaël Menu [Bloodshed] #website: Xerror #description: Classe Xerror 1.0.
#help: Manuel d'Xerror #convention: Xconvention #convention: Xerror
/********************************************/


/***************************************************************************

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License.


***************************************************************************/

#class: Xerror
#package: Xerror [1.0] #version: 1.0
#description: Gestion des erreurs.
#help: Classe Xerror class Xerror
{
#attribute: $errorFile <string> [Fichier des erreurs.]
var $errorFile;
#attribute: $errorMessage <array> [Messages d'erreurs.]
var $errorMessage = array();
#attribute: $error <array> [Erreurs de traitements.]
var $error = array();

#method: Xerror()
#argument: $errorFile <string>
#error: $error["parameterDefined"] [Erreur : Un ou plusieurs paramètre(s) n'ont pas été renseignés.]
#error: $error["fileExist"] : Impossible de trouver le fichier d'erreurs.]
#version: 1.0
#description: Cette méthode initialise les attributs
#description: et charge le fichier d'erreurs.
#help: Méthode Xerror #comment: Cette méthode est le constructeur de la classe.
function Xerror($errorFile)
{
$this->error["parameterDefined"] = "<b>Erreur :</b> Un
ou plusieurs param&egrave;tre(s) n'ont pas &eacute;t&eacute;
renseign&eacute;s.";
$this->error["fileExist"] = "<b>Erreur :</b> Impossible
de trouver le fichier d'erreurs.";
$this->error["messageExist"] = "<b>Erreur :</b> Le
message d'erreur est introuvable.";

if (!empty($errorFile))
{
if (@file_exists($errorFile))
{
$this->errorMessage =
@parse_ini_file($errorFile, true);

}

else {
die($this->error["fileExist"]);
}
}

else {
die($this->error["parameterDefined"]);
}
}

#method: displayError()
#argument: $errorName <string>
#error: $error["parameterDefined"] [Erreur : Un ou plusieurs paramètre(s) n'ont pas été renseignés.]
#error: $error["messageExist"] [Erreur : Le message d'erreur est introuvable.]
#version: 1.0
#description: Cette méthode affiche le message d'une erreur.
#help: Méthode displayError()
function displayError($errorName, $errorGroup = false)
{
if (!empty($errorName))
{
if (!empty($errorGroup))
{
if
(isset($this->errorMessage[$errorGroup][$errorName]))
{

echo($this->errorMessage[$errorGroup][$errorName]);
}

else {
die($this->error["messageExist"]);
}
}

else {
if (isset($this->errorMessage[$errorName]))
{

echo($this->errorMessage[$errorName]);
}

else {
die($this->error["messageExist"]);
}
}
}

else {
die($this->error["parameterDefined"]);
}
}
}
?>

L'utilisateur [test.php]
<?php

require("xerror.class.php");
$error = new Xerror("error.ini");
$error->displayError("erreur 1") or die ("Erreur");
$error->displayError("erreur 2", "section 1") or die ("Erreur");

?>





En l'occurence là je l'ai modifié, il affiche directement les messages
d'erreurs (ce n'est pas vraiment ce que je veux mais bon)

Le problème étant qu'il lance l'instruction die même si l'instruction ne
retourne rien ou retourne true !

J'utilise EasyPHP 1.7 peut-être un problème des nouvelles configurations ?
Pascal (Collectours)
Le #572804
m-e- wrote:

"Bloodshed" c51dtr$c6i$
Interessant merci, mais y a-t-il un autre moyen de procéder ? de cette
façon-ci : $class = new myClass("chaine") or die ("Erreur");


Tu veux que je confirme la confirmation ? Alors je confirme, le "$class > new myClass(...) or die(...)" ne peut pas marcher à cause du new : son
retour sera une nouvelle instance de myClass.
[snip]


Bonjour,
et pourtant, de façon amusante,le code ci-dessous fonctionne très bien:
et affiche
"Je veux bien créer t_go
Je ne veux pas créer t_nogo
Décidemment, je ne veux pas créer t_nogo !"
Il suffit de mettre $this à false avant de revenir : l'instance est remise à
zéro.
Je l'utilise très souvent lorsque je veux retourner une instance nulle quand
les params passés pour la création d'objet ne conviennent pas au
constructeur.
Il suffit donc que le posteur original adapte celui-ci en conséquence.
Cordialement
Pascal

<?php

class test {

var $my_param;

function test($p) {
# on accepte de créer une instance seulement
# si $p est compris entre 1 et 5

if ( $p < 1 || $p > 5) {
$this = false;
return false;
}
# on veut bien créer l'instance
$this->my_param = $p;
}
}

# premier essai
if ( $t_go = new test(3) ) {
print 'Je veux bien créer t_go';
}

print '<br />';
# essai refusé, la class retourne bien false;
if ( ! ( $t_nogo = new test(6)) ) {
print 'Je ne veux pas créer t_nogo';
}

print '<br />';
# que j'aurais pu aussi écrire comme demandé
$t_nogo = new test(6) or die('Décidemment, je ne veux pas créer
t_nogo !');
?>


Publicité
Poster une réponse
Anonyme