[PHP5]CLASSE DE TEMPLATE PHP AVEC CACHE

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 17 juin 2007 à 19:01
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 - 26 juin 2007 à 08:53
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/43148-php5-classe-de-template-php-avec-cache

FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
26 juin 2007 à 08:53
Je parlais du public/private au départ, mais avec Coucou on parlait du manque niveau POO :)
hametsu21 Messages postés 37 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 24 février 2008
25 juin 2007 à 20:54
j'ai pas trop compris vos recommendations. Sont-elles de l'ordre générale sur PHP et ses possibilités en POO ou de la source ?
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
25 juin 2007 à 15:56
En effet, ca manque aussi.
D'après ce que j'ai lu, il semblerait que ce soit pour PHP6.

Peut être :)
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
25 juin 2007 à 14:56
et mettre une classe dans un namespace ? :)

je ne parlais pas seulement de l'overloading de functions, mais aussi d'operator, faire :
$a=new Vector(1, 3, 5);
$b=new Vector(5, 3, 1);
$c=$a+$b;
comme on peut le faire en Cpp... moi ca me manque (d'autant plus que j'ai fait quelques classes lignes pour positionner des points en "live")
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
25 juin 2007 à 14:45
"Si ce n'est pas le cas, rien ne dit que les évolutions de l'application ou de l'objet n'amèneront pas ces contraintes."

Si on utilise les propriétés publiques, on se doute bien qu'au final il n'y aura pas d'évolution dans ce domaine. Je m'explique.
Prenons le cas d'une propriété de débug. Pas besoin de get/set pour du débug, on s'en carre le cornichon :)
Même si il y a évolution du projet derrière :

class x {
public $debug = false;
//
}
class y extends x {
//
}

$y = new y;
$y->debug = true;

Bon et voila :)
Dans ce cas la, le "public" fonctionne très bien et tu n'as pas besoin de faire :
$y->setDebug(true); ou $y->ActiveDebug();
C'est une perte de temps :o

Comme dit Coucou, ce qui manque, c'est la redéclaration des méthodes. Rien de plus beau (comme en Java) de faire :
public function __construct($var);
public function __construct($var, $truc);
public function __construct(Object $x, Object $y);
Sans avoir à se faire chier avec func_*() et autre fonction de ce genre.
Le namespace, tu peux y arriver via le statissisme :
class x {
static public function x1();
}

x::x1();
Et tu peux très bien arriver à un résultat de ce genre :
x::x1()->...()->...->...::...()->...();
Techniquement, je crois que ca passe.

Pour en revenir plus, chacun est libre de faire comme il veut.
Pour ma part, c'est simple :
abstract class Item {
public $debug = false;
}
abstract class Factory extends Item {
//
}
abstract class Element extends Item {
//
}
class NewsFactory extends Factory {
//
}
class News extends Element {
//
}

Pas besoin de m'ennuyer avec des méthodes qui servent à rien :)
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
25 juin 2007 à 12:56
les classes en general, ou dans ton projet ?

en general, disons que moi, ce qui me manque terriblement, c'est la surcharge d'operateurs, et les namespaces.

pour ton projet, je crois que tout a ete dit
hametsu21 Messages postés 37 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 24 février 2008
25 juin 2007 à 12:43
Et à par ce petit débat fort sympathique, avez-vous des suggestions sur les classes (mises à jour) ?
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
25 juin 2007 à 11:25
Je suis aussi de ton avis Bonsai :)
cs_bonsai Messages postés 5 Date d'inscription vendredi 14 novembre 2003 Statut Membre Dernière intervention 8 janvier 2009
25 juin 2007 à 10:17
Hello tous,

En fait les get/set ont d'autres raisons d'être systématiques; par exemple, quand on met à jour la valeur d'un attribut, il peut y avoir d'autres choses à faire (test de valeurs limites, autre(s) attribut(s) à modifier, etc.). Si ce n'est pas le cas, rien ne dit que les évolutions de l'application ou de l'objet n'amèneront pas ces contraintes. Si on n'a pas mis les get/set, il faut modifier tout le code qui modifie les attributs publiques...

Enfin, la philosophie objet (en tous les cas tel que je la perçois) dit que l'on doit utiliser un objet comme une boite noire, donc que l'on n'a pas savoir ce qui se passe dedans, donc les attributs en private et des get/Set.
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
20 juin 2007 à 16:15
Heu.... :o

"Une classe se définit ainsi : 1 nom, des données membres (attributs), 1 constructeur et des méthodes."
Pour ca, on est tous d'accord. On peut rajouter quelques trucs, mais la base y est.

"Il appelle donc l'action avalerMedicament() qui va mettre à jour l'état de son foie mais il ne peut pas appliquer directement $corpsHumain->foie = 'truc'"
Pourquoi ? Parce que ta méthode avalerMedicament fait appel à d'autres procédés avant d'arriver à une purification de ton foie. Voila pourquoi ta propriété foie doit être privé/protégé dans ce cas précis.
Maintenant, jouons la autrement.

Notre foie est toujours malade. Mais nous allons ajouter une propriété "auto_soin_foie" qu'on va mettre à vrai.
Hors, pour une raison X ou Y, on se retrouve avec : $corpsHumain->auto_soin_foie = false;

Mais de toute facon, que la réparation du foie soit automatique ou non, on va faire avaleMedicament().

Ici, auto_soin_foie n'a pas besoin d'être privé, car, bien que son comportement influe sur l'instance, il n'est pas nécessaire de faire un controle strict dessus.
Pas la peine de faire :
public function setAutoSoin($var) {
$this->auto_soin_foie = (bool) $var;
}
public function getAutoSoin() {
return $this->auto_soin_foie;
}

La par exemple, le privé/protégé ne sert à rien.
Si tu me dis "nan on ne controle pas ce qui rentre..." bien sur que si, c'est du vrai/faux. Et regarde, si je jète un oeil à ma méthode avaleMedicament(), j'ai ca :
if ( (bool) $this->auto_soin_foie ) {
//
} else {
//
}

J'ai réglé tout mes problèmes.


Pour un traitement de nombres/chaines/objets/flottants etc... tu peux/doit passer par du get/set, surtout à cause du set.
Pour un traitement en booléan, bof bof :)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 juin 2007 à 09:36
a chaque fois qu'il épile pas les chats, étrangement, Lara Fabian sort un disuqe peu de temps après...

à bien écouter, remarques, on comprend un peu mieux ^^
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
19 juin 2007 à 09:30
Chacun sa méthode ^^ Je plains les chats par contre... Je vais te dénoncer à la SPA et à l'association Brigitte Bardot Coucou747 ^^
hametsu21 Messages postés 37 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 24 février 2008
19 juin 2007 à 08:30
Webdev, j'avais pas vu ça comme çà :D et tu as raisons ;) Merci pour l'exemple ;)
L'utilisation d'un setter aide pour la mise en place d'un poka-yoké (http://www.nexen.net/articles/dossier/15024-le_filtrage_poka-yoke.php). Une mise à jour s'impose ;p
cs_Alain Proviste Messages postés 908 Date d'inscription jeudi 26 juillet 2001 Statut Modérateur Dernière intervention 1 février 2015 2
19 juin 2007 à 06:00
moi jsuis plutot classification...
animaux mamiferes etc.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
19 juin 2007 à 00:12
c'est pas si capilotracte que ca, en general, moi pour explique de l'objet, j'imagine un chat, je compte ses pates et je l'epille...
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
19 juin 2007 à 00:07
>> Pourquoi rajouter un setter alors qu'avec l'attribut public, nous pouvons accéder au variable de la session ? Surtout que c'est pas comme si c'était un identifiant de base de donnée ou tout autre variable critique...

Une classe se définit ainsi : 1 nom, des données membres (attributs), 1 constructeur et des méthodes. Quand tu définis une classe, tu modélises un objet. Cet objet a ses propres propriétés (attributs) et ses propres actions (méthodes). En déclarant tes attributs privés, tu forces la visibilité et l'accès à ces derniers par l'objet lui même. Seul l'objet doit pouvoir mettre à jour ses données membres via l'utilisation de setter(). Je prends un exemple métaphorique, peut-être peu approprié mais qui illustre ce principe.

Prends un être humain. Le+ corps humain est composé d'organes (ses attributs) et est capable d'agir (courrir, respirer, marcher, réfléchir). On visualise donc ici une modélisation schématique du corps humain composé d'attributs et de méthodes. Admettons que le corps humain d'une personne tombe malade. Le foie (attribut) est touché par une hépatite C. Comment le guérir ? Solution pour le patient : il doit avaler différents médicaments. Dans ce cas, cela signifie que seul lui même peut se guérir en avalant un médicament. Il appelle donc l'action avalerMedicament() qui va mettre à jour l'état de son foie mais il ne peut pas appliquer directement $corpsHumain->foie = 'truc'

J'essaie de montrer par cet exemple un peu tiré par les cheveux, l'intérêt d'utiliser des setters pour mettre à jour les attributs d'une classe.

++
hametsu21 Messages postés 37 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 24 février 2008
18 juin 2007 à 15:09
Séparer la logique de la présentation sans utiliser de moteur de template avec des pseudos languages et des tonnes de méthodes pour aboutir au même résultat tout en réduisant le temps d'éxecution d'une page.
Avec cette classe il est possible de gérer un système de thème et de mettre en cache.
Je ne vois pas en quoi je "remplace" echo(), si j'aurais voulus remplacer echo(), j'aurais utiliser print() :)
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
18 juin 2007 à 14:25
ton but c'etait quoi ? faire un truc simple et concis pour remplacer echo mais sans rien apporter de plus ?
hametsu21 Messages postés 37 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 24 février 2008
18 juin 2007 à 13:52
Oui et Non, car dans ce cas on se limiterait à nos simple méthodes et non à celle d'orgine dans PHP, car il faudrait rajouter plusieurs méthodes et ce n'est pas mon but.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
18 juin 2007 à 13:20
je vais suivre ton raisonement : utiliser echo directement, ca marche tres bien, et c'est imbatable en perfs, pourquoi se faire chier avec autre chose ?

utiliser un truc complique avec d'autres balises, ca fait un systeme plus souple, plus propre, plus modifiable, etc...
hametsu21 Messages postés 37 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 24 février 2008
18 juin 2007 à 13:15
Oui, en effet, mais vu que ça marche par un système simple, pourquoi mettre en place un système compliqué :D ?
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
18 juin 2007 à 12:43
tu inseres une template comme une variable, c'est ca que je veux dire, t'as rien pour l'inserer comme ca avant, et inserer les variables une seule fois pour toute les templates... du coup, c'est normal que ca marche, meme si t'as rien fait pour...
hametsu21 Messages postés 37 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 24 février 2008
18 juin 2007 à 09:35
"La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer."
Antoine de Saint-Exupéry.

Pourquoi rajouter un setter alors qu'avec l'attribut public, nous pouvons accéder au variable de la session ? Surtout que c'est pas comme si c'était un identifiant de base de donnée ou tout autre variable critique...

Pourquoi rajouter un système de pseudo language, le but est d'utiliser le moins possible de ressources, de codes, de méthodes... Actuellement, l'imbrication est effectivement illimité et je ne vois pas le rapport avec "j'ai pas code la fonctionalite, j'ai pose du scotch, et ca tient, si ca tombe, je poserais une agraphe". D'ailleurs, les requêtes ne doivent pas être executer par la Vue mais par le ModelDAO... j'aime bien séparé les différentes choses...

A+
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
17 juin 2007 à 22:13
dire que l'imbrication de template est illimitee avec un systeme comme :
$user_list_render = $tpl->render('user_list.php');
$tpl->setVar('user_list_render', $user_list_render);

c'est tres "j'ai pas code la fonctionalite, j'ai pose du scotch, et ca tient, si ca tombe, je poserais une agraphe"...

enfin on aurait pu penser a un tag genre {template "machin.tpl"} avec des options genre pour un resultat de requette : {template "machin.tpl" requetteNom -All} ou {template "machin.tpl" requetteNom -Limit 1 to 10} voir encore {template "machin.tpl" requetteNom -Once}
et des variables genre {variable ici}
ou une combinaison : {template "machin_{variable}.tpl" requetteNom -Once}
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
17 juin 2007 à 22:02
Ce qui me chagrine surtout ce sont les attributs publics qui sont largement déconseillés. Pourquoi ne les mets-tu private ? Tu fais un setter() pour mettre sa valeur à jour. D'ailleurs tu pourrais plutôt définir le template de cette manière :

<?php

$tpl = new Template('monTemplate.tpl');

?>

Sinon je plussoie Coucou747 par rapport aux tags que tu utilises.

++
hametsu21 Messages postés 37 Date d'inscription mardi 1 novembre 2005 Statut Membre Dernière intervention 24 février 2008
17 juin 2007 à 20:08
Mais sinon, tu vois aucun code qui te chagrine, tu ne vois pas comment l'optimiser ? Rendre la classe plus efficace ?

Merci :)
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
17 juin 2007 à 19:01
<? c'est pas une syntaxe utilisable sur les serveurs qui ont du xml, c'est obsolete, on doit mettre <?php echo..
Rejoignez-nous