bonjour à tous,
vous allez finir par me maudire.

Mes premières class fonctionne gentiment et j'ai des objets qui ressemble à ce que je veux, par contre mes class n'ont pas une allures des plus conventionnel.

Je créé un objet membre, ensuite je crée un objet forum, que j’intègre dans l'objet membre, un objet pilote_cil qui va lui aussi dans membre...

En regardant le code vous allez comprendre

<?php 
/////activation protection page appelé/////
define('PROTECTIONINCLUDE', TRUE);
/////insertion des base de donnée/////
include ($_SERVER"DOCUMENT_ROOT"].'/v501/config/config.php');
class Membre
{
}
class Forum 
{   
    public $id;
    public $username;
    public $lastpost_time;
    public $last_privmsg;
    public $email;
    public $mp;
    public function __construct(array $data)
    {
        $this->hydrate($data);
    }
    public function hydrate(array $data)
    {
        foreach ($data as $key => $value)
            {
                $method = 'set'.ucfirst($key);

                if (method_exists($this, $method))
                    {
                        $this->$method($value);
                    }
            }
    }
    public function setUser_id($id)
    {
        $this->id = $id;
    }
    public function setUser_lastpost_time($lastpost_time)
    {
        $this->lastpost_time = $lastpost_time;
    }
    public function setUser_last_privmsg($last_privmsg)
    {
        $this->last_privmsg = $last_privmsg;
    }
    public function setUsername($username)
    {
        $this->username = $username;
    }
    public function setUser_email($email)
    {
        $this->email = $email;
    }
    public function setUser_unread_privmsg($mp)
    {
        $this->mp = $mp;
    }

}
class Pilote_cil
{   
    public $id;
    public $username;

    public function __construct(array $data)
    {
        $this->hydrate($data);
    }
    public function hydrate(array $data)
    {
        foreach ($data as $key => $value)
            {
                $method = 'set'.ucfirst($key);

                if (method_exists($this, $method))
                    {
                        $this->$method($value);
                    }
            }
    }
    public function setPilotid($id)
    {
        $this->id = $id;
    }
    public function setLastname($username)
    {
        $this->username = $username;
    }

}
class Pilote_mil
{   
    public $id;
    public $username;

    public function __construct(array $data)
    {
        $this->hydrate($data);
    }
    public function hydrate(array $data)
    {
        foreach ($data as $key => $value)
            {
                $method = 'set'.ucfirst($key);

                if (method_exists($this, $method))
                    {
                        $this->$method($value);
                    }
            }
    }
    public function setPilotid($id)
    {
        $this->id = $id;
    }
    public function setLastname($username)
    {
        $this->username = $username;
    }

}
$test = new Membre;
$request = $DBPDO2 ->query('SELECT * FROM phpbb_users WHERE user_email ="lefebvreflorian@neuf.fr"');
while ($data = $request->fetch(PDO::FETCH_ASSOC)) { $moi = new Forum($data);}

$test->Forum=$moi;

$request = $DBPDO1 ->query('SELECT * FROM enr_cil_pilots WHERE email ="lefebvreflorian@neuf.fr"');
while ($data = $request->fetch(PDO::FETCH_ASSOC)) { $moi = new Pilote_cil($data);}
$test->Pilote_cil=$moi;
$request = $DBPDO1 ->query('SELECT * FROM enr_mil_pilots WHERE email ="lefebvreflorian@neuf.fr"');
while ($data = $request->fetch(PDO::FETCH_ASSOC)) { $moi = new Pilote_mil($data);}
$test->Pilote_mil=$moi;
echo "<pre>";
var_dump($test);
echo "</pre>";

 ?>

pour être plus propre, normalement les ligne 137 à 150 devrait monter dans la class membre, mais ça plante et je me fais insulter, j'ai essayer de passer en argument de class les objet $DBPDO1 et 2 mais pas moyen.

voici la class membre

class Membre
{
    $request = $DBPDO2 ->query('SELECT * FROM phpbb_users WHERE user_email ="lefebvreflorian@neuf.fr"');
    while ($data = $request->fetch(PDO::FETCH_ASSOC)) { $moi = new Forum($data);}
    $test->Forum=$moi;

