Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les news > Tutoriels > Mise à jour du tutoriel PHP > Lecture d'une news

Commentaires de news :
Mise à jour du tutoriel PHP

Revenir à liste des news

Mise à jour du tutoriel PHP

# Par M@teo21, le 19/03/2008 à 10:27:20
Logo PHP
Depuis quelques temps, je souhaitais faire plusieurs mises à jour du tutoriel PHP. Rien de bien conséquent soyons clairs, car je n'ai pas le temps de faire une mise à jour en profondeur de ce tutoriel pour le moment.

Toutefois, il m'a semblé nécessaire de faire quelques petits rafraîchissements.


Les chapitres mis à jour



Image utilisateur

Mise à jour du chapitre sur WAMP pour prendre en compte WAMP 2, la nouvelle version.
Les captures d'écran ont été refaites ainsi que les explications lorsque cela était nécessaire. Heureusement, le principe d'utilisation reste le même donc vous ne devriez pas être trop chamboulés.

Image utilisateur

Mise à jour de la vidéo "Importer un fichier SQL dans PHPMyAdmin", qui était restée à l'ère EasyPHP.
Le chapitre concerné est "Lire des données" de la section MySQL.


Image utilisateur

Ajout d'une sous-partie sur l'envoi (upload) de fichiers par formulaire qui m'a toujours semblé manquer.
C'est une sous-partie un peu plus technique que le reste du chapitre mais elle devrait vous permettre de faire vos premiers pas avec l'upload de fichiers.
Toutefois, ce n'est là qu'une brève introduction je ne m'en cache pas, et je n'ai pas cherché à aller plus dans les détails car il existe déjà un excellent tutoriel réalisé par DHKold, dont je me fais l'écho à la fin de ma présentation.


Ce qui reste à faire



Dans la catégorie "Mises à jour à faire", il serait aussi nécessaire de refaire les explications sur le partitionnement sous Linux avec Ubuntu car il a pas mal changé depuis que j'ai rédigé le chapitre.
Toutefois, comme des nouvelles versions d'Ubuntu sortent tous les 6 mois, et que la prochaine devrait arriver en avril (le mois prochain), j'attends la nouvelle version avant de m'en occuper ^^

En C, je mettrai bientôt à jour le chapitre qui présente Code::Blocks au début du cours pour présenter la version stable sortie il y a peu.

Et enfin, puisque je sais que la question va être soulevée dans les commentaires, non je n'ai pas prévu de traiter la POO en PHP pour plusieurs raisons : manque d'intérêt pour la POO en PHP personnellement, peu de courage pour réexpliquer les concepts de la POO en PHP alors que je l'ai fait il y a peu de temps pour le C++, peu de conviction enfin à titre personnel de l'intérêt de telles explications dans mon cours.
Ca ne veut pas dire que c'est définitif, mais il me faudra plus de motivation personnelle pour que je m'y mette. En attendant, ce ne sont pas les tutoriels à rédiger qui manquent !

185 Commentaires

Désolé, les commentaires de cette news sont désactivés, vous ne pouvez pas en ajouter !

Page : Précédente  1  2  3  4  5  6  7 
Pseudo Commentaire
1 visiteur sur cette news (0 membre et 1 anonyme)
Page : Précédente  1  2  3  4  5  6  7 
Hors ligne shi # Posté le 27/03/2008 à 03:56:19
Groupe : Membres
`Haku a ecrit ca:

Citation : `Hacku
Pourtant, si je regarde ces deux codes :

Code : PHP - Afficher / masquer les numéros de ligne
  1. <?php
  2.       class Complex {
  3.           private $_real;
  4.           private $_i;
  5.           public function __construct($real, $i) {
  6.               $this->_real = (int)$real;
  7.               $this->_i    = (int)$i;
  8.           }
  9.           public function add(Complex $c) {
  10.               $this->_real += $c->_real;
  11.               $this->_i    += $c->_i;
  12.           }
  13.           public function __toString() {
  14.               return (string)$this->_real . ($this->_i >= 0 ? ' + ' : '') . $this->_i . 'i';
  15.           }
  16.       }
  17.  
  18.       $a = new Complex(2, 3);
  19.       $a->add(new Complex(5, 0));
  20.       echo $a;
  21.       ?>
  22.  
  23.  
  24.  
  25.       <?php
  26.       namespace Complex;
  27.  
  28.       function create($real, $i) {
  29.           return array($real, $i);
  30.       }
  31.  
  32.       function sum($a, $b) {
  33.           return array($a[0]+$b[0], $a[1]+$b[1]);
  34.       }
  35.       function toString($c) {
  36.           return (string)$c[0] . ($c[1] >= 0 ? ' + ' : '') . $c[1] . 'i';
  37.       }
  38.       require_once './Complex.php';
  39.  
  40. $a = Complex::create(2, 3);
  41. $a = Complex::sum($a, Complex::create(5, 0));
  42. echo Complex::toString($a);
  43.  ?>

j'ai l'impression que ni dans l'un ni dans l'autre l'utilisateur n'as besoin de se soucier de la représentation du complexe.
Evidemment, si on avait des structures typées comme les struct du C, le second code serait plus sûr, mais ça c'est une faiblesse de PHP et non du paradigme procédural.
Et par conséquent je pense qu'on peut affirmer que ces deux codes sont aussi cohérents l'un que l'autre.


Ces deux codes montrent bien l avantage de la POO sur le procedural.

L'un des principes de la POO est de cacher a l utilisateur la structure interne, l etat interne de l objet.
Hors la methode procedural fait tout ce qu il ne faut pas faire : recrache l etat interne.
Mais en fait, non, elle ne recrache pas l etat interne, parce que le paradigme procedural ne possede une idee d etat interne qu au niveau des fonctions, contrairement a la POO qui possede cette notion au niveau de la classe.

C'est bien ca qu il faut comprendre:

Procedural : un ensemble de fonctions differentes travaillant sur des donnees. (encapsulation au niveau de la fonction)
POO : des donnees qui forment un tout possedant des methodes, actions. (encapsulation au niveau de la classe)


Code : PHP - Afficher / masquer les numéros de ligne
  1. $a = Complex::create(2, 3);
  2. $a = Complex::sum($a, Complex::create(5, 0));
  3. echo Complex::toString($a);

Ta fonction create retourne une array. je peux donc faire cela:

Code : PHP - Afficher / masquer les numéros de ligne
  1. $a = Complex::create(2, 3);
  2. $a[0]='string';
  3. //ou encore
  4. array_pop($a);

Le reste de ton code ne marchera plus.
Mais il faut voir que dans un contexte procedural ou la notion d etat interne se situe au niveau de la fonction. Le resultat est coherent.
La fonction manipule la donnee, retourne la donnee. finit. Il n y a pas d idee d'un tout.
La POO, renverse le probleme est reunit toutes les donnees dans une classe et unifie le contexte pour creer un etat interne.
Ainsi ton implementation en classe permet de proteger l encapsulation de plusieurs donnees, chose que le procedural ne peut faire.
L'un des avantages de la POO est donc cette protection de plusieurs proprietes qui une fois reunit donne un objet.
Cette protection est le meme processus que le corps humain: chaque etat interne est relie et permet au tout d avoir des methodes.
Si on saigne, nous n avons pas besoin de dire a notre corps d arreter de saigner. le corps s en occupe pour nous.
La POO offre ce mecanisme.

ensuite, si on regarde ton code procedural:
Code : PHP - Afficher / masquer les numéros de ligne
  1. namespace Complex;
  2.  
  3.       function create($real, $i) {
  4.           return array($real, $i);
  5.       }

Tu as choisi une simple array. En fait, choisir une hash aurait ete encore plus interessant:
Code : PHP - Afficher / masquer les numéros de ligne
  1. namespace Complex;
  2.  
  3.       function create($real, $i) {
  4.           return array('_real'=>$real, '_i'=>$i);
  5.       }

(desole php j ai oublie donc c est peut etre faux)

Pourquoi choisir une hash est plus interessant?
Parce que l on retrouve le meme processus dans d autres languages tel que Perl ou Javascript:

Perl:

Code : Perl - Afficher / masquer les numéros de ligne
  1. package Complex;
  2.  
  3.       sub new {
  4.           my ($package) = shift;          #lorsqu on appelle la fonction on lui met son nom de package qu on recoit en premier argument
  5.           my %args        = @_;            #on recoit les arguments parametres
  6.           my $this         = {};              #on cree une ref de hash
  7.           $this->{_real}  =  int($args{real});
  8.           $this->{_i}       =  int($args{i});
  9.           bless $this, $package;
  10.          return $this; #cette ligne n est pas utile mais c est ce que fait perl, il renvoie la hash
  11.       }
  12.       sub add {
  13.           my $this = shift; # on recoit l instance actuel de l object, car il s agit d une methode objet
  14.           my $complex= shift;
  15.           warn 'no,no' if(!$complex->isa("Complex"));
  16.           $this->{_real}+=$complex->{_real};
  17.           $this->{_i}+=$complex->{_i};
  18.       }
  19.       1;
  20.      #dans le code
  21.      my $complex = new Complex(real=>3,i=>0);

Je n entre pas dans les details mais il faut savoir que perl ne supporte pas la POO nativement.
Il s agit d un hack en quelques sortes. c est plus bas niveau que php qui contient les mots cles de ce paradigme.
Mais c'est simple : on cree un namespace, cree une hash qui contiendra les proprietes de notre objet et on bless, c est a dire attache le nom du namespace avec celui de la hash, la hash (utile pour l inheritance)

On voit ici qu on est tres pres de ton implementation en php avec le namespace et l utilisation d une array.
Lorsque que quelqu un a dit que tu simulais la POO, il n avait pas tort. Disons que ton code est un avant gout de ce que peut etre la POO.
On peut voir que le code perl a un tres gros defaut : on peut avoir access aux variables internes et donc ce code n offre pas d encapsulation.
A partir de la, differentes methodes sont nees pour permettre d avoir des methodes, proprietes statiques, des methodes, proprietes privees, etc et cela sans aucun
mot cle (utilisation de la reference memoire, utilisation de closure,etc)

C' est interessant car Javascript, bien que reposant sur la POO, offre peu de mots cles permettant l encapsulation:

Code : JavaScript - Afficher / masquer les numéros de ligne
  1. var Complex = function (real, i) {
  2.         this._real = parseInt(real);
  3.         this._i      = parseInt(i);
  4. }
  5. Complex.prototype = {
  6.         add : function(complex) {
  7.           if(!complex isInstanceof Complex) new Error('no,no');
  8.           this._real+ = complex._real;
  9.           this._i+      = complex._i;
  10.       }
  11.  
  12. var complex = new Complex(3,0);
  13. complex.add(new Complex(3,0));
  14. };


Lorsque pour perl, on doit blesser la hash, javascript le fait pour nous a travers le mot cle new.
Mais il faut savoir que l objet renvoie n est ni plus ni moins qu une hash dote d un nom.
La encore, l encapsulation est inexistante et est souvent simule a travers closure si necessaire.

J espere que l on comprend bien par la que complex.add ou complex->add est tres different de add().
Le premier est un ensemble de donnees dote de methodes, le deuxieme est une fonction travaillant sans contexte autre que le sien.

C est a partir de cette enorme difference que l encapsulation peut naitre.
Finalement de ce concept sont aussi apparus l inheritance et le polymorphisme qui sont a mon avis plus une consequence que le but premier de la POO.

La POO plus lisible que le paradigme procedural? J aurais tendance a dire oui a partir du moment ou il y a plusieurs proprietes dont l etat
doit etre conserve
et etre cache de l utilisateur.
L example du haut est trival mais des applications de plusieurs milliers de lignes de codes sont autrement plus complexes.
Mais la POO est complexe, surtout si on y ajoute les design patterns qui augmentent le niveau d abstraction.

Quant a dire que la POO est plus naturel que le procedural ( ou sequentiel), je dirai que non.

