Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Re : Constructeur de classe

6 réponses
Avatar
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 !");
?>

6 réponses

Avatar
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");
Avatar
m-e-
"Bloodshed" a écrit dans le message de news: 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.
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.

Avatar
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)
Avatar
m-e-
"Bloodshed" a écrit dans le message de news: c53mt8$l6j$
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 ?...

Avatar
Bloodshed
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] <http://xerror.xosc.org/>
#version: 1.0
#licence: GPL [2] <http://www.gnu.org/>
#author: Mickaël Menu [Bloodshed]
#website: Xerror <http://xerror.xosc.org/>
#description: Classe Xerror 1.0.
#help: Manuel d'Xerror <http://xerror.xosc.org/help/>
#convention: Xconvention <http://xconvention.xosc.org/convention.cvn>
#convention: Xerror <xerror.cvn>

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


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

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] <http://xerror.xosc.org/>
#version: 1.0
#description: Gestion des erreurs.
#help: Classe Xerror <http://xerror.xosc.org/help/?class=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"] <Il manque des arguments.>
[Erreur : Un ou plusieurs paramètre(s) n'ont pas été renseignés.]
#error: $error["fileExist"] <Le fichier n'existe pas.> [Erreur
: 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 <http://xerror.xosc.org/help/?method=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"] <Il manque des arguments.>
[Erreur : Un ou plusieurs paramètre(s) n'ont pas été renseignés.]
#error: $error["messageExist"] <Le message n'existe pas.>
[Erreur : Le message d'erreur est introuvable.]
#version: 1.0
#description: Cette méthode affiche le message d'une erreur.
#help: Méthode displayError()
<http://xerror.xosc.org/help/?method=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 ?
Avatar
Pascal (Collectours)
m-e- wrote:

"Bloodshed" a écrit dans le message de news:
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 !');
?>