    $request = $DBPDO1 ->query('SELECT * FROM enr_cil_pilots WHERE email ="lefebvreflorian@neuf.fr"');
    while ($data = $request->fetch(PDO::FETCH_ASSOC)) { $moi = new Pilote_cil($data);}
    $test->Pilote_cil=$moi;
    $request = $DBPDO1 ->query('SELECT * FROM enr_mil_pilots WHERE email ="lefebvreflorian@neuf.fr"');
    while ($data = $request->fetch(PDO::FETCH_ASSOC)) { $moi = new Pilote_mil($data);}
    $test->Pilote_mil=$moi;
}

et la réponse du prg

Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in /homepages/32/d412740872/htdocs/FFS2V5/v501/include/class/class_me.php on line 11

comment puis je m'en sortir proprement

merci d'avance pour vos conseil

Flo

16 réponses


Garniture-banner
Réponse acceptée

Bonjour Flo,
il y a des conventions, quand tu codes en objet, un nom de class débute par une majuscule, et est en CamelCase (rien de méchant à ce niveau, mais c'est une habitude que je te conseille vivement de prendre )

Le but de la POO est d'emprisonner des traitements, des donnés, des compétences dans des objets je simplifie un peu ton travail pour l'exemple,
je vais créer une classe Membre pour emprisonner les donnés relatives aux membres, une classe de connnexion à la bdd qui vas emprisonner le processus de connexion à ma Base de donnés, et vas effectuer les traitements pour me renvoyer des membres.

////Page membre.php
<?php
class Membre {
    /*
        Je définis un attribut privé, il n'y a que deux moyen d'en modifier la valeur:
        Via le constructeur
        Via l'accesseur setUsername
    */
    private $username;
    /*
        si rien n'est passé au contructeur l'attibut vaut null, 
        sinon il prends la valeur passée en parametre   
    */  
    public function __construct( $param_username= null ){
        $this->username = $param_username != NULL? $param_username: NULL;
    }
    /*
        Modifie la valeur de l'attribut username
    */
    public function setUsername($param_username){
        return $this->username = $param_username;
    }
    /*
        renvoie la valeur d'username
    */
    public function getUsername(){
        return $this->username;
    }

}

Ma classe pour la database :

////PAGE database.php
<?php
include 'membre.php';
class DatabaseObject {
    /*
        Des attributs
    */
    private $dsn = 'mysql:host=localhost;dbname=testdb';
    private $username = 'username';
    private $password = 'password';
    private $options = array();
    /*
        la connexion à la base de donnée
    */
    public $dbh;
    public function __construct($dsn, $username, $password){
        $this->dbh = new PDO($dsn, $username, $password, $options);
    }
    public function getAllMembres(){
        $stmt = $this->dbh->prepare("SELECT * FROM membre");
        $membres = array();
        while ( $row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $membre = new Membre($row'username']);
            $membres] = $membre;
        } 
        return $membres;
    }
    public function getMembreByUsername($param_username){
        $membre = new Membre();
        $stmt = $this->dbh->prepare("SELECT * FROM membre WHERE username = :param");
        $stmt->bindParam(':param', $param_username);
        /*
        blah blah on récup
        */
        return $membre;
    }
}
?>

Et voila comment je peux utiliser mes classes depuis index.php par exemple

/////PAGE index.php
<?php
include 'membre.php';
include 'databaseObject.php';
/* je liste tous mes membres */
$db = new databaseObject($dsn, $username, $password);
$membres = $db->getAllMembres();

/* je récupère un membre */ 
$mon_gars_sur = $db->getMembreByUsername('b2oba');
/* je souhaite faire un affichage avec mon_gars_sur, $mon_gars_sur est une instance de membre, 
    Je n'ai pas accès à sa propriété $username, je dois passer par la methode getUsername()
 */
echo "Yaw sa te dis de faire un feat avec ". $mon_gars_sur->getUsername(). " wai wai !"