Lorsque l homme a voulu se proteger d un predateur, il a peut etre pris la pierre la plus grosse et la jete sur la gueule de son adversaire.
Il l a fait deux, trois, quatres fois puis c est rendu compte que la pierre doit etre lourde pour etre efficace mais que le poids
rend la visee et la portee plus difficile.
Alors, il a commence a analiser la situation... quelque chose de fins mais pointus ira plus loin et pourra meme tuer l adversaire qui devient proie.
si on tend une corde et qu on y met un baton, on accroit la portee.
si la tete est un peu plus lourde, on cree un effet d arrondi et d acceleration lors de la descente qui accroit les chances de tuer la proie,etc,etc.

La force de l homme c est sa capacite d analyse et d abstraction.
Mais c est en general apres balbutiements, essais et echecs venus de tentatives empiriques.
Donc le procedural est plus simple a apprehender, plus naturel.
la POO est le resultat d une analyse et d une abstraction, ce qui n est pas a la portee de tous et demande plus d effort.

En tout cas, j avais ete decu de la facon dont Mateo avait introduit le concept de POO dans son cours de C++.
L example etait mal choisi je pense et faisait tomber le tuto dans le commun des cours sur la POO.

Est ce que le PHP meriterait un cours sur la POO? eh bien oui. si Mateo reussi a faire comprendre la POO
de sorte que le tuto soit unique en son genre.
c est parce que les tutos sont limpides que le site du zero a du succes.
Toutes les personnes qui viennent sur ce site ne sont pas tous des debutants.
certains on un niveau faux debutant. Ils commencent a s interesser a la POO mais ne trouve rien de clair.
et la, Mateo pourrait permettre a ces gens de comprendre cette etape.
donc oui, un cours sur la POO par mateo en php me semblerait etre un moyen de faire demarquer encore plus le site.
Hors ligne bluestorm # Posté le 27/03/2008 à 17:35:28
dont ask to ask
Avatar
Groupe : Membres
Ton analyse sur la différence "contexte public / état interne" est tout à fait pertinente.

Cependant, tu as tort quand tu expliques que :
- dans le cas de Complex, le danger vient de la mise à disposition de l'état public
- en général, l'encapsulation est propre à la POO

État trop visible, ou structure trop mutable ?



Tu montres dans ta première partie que la non-encapsulation du complexe (un array est accessible) est un gros problème que la POO peut résoudre. Cependant, on peut remarquer que le problème n'est pas lié à l'accessibilité de l'array, mais à la possibilité de le modifier. En effet, si le tableau était inaccessible mais non modifiable, le problème de la corruption ne se poserait pas.

Ce n'est pas une remarque dans l'eau : dans certains langages, en particulier les langages fonctionnels, la plupart des structures de données sont "non modifiables" (ou de l'anglais, non mutable). Un tableau non mutable (ou une structure équivalente comme un couple) serait une très bonne représentation du complexe, ne souffrant pas du problème que tu décris, bien que l'état soit public.

C'est d'ailleurs évident, car, à la possibilité de la modification près, le tableau de `Haku est exactement équivalent à l'objet : on peut construire un objet à partir du tableau, et inversement (en utilisant actuellement la fonction to_string puis en parsant le résultat, ou, plus raisonnablement, en utilisant des méthodes RealPart/ImaginaryPart).

D'ailleurs, on peut simuler des variables non mutables en PHP, avec des fonctions. C'est long et chiant à faire, mais si ça vous intéresse je pourrais essayer.

Enfin, la présentation de la structure interne du complexe (ici un array) n'a pas que des inconvénients (je prétends même qu'au problème de la modification près, elle n'a que des avantages) : elle permet d'utiliser les fonctions qui existent déjà sur la structure générale (array) dans un cas particulier (les complexes).
Que faire par exemple si tu veux appliquer une fonction aux deux coordonnées de ton complexe (par exemple "multiplier par k" où k est réel) ? Avec la classe, tu es obligé de rajouter une méthode pour pouvoir faire ça. Avec l'array, tu utilises la fonction array_map déjà existante. Plus généralement, on peut réutiliser l'ensemble des fonctions de manipulation de structure, au lieu de devoir tout recréer au sein d'un objet. C'est un avantage assez limité en PHP, parce que le langage rend ce genre de manipulations peu pratiques, mais ça reste un avantage de l'approche "structure commune visible".

Bref, ce premier inconvénient que tu décris n'est pas directement lié à l'exposition publique de l'état, mais à son exposition sous la forme d'une structure mutable. On peut y répondre en cachant l'état, avec la POO, mais aussi en utilisant des structures immutables dans les langages qui le permettent facilement (en particulier les langages fonctionnels), et cette deuxième méthode reste "procédurale" (et règle par la même occasion de nombreux autres problèmes du langage).

La POO n'est pas la bonne solution au problème de modification silencieuse des variables.


L'encapsulation, invention de la POO ?



L'encapsulation que tu décris n'est absolument pas l'apanage que tu décris. Son idée de base, "on peut manipuler des données seulement selon une interface déterminée, et pas autre chose" n'est pas liée à l'objet (c'est un "concept orthogonal", que l'on peut développer indépendamment), et est disponible dans de nombreux langages non-objets, ou des parties non-objet de ces langages.

D'excellents exemples de cette idée sont les langages dérivés de ML (en particulier SML et OCaml), qui proposent un système de "modules" très puissant, permettant entre autre l'encapsulation par des "signatures" : en dehors du module, seules les fonctions spécifiées dans la signature sont accessibles, et pas les autres (c'est un peu le concept des "private" de la POO). On peut de plus avoir des variables dont le type est "abstrait", c'est à dire que sa structure interne n'est pas accessible en dehors du module, forçant les utilisateurs externes à utiliser les fonctions de création/utilisant définies par le module. On a donc une encapsulation excellente, en utilisant uniquement des concepts procéduraux et pas de la POO.

L'encapsulation n'est pas une notion POO


De plus, comme cela déjà été dit, le polymorphisme n'est pas une notion spécifique à la POO. Le paramétrisme polymorphique est un paramétrisme n'utilisant même pas de sous-typage (la relation d'inclusion entre les classes que l'on trouve en POO, parfois confondue avec l'héritage), et disponible dans des langages procéduraux, ou en général indépendamment de la POO.
 
Hors ligne coucou747 # Posté le 27/03/2008 à 19:16:50
Avatar
Groupe : Membres
Citation

Mais si tu attends un simple site qui fonctionne, qui ne souffre pas de faille de sécurité, c'est faisable très facilement.

j'ai chie sur plusieurs zeros sur ce sujet, on a meme vu un zero organiser un concours ici, et faire un site de presentation des sujets, site bourre de failles... on trouve des sites de partis politiques et de distribs linux, plein de failles...
pourquoi ? certainement a cause du typage de php, et du module mysql pour php qui pue compare au modele dbi de perl... (pourtant, perl est aussi merdiquement type)
en ocaml, on aurait jamais eu ce probleme...

sinon, ton exemple OO vs procedural, c'est pareil, en php tu ne peux pas faire de structure, donc c'est pas un langage pour faire la comparaison puisqu'il n'est au point ni sur l'OO, ni sur le procedural...

sur ce debat, ceux qui gueulent sur l'OO ne codent pas en php, on devrait diviser le debat en deux :

en php, l'OO est-elle correctement utilisable ?
quand on code en php, est-ce-que savoir coder OO est interessant ?

je repondrais clairement non au premier (on trouve de tres nombreux bugs au niveau de la gestion des exception, donc sans meme parler de ce qu'ils ont voulu faire, ils l'ont mal fait...)

pour la seconde question, je repondrais clairement oui... meme si en general, les frameworks fait en php sont lents et mal faits, (souvent par des codeurs java, ca explique que ca soit moche en php...) bah ca reste pratique, et la POO simplifie les choses et rend un code plus facilement maintenable (il parait qu'on peut diviser par trois le temps de developpement d'un site)
Hors ligne shi # Posté le 28/03/2008 à 00:34:12
Groupe : Membres
Merci bluestorm pour cette reponse enrichissante!

La possibilite de transformer l array directement est malheureusement une fausse bonne idee.
si on replace l example par une application comportant de multiples proprietes dont on doit garder l etat interne sous controle pour eviter des defaillances,ce genre de modifications directes est a eviter par tous les moyens. la POO est un moyen de proteger cette encapsulation a un niveau complexe d interdependance grace a une abstraction de l entite meme que le programmeur utilise.
(qui nous dit que le $k sera bien ce qu il doit etre et qu il est possible de faire une telle chose au moment T de l instance?)

$asset->extend(); => j ai peut etre par cette meme fonction modifie l etat interne de 4 ou 5 proprietes de cette instance, verifies que chaque etat permettait cette modification et j ai par la meme occasion appele tous les observeurs pour leur notifier de ma modification avec success.
l avantage de $asset, c'est qu il represente une entite abstraite pour la personne qui l utilise.
Et c'est bien comme ca car cela represente en soi un degre d abstraction encapsulante.

Concernant les languages que tu cites, meme s'ils ne sont pas base sur la POO, ils ont tous les elements qui peuvent la constituer, j ai l impression. si l exemple de $asset->extend est possible et si cree plusieurs instances simultanements avec un etat interne independant est possible alors nous sommes tres pres aussi de l example que je donne avec perl.
J ai pris l example de perl (procedural de base) et javascript car justement ils prennent pour base une hash(array associative) pour representer l etat interne et les methodes que possedent l objet.
Etre a meme de controller, modifier l etat interne d un objet qu a partir de methodes predefinies et pour moi la base de la POO.
Perl prend un package, une hash que l on blesse (bon maintenant pour simuler une meilleure encapsulation, d autres methodes sont apparues, mais la base) et on passe la hash a toutes les fonctions. les fonctions qui recoivent la hash, donc appele d une instance sont des methodes. les fonctions ne prenant pas la hash sont des statics de classe (en fait du package).
Finalement, meme si je ne connais pas les languages que tu cites, cela me semble etre tres proche et de nombreux modules (CPAN) sont bases sur les principes de la POO avec cette base.
en revanche lorsque tu dis que cela peut etre pratique de modifier l array directement, je ne suis pas d accord mais la capacite de chainage ($asset->extend->notify), de modification dynamique a run time de l objet sont a mon gout sympathiques (et une horreur pour les programmeurs java) dans certains rares cas. (un module ORM qui permet de vivifier multiples nouveaux objets avec des methodes cree a run time pour representer les columnes de la requete par example)

un language,meme procedural de base, qui a les outils pour creer et garder plusieurs etats internes de multiples proprietes synchrones et sous controle absolu permet alors de faire un programme oriente objet.

Mais il n en n est pas moins que la POO (ou des derives qui la simule) est, il me semble l outil le plus juste pour cree ce degre d abstraction (via finalement l utilisation d une variable close a la modification externe) permettant une meilleure encapsulation.

Concernant le polymorphisme, l inheritance (multiple en perl), elle est tout a fait possible en perl avec une simple hash et un package donc je peux comprendre ce que tu dis mais je pense toujours qu il s agit d une consequence et non pas d'un but de la POO et que les artifices utilises par perl pour simuler la POO rendent le code moins pratique a comparer d'un language comportant deja les mots cles de ce paradigme et je pense que cela doit etre pareil pour les languages que tu cites (bon je m avance la^^)

En tout cas merci pour ton avis pertinent!! j irai regarder un peu les languages donc tu parles!
Hors ligne scientifix94 # Posté le 28/03/2008 à 21:50:30
Bof...
Avatar
Groupe : Membres
Si la demande est vraiment grande, jessairai de faire un tuto sur la POO.

Image utilisateur

>Bientôt en ligne: La Maison du Webmaster
>Blogiwi: Plateforme de blog novatrice !

 

Désolé, les commentaires de cette news sont désactivés, vous ne pouvez pas en ajouter !

Revenir à liste des news

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 818 Zéros connectés | Requêtes SQL 5 requêtes | Temps de génération de la page : Total (SQL) 0.0866s (0.0639s)