POO

alvincyte Messages postés 15 Date d'inscription vendredi 27 novembre 2009 Statut Membre Dernière intervention 7 décembre 2016 - Modifié par @karamel le 7/12/2016 à 13:22
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 - 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);
  }

2 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
8 janv. 2017 à 00:59
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 )
0
Sph1nxDev Messages postés 6 Date d'inscription mercredi 4 janvier 2017 Statut Membre Dernière intervention 8 janvier 2017
Modifié par Sph1nxDev le 4/01/2017 à 18:43
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;
      }
-1
Rejoignez-nous