/* 
    voilou un peu comment sa se passe en programmation objet, à chaque classe un fichier.
    Tes classes sont disponibles partout dans l'application, tes attributs sont protégés tout roule.

*/

?>

Voila typiquement comment j'aurais découpé ton application,
Quand j'instencie un objet DatabaseObject, j'ai accès à toutes les méthodes et ce partout dans mon application, la seule condition c'est d'inclure databaseObject.php

Si par exemple je dois envoyer un mail, je créer une class Mail, avec une methode send(), dans toute mon application si je crée une instance de Mail paf j'ai accès aux traitements pour encoyer des mails.

Voilou ma tentative pour t'aider dans la programation objet.

Hello,

Tu peux pas placer du code àa la racine d'une classe comme ça.
Il faut que ton code soit dans une méthode

class Membre
{
    public function maMethode() {
    $request = $DBPDO2 ->query('SELECT * FROM phpbb_users WHERE user_email ="lefebvreflorian@neuf.fr"');
    while ($data = $request->fetch(PDO::FETCH_ASSOC)) { $moi = new Forum($data);}
    $test->Forum=$moi;

    $request = $DBPDO1 ->query('SELECT * FROM enr_cil_pilots WHERE email ="lefebvreflorian@neuf.fr"');
    while ($data = $request->fetch(PDO::FETCH_ASSOC)) { $moi = new Pilote_cil($data);}
    $test->Pilote_cil=$moi;

    $request = $DBPDO1 ->query('SELECT * FROM enr_mil_pilots WHERE email ="lefebvreflorian@neuf.fr"');
    while ($data = $request->fetch(PDO::FETCH_ASSOC)) { $moi = new Pilote_mil($data);}
    $test->Pilote_mil=$moi;
    }
}

Cordialement,

une question simple, où est-ce que tu as appris la programmation orientée objet ?
Parceque meme si ce que tu fais n'as rien de vilain, c'est pas respectueux des conventions

flo3376
Auteur

merci MrGuillou, même si pour l'instant ça ne marche, enfin je n'ai plus de message d'erreur mais je n'ai pas encore de retour pas en faisant

$test = new Membre();
$test->maMethode($DBPDO1,$DBPDO2,"mon_mail@neuf.fr");

.

j'ai faillit oublier de transmettre les info DB et mail, mais php me l'a rappelé. Mais pour le moment je vais chercher un peu de mon coté.

Garniture-banner, pour le moment j'apprend la POO, je débute, pour le moment le but pour moi et d'essayer de créer des objet, après je pourrais carrément sois me farcir toutes les doc plus imbuvable les unes que les autres pour me retrouver au final à me poser comme question "pourquoi j'ai voulu passer objet", ou alors y allait franco sur ce forum et disant j'ai besoin de faire des objets de telle forme qui peut me le faire, ou bien essayer,piocher des infos à droite à gauches et demander de l'aide en dernier recourt.

Je me doute bien que ce que je fais n'est pas conventionnel, mais ça viendra. Avant de commencer à courir il faut apprendre à marcher.

flo3376
Auteur

ok je vais essayer de revoir ma copie avec ce que tu m'as montré, je vous tiens au courant

flo3376
Auteur

Bon aprés avoir essayé de comprendre je suis arrivé à ça.

Alors je sais que je suis toujours sur un seul fichiers, mais c'est pour une raison de rapidité de codage vue que j'essaye et tous sera redécoupé.
J'ai remis la fonction hydrate car c'est la seul solution que j'ai comprise pour récuperer plusieurs donnée et les injectés dans un objet.

Les attribut de la class forum et civil est public parce j'ai besoin de les récupérer rapidement.

Donc je suis arrivé ici

<?php
 /////activation protection page appelé/////
define('PROTECTIONINCLUDE', TRUE);
/////insertion des base de donnée/////
include ($_SERVER"DOCUMENT_ROOT"].'/v501/config/config.php');
//include 'membre.php';
class Forum {

    public $id;
    public $username;
    public $lastpost_time;
    public $last_privmsg;
    public $email;
    public $mp;

    public function __construct( array $data )
    {
        $this->hydrate($data);
    }
    public function hydrate(array $data)
    {
        foreach ($data as $key => $value)
            {
                $method = 'set'.ucfirst($key);

                if (method_exists($this, $method))
                    {echo "string";
                        $this->$method($value);
                    }
            }
    }

    public function setUsername($username){$this->username = $username;}
    public function setUser_ip($user_ip){$this->ip = $user_ip;}
    public function setUser_email($user_email){$this->email = $user_email;}

}
class Civil {

    public $id;
    public $lastname;
    public $pilotid;
    public $totalflights;

    public function __construct( array $data )
    {
        $this->hydrate($data);
    }
    public function hydrate(array $data)
    {
        foreach ($data as $key => $value)
            {
                $method = 'set'.ucfirst($key);

                if (method_exists($this, $method))
                    {echo "string";
                        $this->$method($value);
                    }
            }
    }

    public function setPilotid($pilotid){$this->pilotid = $pilotid;}
    public function setLastname($lastname ){$this->lastname = $lastname ;}
    public function setTotalflights($totalflights ){$this->totalflights = $totalflights ;}
    public function setEmail($email ){$this->email = $email ;}

}
class DatabaseObject {

    private $db;

    public function getMembreForum($param_username){
        $stmt = $this->db->prepare("SELECT * FROM phpbb_users WHERE user_email = :param");
        $stmt->bindParam(':param', $param_username);
        $stmt->execute();

        $membres = array();
        while ( $row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $membre = new Forum($row);
        }
        return $membre;
    }
    public function getMembreCivil($param_username){
        $stmt = $this->db->prepare("SELECT * FROM enr_cil_pilots WHERE email = :param");
        $stmt->bindParam(':param', $param_username);
        $stmt->execute();

        $membres = array();
        while ( $row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $membre = new Civil($row);
        }
        return $membre;
    }
    public function setDB($db){
        $this->db = $db;
    }

}
$db=new databaseObject(); //création d'objet db
$db->setDB($DBPDO2); //remplissage d'un objet db
$mon_gars_sur->forum1 = $db->getMembreForum("mon_mail@neuf.fr"); //scan d'un gars
$db->setDB($DBPDO1); //remplissage d'un objet db
$mon_gars_sur->civil = $db->getMembreCivil("mon_mail@neuf.fr"); //scan d'un gars
//$mon_gars_sur = $db->getAllMembres();
echo "<pre>";
var_dump($mon_gars_sur); //affichage du gars
echo "</pre>";

ce qui m'ennuie pour le moment c'est devoir faire

$mon_gars_sur->civil = $db->getMembreCivil("mon_mail@neuf.fr"); //scan d'un gars

et qui me donnerai en faisant la comparaison avec des tableaux

$mon_gars_sur[civil][civil]=data

alors que je souhaiterai faire

$mon_gars_sur[civil]=data

Le but pour moi est de créer un gros objet qui ressemblerai à celui-ci

object(stdClass)#4 (2) {
  object(Forum)#5 (7) {
    "id"]=>
    NULL
    "username"]=>
    string(12) "[ADM]flo3376"
    "lastpost_time"]=>
    NULL
    "last_privmsg"]=>
    NULL
    "email"]=>
    string(23) "mon_mail@neuf.fr"
    "mp"]=>
    NULL
    "ip"]=>
    string(12) "192.168.1.10"
  }
  object(Civil)#7 (5) {
    "id"]=>
    NULL
    "lastname"]=>
    string(8) "adm_fl27"
    "pilotid"]=>
    string(1) "1"
    "totalflights"]=>
    string(2) "86"
    "email"]=>
    string(23) "mon_mail@neuf.fr"
  }
}

Alors maintenant plusieurs questions posent:
-Suis je très loin des conventions
-Y a t'il beaucoup de chose à revoir pour simplement arrivé au résultat souhaité
-suis je dans totalement dans les choux

merci de vos réponses

