Besoin d'explications

VaN
Mammouth du PHP | 1107 Messages

15 juil. 2010, 10:22

Bonjour,

Cela fait plus de 5 ans que je fais du PHP procédural, et j'ai décidé de me mettre à l'objet. J'ai donc commencé par quelques tutoriaux et cas pratiques, et je commence à comprendre un peu le principe.

Mais il y'a un truc qui m'échappe.

Disons que j'ai un système de gestion de news, et un système de gestion des utilisateurs. Je vais prendre un exemple de fonction un peu idiot :
Disons que j'ai besoin d'une fonction qui passe un string en uppercase (et disons que la fonction strtoupper() n'existe pas).

En procédural, j'aurai donc eu un fichier stockant mes fonctions, avec une fonction string_to_uppercase().
Et cette même fonction me servirait pour les titres des news, mais également les noms de famille des utilisateurs. Une seule fonction, pour tout le site.

Mais en objet, je vais avoir 2 classes, News et Users, et dans chacune, je vais devoir créer une méthode string_to_uppercase(). La programmation Objet est censé simplifier les choses. Pourtant, je me retrouve avec 2 fonctions identiques, dans 2 classes totalement différentes.

Ou alors j'ai raté quelque chose ?

ViPHP
ViPHP | 5462 Messages

15 juil. 2010, 10:31

il suffis de crée une autre class par exemple "Utils", et mettre si possible les fonction en static
comme ca dans n'importe quel autre class tu feras Utils::string_to_uppercase(); :wink:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

15 juil. 2010, 11:21

Bien que la méthode de stealth35 soit la bonne à suivre dans ton cas, il y a tout de même un truc à comprendre : se mettre à l'objet ne signifie pas ne plus jamais faire de fonction.
Il existe des cas où les fonctions sont utiles, et elles doivent donc être utilisées.

Pour faire un parallèle, je dirais que c'est comme tout ces gens qui ont voulus faire du HTML plus propre, et qui ont bannis la balise <table> de leur connaissance, au point de faire des tableaux en div, span.
Et comme dans cet exemple là, l'idée est de ne pas rayer un système de la carte, mais juste de l'utiliser là où c'est judicieux.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

VaN
Mammouth du PHP | 1107 Messages

15 juil. 2010, 13:24

mhh ok je comprend mieux. Merci.

ViPHP
ViPHP | 5462 Messages

15 juil. 2010, 13:37

mhh ok je comprend mieux. Merci.
c'est rare (je parle pour moi) d'avoir a créer des fonctions en procédural, par contre en objet tu peu étendre les classes, donc avoir des fonctions communes. par exmeple tu pourrais avec besoin de récupérer une news ou un user grace a son "id" (si c'est avec une base) sur le principe de Model tu pourrais avoir ca

//attention c'est schematique
class Model
{
    public function getById($id)
    {
        $query = $sql->query("SELECT * FROM {__CLASS__} WHERE id=$id");
        return $query;
    }
}
et ensuite tu crées les modeles étendu
class Users extends Model
{
}

class News extends Model
{
}
tu pourras faire
$new = new News();
$new->getById(34);

$user = new Users();
$user->getById(18);

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

15 juil. 2010, 14:04

c'est rare (je parle pour moi) d'avoir a créer des fonctions en procédural, par contre en objet tu peu étendre les classes, donc avoir des fonctions communes. par exmeple tu pourrais avec besoin de récupérer une news ou un user grace a son "id" (si c'est avec une base) sur le principe de Model tu pourrais avoir ca
Effectivement, je ne te cache pas que le % de fonction dans mes codes doit se trouver en dessus de 1, mais pour certaines méthodes de présentation, ça peut être utile.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

VaN
Mammouth du PHP | 1107 Messages

15 juil. 2010, 15:13

Etrange, car pour ma part, j'utilise des dizaines et des dizaines de fonctions, sur chacun de mes projets en procédural.

Des fonctions de formatage de date, de string, des fonctions de récupération de données dans la base (par exemple des fonctions get_users() ou get_news(), etc), ainsi que des tonnes de fonctions me renvoyant des booléens, pour tester toute sorte de chose (une fonction user_has_postes_actifs($user_id) qui par exemple va vérifier si un utilisateur donné à des postes en cours dans la base de données). La plupart ne me servent qu'une seule fois dans tout le projet, mais j'ai pris pour habitude d'en faire des fonctions, au cas où.

Sur un gros projet que je viens de finir, mon fichier lib.main.php pèse 138Ko, pour plus de 2500 lignes de code.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

15 juil. 2010, 17:03

Tu as dis tout ce que tu avais à dire :
Etrange, car pour ma part, j'utilise des dizaines et des dizaines de fonctions, sur chacun de mes projets en procédural.
Parce que tout ce que tu dis après :
Des fonctions de formatage de date, de string,
=> une classe Utils, comme indiqué en début de thread par stealth35
des fonctions de récupération de données dans la base (par exemple des fonctions get_users() ou get_news(), etc)
En POO, tout ce qui touche à la récupération d'objet doit se trouver dans des classes
ainsi que des tonnes de fonctions me renvoyant des booléens, pour tester toute sorte de chose (une fonction user_has_postes_actifs($user_id) qui par exemple va vérifier si un utilisateur donné à des postes en cours dans la base de données)
Toutes ces méthodes sont des comportements d'objet, donc dans les classes des objets
Sur un gros projet que je viens de finir, mon fichier lib.main.php pèse 138Ko, pour plus de 2500 lignes de code.
Voilà pourquoi on fait de l'objet. Parce que, à part toi, je doute que quelqu'un arrive facilement à debbuger ton script ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer