PHP Quebec
http://www.phpquebec.com
PHP.net
PHP Québec
Mission
L'équipe
Nos projets
Contact
Ressources
Forum
Recherche

Advanced Search
Qui est en ligne
14 user(s) are online (7 user(s) are browsing Forum)

Members: 0
Guests: 14

more...

Browsing this Thread:   1 Anonymous Users





Php5 objet client
Nouveau
Joined:
3/3 13:50
Group:
Utilisateurs Enregistrés
Posts: 3
Level : 1; EXP : 10
HP : 0 / 2
MP : 1 / 3
Offline
Bonjour,

étant un peu nouveau dans le langage objet, j'ai une question que je me pose.

J'ai une class client qui possède beaucoup de propriétés. Ces propriétés correspond à des données sur Oracle. Pour les alimenter, j'ai besoin de faire plusieurs requêtes. Je ne veux pas les alimenter dans le constructeur parce que si jamais j'ai besoin de 2 ou 3 propriétés il va faire des requêtes de trop.

Donc je me demande s'il y a une bonne pratique pour cette situation là. Est-ce que doit faire quelques méthodes qui va permettre d'affecter un certain nombre de ses propriétés? Ou faire plusieurs constructeurs?

Merci



class Client {     
private 
$no;     
private 
$annee;          
private 
$regnum;     
private 
$nomregion;     
private 
$clinom;     
private 
$nomdem;     
private 
$langue;          
private 
$telephone_expl;     
private 
$adresse_expl;     
private 
$codegeo_expl;     
private 
$codepostal_expl;         
private 
$adresse_cli;     
private 
$telephone_cli;         
private 
$codegeo_cli;     
private 
$codepostal_cli;           
private 
$municipalite;     
private 
$regionadm;     
private 
$zonefoin;     
private 
$regionfoin;     
private 
$cp12;     
private 
$noterritoire;

}

Posted on: 3/3 14:19
Transfer the post to other applications Transfer


Re: Php5 objet client
Nouveau
Joined:
2009/7/7 15:55
Group:
Utilisateurs Enregistrés
Posts: 14
Level : 2; EXP : 50
HP : 0 / 37
MP : 4 / 117
Offline
Une bonne pratique, utilisée en Java, C# et Zend Framework par exemple, c'est de créer un accesseur et modifieur de propriété pour chacune de tes variables, donc deux méthode publiques par variables.

Tu aurais par exemple:


// accesseur de propriete pour 'no'
public function getNo() {
    return 
$this->no;
}

// modifieur de propriete pour 'no'
public function setNo($no) {
    
$this->no $no;
}


et ce pour chacune de tes propriétés, ça te permet d'assigner des valeurs au besoin... une autre bonne pratique c'est de mettre 'null' par défaut lorsque tu définis tes variables.

Posted on: 3/3 15:25
Transfer the post to other applications Transfer


Re: Php5 objet client
Nouveau
Joined:
3/3 13:50
Group:
Utilisateurs Enregistrés
Posts: 3
Level : 1; EXP : 10
HP : 0 / 2
MP : 1 / 3
Offline
Merci pour la réponse

....j'ai bien compris ca.

Ils sont utilisé pour accéder à mes propriétés. En php, il y un méthode magique qui fais ca pour chaque propriété ou il n'y a pas de méthodes de spécifiées: __get.

Mais ma question n'est pas sur le fait de comment avoir accès à mes propriétés et de les modifier à l'extérieur de la classe mais comment les affecter à l'intérieur de ma classe via des requête sur Oracle.

Lorsque je fais un:

$test 
= new Client(22222);


Je peux affecter tous mes propriétés dans le constructeur en faisant plusieurs requêtes Oracle. Mais je ne veux pas faire ca parce que je ferai beaucoup trop de requête pour rien si je cherche seulement à avoir les données de 1-3 propriétés.

Je pourrai créer des méthodes qui permet d'aller chercher quelques données selon ce que je demande:


$test 
= new Client(22222);

$clinom $test->getclinom//C'est null
$zone $test->getzone//C'est null

$test->donneeBase();

$clinom $test->getclinom//Client un tel
$zone $test->getzone//C'est null

$test->donneeComplementaire();

$zone $test->getzone//Zone 3




Mais je ne sais pas si c'est la bonne manière. Je peux aussi, dans la méthode get, vérifier si la propriété a été affecté sinon d'appeler la fonction correspondant à la table où le champ se trouve et de l'affecter.....

Il doit avoir surement une façon de faire...

Merci

Posted on: 3/3 15:53
Transfer the post to other applications Transfer


Re: Php5 objet client
Nouveau
Joined:
2009/7/7 15:55
Group:
Utilisateurs Enregistrés
Posts: 14
Level : 2; EXP : 50
HP : 0 / 37
MP : 4 / 117
Offline
OK je comprend mieux... Première chose à voir, c'est de regarder si tu peux pas aller chercher toutes ces données avec un join SQL. Dans la plupart des cas, un 'join' sur quelques tables qui retourne toutes les données d'un coup, si les index necessaires sont présents, va être beaucoup plus performant que de faire deux (ou plus) requêtes séparées.

Maintenant, si t'as vraiment besoin de faire x requêtes pour aller chercher toutes tes données, dans bien des systèmes j'ai vu un peu ce que tu expliques:


$user
->loadBasicInfo();
$user->loadExtendedInfo();


Tu pourrais en effet faire en sorte que ton 'get' qui va chercher la valeur regarde si y'a déjà une valeur, sinon charge la valeurs (et les autres données associées) de la BD...

Mais tout ça me parait farfelu. Si t'es pas capable d'aller checher toutes tes infos associées à un client d'un coup avec un join, c'est que t'as un problême de design de ta BD à mon avis...

Posted on: 3/3 16:10
Transfer the post to other applications Transfer


Re: Php5 objet client
Nouveau
Joined:
2009/7/27 18:18
Group:
Utilisateurs Enregistrés
Posts: 2
Level : 1; EXP : 2
HP : 0 / 0
MP : 0 / 2
Offline
Une des raisons pour lesquels l'utilisation des get/set sont fortement recommandé, c'est que tu peux ajouté le code que tu veux quand certaines propriétés sont demandées.

Dans ton cas, la structure qui serait intéressante ce serait quelque chose dans le genre :

class Client {     
    private 
$no;     
    private 
$annee;          
    private 
$municipalite
    
    [...]
    
    public function 
getNo() {
        if (
$this->no == null)
            
$this->loadBasic();
        return 
$this->no;
    }
    
    public function 
getAnnee() {
        if (
$this->annee == null)
            
$this->loadBasic();
        return 
$this->annee;
    }
    
    public function 
getMunicipalite() {
        if (
$this->municipalite == null)
            
$this->loadExtended();
        return 
$this->municipalite;
    }
    
    [...]
    
    private function 
loadBasic() {
        [...]
    }
    
    private function 
loadExtended() {
        [...]
    }
}

Posted on: 3/6 17:54
Transfer the post to other applications Transfer


Re: Php5 objet client
Webmestre
Joined:
1969/12/31 19:00
From Montréal
Group:
Webmestres
Utilisateurs Enregistrés
Organisation
Posts: 413
Level : 18; EXP : 90
HP : 0 / 447
MP : 137 / 53067
Offline
Note que tu peux aussi regarder du côté des méthodes magiques __get et __set

Posted on: 3/6 21:30
Transfer the post to other applications Transfer


Re: Php5 objet client
Nouveau
Joined:
3/3 13:50
Group:
Utilisateurs Enregistrés
Posts: 3
Level : 1; EXP : 10
HP : 0 / 2
MP : 1 / 3
Offline
Good!!

Merci beaucoup pour toutes ses réponses....


Posted on: 3/8 8:56
Transfer the post to other applications Transfer


Re: Php5 objet client
Nouveau
Joined:
3/9 11:07
Group:
Utilisateurs Enregistrés
Posts: 1
Level : 1; EXP : 0
HP : 0 / 0
MP : 0 / 0
Offline
Une autre solution serait:

class Client {
private $no;
private $annee;
private $municipalite;
private $ExtendedInfo = false;


[...]

public function getNo() {
return $this->no;
}

public function getAnnee() {
return $this->annee;
}

public function getMunicipalite() {
$this->loadExtended();
return $this->municipalite;
}

[...]

private function loadBasic()
{
//tu l'appelles dans le constructeur
}

private function loadExtended() {
if (!this->ExtendedInfo) {
//charger les autres infos, SQL, affecter les attributes, etc...
$this->ExtendedInfo = true;
}
}
}

Posted on: 3/9 11:16
Transfer the post to other applications Transfer






You can view topic.
You cannot start a new topic.
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.

[Advanced Search]


Evènements à venir
Connexion
Username:

Password:


Lost Password?

Register now!
Canal IRC
Venez nous voir sur notre canal IRC avec votre client favori :

irc.phpquebec.org
canal : #phpquebec
Membre de
Hébergé par
Nexen Services