déja Bravo !
ta class DatabaseObject est déja beaucoup beaucoup plus jolie !
$mon_gars_sur c'est un nom de variable assez débile que j'avais mis en fin de code, histoire de détendre un peu l'atmosphère, c'est sympa de le revoir
Bon parlons code :

$mon_gars_sur->civil = $db->getMembreCivil("mon_mail@neuf.fr"); //scan d'un gars

C'est moche et sa devrait planter, je ne comprends pas pourquoi sa fonctionne ! Un des principes de la programmation objet c'est que si tu n'as pas de raison particulière, tous les attributs d'un objet sont privés ! (le principe s'appelle l'Encapsulation )
Comme je l'ai expliqué plus tot, pour modifier un attribut privé il faut utiliser un setter ce qui devrait donner :

$db = new DatabaseObject() // j'ai une instance de ma classe qui interfère avec ma bdd
    $mon_gars_sur = $db->getMembreCivil("mon_mail@neuf.fr"); // içi t'as récupéré un tableau avec les informations d'un utilisateur
    $utilisateur = new Civil (); //j'ai modifié civil pour qu'il soit possible de le construire sans passer de parametre
    $utilisateur->hydrate($mon_gars_sur ); //je passe un tableau à hydrate et hop mon objet est op !

class Civil {

    private $id;
    private $lastname;
    private $pilotid;
    private $totalflights;

    public function __construct()
    {

    }
    public function hydrate(array $data)

    {
        foreach ($data as $key => $value)
            {
                $method = 'set'.ucfirst($key);

                if (method_exists($this, $method))
                    {echo "string";
                        $this->$method($value);
                    }
            }
    }

    public function getPilotid($pilotid){
        return $this->pilotid ;
    }
    public function getLastname($lastname ){
        return $this->lastname = $lastname ;
    }
    public function getTotalflights($totalflights ){
        return $this->totalflights ;
    }
    public function getEmail($email ){
        return $this->email ;
    }
    public function setPilotid($pilotid){
        $this->pilotid = $pilotid;
    }
    public function setLastname($lastname ){
        $this->lastname = $lastname ;
    }
    public function setTotalflights($totalflights ){
        $this->totalflights = $totalflights ;
    }
    public function setEmail($email ){
        $this->email = $email ;
    }

Je dois manger, je repasse m'editer et terminer mon post dans 30-35min

flo3376
Auteur

Par rapport au début de réponse que tu m'as fournis

J'ai l'habitude de travailler en tableau multidemnsionnel et donc lors d'utilisation en HTML je fais,

<div class="item"><img src="<?php echo $utilisateur'civil']'img'] ?>"></div>

et donc en objet avec l'encapsulation, que j'ai bien compris ça devrait donner un truc du genre

<div class="item"><img src="<?php echo $utilisateur->civil=getImage(); ?>"></div>

et si j'ai bien compris d’ailleurs les getters normalement n'ont pas besoin de paramètre dans mon cas.

étant une faignace de premières lorsque je code, il est vrai que je vais toujours au chemin le plus cours et en plus sans encapsulation je peux faire un vardump de l'objet complet et voir les données dispo, car j'ai tendance à en perdre par moment :D

Re, finalement je ne m'édites pas,
Oui un getter n'as pas besoin de parametres, c'est un oubli dans mes copier/coller depuis les setters.
tu y étais presque:

src="<?php echo $utilisateur->getCivil()->getImage(); ?>"></div>

Exactement comme les tableaux imbriqués, tu peux imbriquer les objets, il faut juste appeler un getter qui retourne un objet, sur lequel tu peux appler un getter.

Ce concept est génial c'est au moment de la persitance en BDD que les problemes commencent...

Est-ce que tout est clair pour le moment ?
Tu te sens à l'aise pour manipuler de nouveaux objets ?

flo3376
Auteur

donc si j'ai bien compris avec le passage de mes attributs en private, je suis forcé d'utilisé les getters, donc mes objet ne sont pas réellement créer à l'instanciation, j'ai juste le moule et pas le gâteau dedans.

Mais existe t'il un moyen propre pour faire l'équivalent d'un var dump d'utilisateur, où c'est ici que je me mange la frontière de l'objet.

je vais faire quelque essaye et je reviens

Je cite :
"donc si j'ai bien compris avec le passage de mes attributs en private, je suis forcé d'utilisé les getters, donc mes objet ne sont pas réellement créer à l'instanciation, j'ai juste le moule et pas le gâteau dedans."

Oui, c'est comme sa que sa se passe, quand tu vas aborder l'héritage et les propriétés statiques tu verras à quoi sa sert l'encapsulation.
Pour la création d'objets 'vides' c'est pour réduire le couplage, quand t'as des parametres obligatoires dans un constructeur, tu es obligé d'avoir tous les parametres, maintenant que tu peux créer des objets vide, tu peux en créer à la volée, si à un moment dans ton application t'as besoin de remplir tu remplis.

Je cite:
"Mais existe t'il un moyen propre pour faire l'équivalent d'un var dump d'utilisateur, où c'est ici que je me mange la frontière de l'objet."

Oui tu peux var_dump un objet, j'ai une préférence pour la fonction print_r(), tu m'es sympathique je vais meme te donner un bout de code pour afficher tes objets :

function debug($varaible_a_afficher){
    echo '<pre>';
    print_r($varaible_a_afficher);
    echo '</pre>';
}
function debug2($varaible_a_afficher){
    echo '<pre>';
    print_r($varaible_a_afficher);
    die('cya');
    echo '</pre>';
}

avec sa tu peux voir tes objets en mode débuggage.

flo3376
Auteur

histoire de réaligner les pensé de tous le monde,
voici le code modifié selon tes préconisation

<?php
 /////activation protection page appelé/////
define('PROTECTIONINCLUDE', TRUE);
/////insertion des base de donnée/////
include ($_SERVER"DOCUMENT_ROOT"].'/v501/config/config.php');
//include 'membre.php';
class Forum {

