POO

alvincyte 15 Messages postés vendredi 27 novembre 2009Date d'inscription 7 décembre 2016 Dernière intervention - 7 déc. 2016 à 12:17 - Dernière réponse : jordane45 20565 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention
- 8 janv. 2017 à 00:59
Bonjour,
je suis un débitant en programmation orienté objet avec PHP je fais un exercice qui me complique un peu si quelqu'un a l'idée peut m'aider s'il vous plait. Voilà le codes ci-dessous :
page : classe3.php
<?php
class client{
 private $prenom;
 private $nom;
 private $age;
  public function getPrenom() {
  return $this−>prenom;
  }
  public function getNom() {
  return $this−>nom;
  }
  public function getAge() {
  return $this−>age;
  }
  public function setPrenom($prenom){
   if (!preg_match("/^\s*(.+?)\s*$/", $prenom, $champs)) {
    throw new Exception("Le prénom doit être non vide");
    } else {
     $this->prenom = $champs[1];
     }
  }
  public function setNom($nom){
    if (!preg_match("/^\s*(.+?)\s*$/", $nom, $champs)) {
    throw new Exception("Le nom doit être non vide");
    } else {
     $this->nom = $champs[1];
     }
  }
  public function setAge($age){
    if (!preg_match("/^\s*(\d+)\s*$/", $age, $champs)) {
    throw new Exception("L'âge doit être un entier positif ou nul");
    } else {
     $this->age = $champs[1];
     }
  }
 function __construct($prenom, $nom, $age){
   $this−>setPrenom($prenom);
   $this−>setNom($nom);
   $this−>setAge($age);
  }
  public function toHTML() {
  return $this−>prenom  . " \n " . $this−>nom  . " \n  " .  $this−>age  ;
  }

}
 ?> 

page : index.php
<?PHP 
include("classe3.php");
$merci=new client("CHICCO", "BETUKUTALA", 30);
echo $merci->toHTML() ; 
  try {
   $merci=new client("xxxxx", "yyyyyyy", "gg");
    } catch (Exception $e) {
     print $e->getMessage();
    }
    //fin
 exit();  

?>
NB: mon problème est que lors de l'exécution y a une erreur au niveau de mon constructeur.
Fatal error: Call to undefined function setPrenom() in D:\Chicco\exercices\classe3.php on line 52

la ligne 52 c'est la ligne par laquelle j'ai fait la construction donc il arrete ici :
 function __construct($prenom, $nom, $age){
   $this−>setPrenom($prenom);
   $this−>setNom($nom);
   $this−>setAge($age);
  }
Afficher la suite 

2 réponses

Répondre au sujet
jordane45 20565 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 8 janv. 2017 à 00:59
0
Utile
Bonjour,

Du coup tu ne peux pas faire des appels de fonction propre a la classe (comme des getteurs ou setteurs par exemples), à l'interieur de celle-ci car ces dernieres ne sont pas encore initialisées.

C'est nouveau ça ?

Deux interventions de ta part ... deux énormes erreurs .... Merci de faire attention à tes réponses pour ne pas induire les utilisateurs en erreur.

Pour preuve :
class maclass{

	private $atr1,$atr2,$atr3;

	function __construct($var1,$var2,$var3=""){
	  $this->setAtr1($var1);
	  $this->setAtr2($var2);
	  $this->setAtr3($var3);

	}

	public function setAtr1($var){
	 $this->atr1 = $var;
	}

	public function setAtr2($var){
	 $this->atr2 = $var;
	}
	public function setAtr3($var){
	 $this->atr3 = $var;
	}

	public function getAtr(){
	 return array($this->atr1,$this->atr2,$this->atr3);
	}

}

Et pour l'utiliser :
<?php
error_reporting(E_ALL);
ini_set('display-errors','on');

require_once "maclass.php";

$obj = new maclass("aa","Bb","CC");

print_r($obj->getAtr());

Le code ci-dessus fonctionne parfaitement.


Et pour ce qui est du code du demandeur .. aucun souci non plus avec celui-ci.
La seule remarque éventuelle.. serait qu'il est préférable de nommer le fichier qui contient la class avec le même nom que celui utilisé pour la class (pratique pour les auto_loader par exemple )
Commenter la réponse de jordane45
Sph1nxDev 6 Messages postés mercredi 4 janvier 2017Date d'inscription 8 janvier 2017 Dernière intervention - Modifié par Sph1nxDev le 4/01/2017 à 18:43
-1
Utile
Les classes qui possèdent une méthode constructeur appellent cette méthode à chaque création d'une nouvelle instance de l'objet, ce qui initialise donc l'objet avant d'être utilisé. Elle est donc la première a s'executer lorsqu'on instancie un objet. Du coup tu ne peux pas faire des appels de fonction propre a la classe (comme des getteurs ou setteurs par exemples), à l'interieur de celle-ci car ces dernieres ne sont pas encore initialisées.
tu dois donc faire :

     function __construct($prenom, $nom, $age){
         $this−>prenom = $prenom;
         $this−>nom = $nom;
         $this−>age = $age;
      }
Commenter la réponse de Sph1nxDev

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.