    private $id;
    private $username;
    private $lastpost_time;
    private $last_privmsg;
    private $email;
    private $mp;

    public function __construct()
    {
        //$this->hydrate($data);
    }
    public function hydrate(array $data)
    {
        foreach ($data as $key => $value)
            {
                $method = 'set'.ucfirst($key);

                if (method_exists($this, $method))
                    {
                        $this->$method($value);
                    }
            }
    }

    public function setUsername($username){$this->username = $username;}
    public function setUser_ip($user_ip){$this->ip = $user_ip;}
    public function setUser_email($user_email){$this->email = $user_email;}

        public function getUsername(){return $this->username = $username;}
    public function getUser_ip(){return $this->ip = $user_ip;}
    public function getUser_email(){return $this->email = $user_email;}

}
class Civil {

    private $email;
    private $lastname;
    private $pilotid;
    private $totalflights;

    public function __construct()
    {}
    public function hydrate(array $data)
    {
        foreach ($data as $key => $value)
            {
                $method = 'set'.ucfirst($key);

                if (method_exists($this, $method))
                    {
                        $this->$method($value);
                    }
            }
    }

    public function setPilotid($pilotid){$this->pilotid = $pilotid;}
    public function setLastname($lastname ){$this->lastname = $lastname;}
    public function setTotalflights($totalflights ){$this->totalflights = $totalflights ;}
    public function setEmail($email ){$this->email = $email ;}
    public function getPilotid(){return $this->pilotid ;}
    public function getLastname(){return $this->lastname = $lastname ;}
    public function getTotalflights(){return $this->totalflights ;}
    public function getEmail(){return $this->email ;}

}
class DatabaseObject {

    private $db;

    public function getMembreForum($param_mail){
        $stmt = $this->db->prepare("SELECT * FROM phpbb_users WHERE user_email = :param");
        $stmt->bindParam(':param', $param_mail);
        $stmt->execute();

        $membres = array();
        while ( $row = $stmt->fetch(PDO::FETCH_ASSOC)) {$membre = $row;}
        return $membre;
    }
    public function getMembreCivil($param_mail){
        $stmt = $this->db->prepare("SELECT * FROM enr_cil_pilots WHERE email = :param");
        $stmt->bindParam(':param', $param_mail);
        $stmt->execute();

        $membres = array();
        while ( $row = $stmt->fetch(PDO::FETCH_ASSOC)) {$membre = $row;}
        return $membre;
    }
    public function setDB($db){
        $this->db = $db;
    }

}
$db=new databaseObject(); //création d'objet db
$db->setDB($DBPDO2); //remplissage d'un objet db
$mon_gars_sur= $db->getMembreForum("lefebvreflorian@neuf.fr"); //scan d'un gars
$utilisateur=new Forum ();
$utilisateur->hydrate($mon_gars_sur);
echo "<pre>";
var_dump($utilisateur); //affichage du gars
echo "</pre>";
?>

et voici ce que celà m'affiche

en regardant ma bouteille d rhum je suis arrivé à me poser la question suivante, les attributs sont en private et il me les donne quand même, soit c'est pas normal ou alors cela prendrai la forme que je souhaite.

et dans ma joie j'ai enchainer avec les lignes suivantes

$db->setDB($DBPDO1); //remplissage d'un objet db
$mon_gars_sur= $db->getMembreCivil("lefebvreflorian@neuf.fr"); //scan d'un gars
$utilisateur=new Civil ();
$utilisateur->hydrate($mon_gars_sur);

et bien entendu l'objet Forum se trouve écrasé et remplacé par Civil.

Cela me rappel les lois de murphy

Ensuite j'ai tenté un peu à l'arrache un héritage avec la class class Forum extends Civil, et là c'est pas bon, bien que le moule prend donc de nouveaux attribut, ils sont vident.

Euh pourquoi tu as besoin d'utiliser l'héritage (extends) ??
j'ai du mal à comprendre cette partie

flo3376
Auteur

j'ai pas eu besoin spécialement, c'était juste une essai du chapitre suivant, je pensais un avoir objet pouvant contenir des sous objet avec ceci, mais non en réalité si j'ai bien compris, avec l'héritage au lieux d'appeler toute mes class, si un héritage est en place, les class vont se lancer d'elle même si j'appel la class mére

Hihihi pas du tout.
Tu souhaites créer deux nouvelles classes:

  • Le Sniper avec un attribut long_rifle en plus des attributs d'un civil
  • Le Soldat avec un attribut m_16 en plus des attributs d'un civil
  • Les deux nouvelles classe peuvent dire bonjour via la methode sayHi()

La solution un peu simple c'est de copier/coller ta classe Civil, la renomer et créer sniper, rajouter son attribut, recommencer avec soldat.
La solution Objet c'est de créer une classe Sniper et de dire qu'elle hérite de Civil, de créer la classe Soldat qui elle aussi hérite de Civil.

<?php
class Sniper extends Civil{
    private $long_rifle;

        public function sayHi(){
            echo $this->email . ' vous souhaite la bienvenue';
        }
}
?>

<?php
class Soldat extends Civil{
    private $m_16;
        public function sayHi(){
            echo $this->email . ' vous souhaite la bienvenue';
        }
}
?>

un rappel de ta classe Civil

class Civil {

    private $email;
    private $lastname;
    private $pilotid;
    private $totalflights;
// tout le reste
}

Ce que l'extends fait, toute ta classe mère Civil existe dans tes classes filles Soldat et Sniper.
Tous les attibuts et methodes existent dans les classes filles.

Si tu utilises setEmail('email@test.fr'), puis tu essaie d'utiliser sayHi(), tu risque d'etre déçu, en effet souviens toi, tes attributs dans Civil sont privés, personne n'y touche, meme si tes classes filles ont l'attribut email, elle n'ont pas le droit d'y toucher, pour accéder aux propriétés soit tu utilises les getters, soit tu passes les attributs de private à protected.

Un attribut protected est accessible par la classe ET par les classes filles.

flo3376
Auteur

Merci à tous, je vais clore le sujet car sinon j'ai pas finis, avec tous les élément que vous avez fournis j'ai de quoi avancé pas mal.