Diviser une classe

Petit nouveau ! | 2 Messages

08 janv. 2013, 13:58

Bonjour à tous,

Je fais face à un petit soucis et votre aide serait la bienvenue.

Je suis actuellement en train de coder une assez grosse classe qui va regrouper pas mal de methode.

Je cherche un moyen de séparer ma classe en plusieurs fichier.

Pour voir les choses très grossierement, j'aimerai pouvoir faire quelque chose de ce genre :

Code : Tout sélectionner

class A { public function abc () { return a; } include('mon_fichier.php'); }
Contenu de "mon_fichier.php" :

Code : Tout sélectionner

public function def() { return b; }

J'avais vu qu'il existait "aggregate_methods" mais c'est depracated et le soucis c'est que j'aimerai rester qu'avec un seul objet.

C'est peut etre une question vraiment très bête mais je ne vois pas comment faire...

D'avance merci beaucoup de votre attention !

ViPHP
xTG
ViPHP | 7331 Messages

08 janv. 2013, 14:49

Je ne vois pas cela en tant que problème pour ma part.
N'est pas plutôt une contrainte de votre environnement de travail (IDE) qui vous empêche de retrouver rapidement une fonction ?
Car à moins que vous parliez d'une class de plusieurs centaines de milliers de lignes...

Si le but est d'avoir une vision rapide des fonctionnalités de la class (à la manière d'un .h pour du développement C++ par exemple) il peut être envisageable d'émuler cette fonctionnalité avec une interface définie dans un autre fichier intégrant toutes les fonctions de votre class.

Petit nouveau ! | 2 Messages

08 janv. 2013, 15:05

L’intérêt est vraiment juste de pouvoir séparer les différentes catégories de méthodes dans des fichiers séparés.

Niveau code et compréhension il n'y a aucun soucis sinon.

Je voudrais juste structurer ma classe en fichier.

ViPHP
xTG
ViPHP | 7331 Messages

08 janv. 2013, 15:20

Sauf que les class c'est déjà une façon de structurer une application. :mrgreen:
J'aurai même tendance à dire que si tu as besoin de distribuer tes fonctions de class dans différents fichiers il est probable que ta class puisse être divisée en plusieurs class.

Après il y a peut être un moyen en travaillant avec une instance, des attributs public et des fonctions anonymes :
$myClass->myFunctionName = function()
{

}
Et en jouant après avec __call :
public function __call($method, $args) 
{
  if (isset($this->$method) === true) 
    $func = $this->$method;
    $func(); 

  } 
}
Mais c'est une sacré usine à gaz selon moi...

Eléphant du PHP | 120 Messages

08 janv. 2013, 16:03

Sauf que les class c'est déjà une façon de structurer une application. :mrgreen:
J'aurai même tendance à dire que si tu as besoin de distribuer tes fonctions de class dans différents fichiers il est probable que ta class puisse être divisée en plusieurs class.

Après il y a peut être un moyen en travaillant avec une instance, des attributs public et des fonctions anonymes :
$myClass->myFunctionName = function()
{

}
C'est pas super comme solution, on ne peut même pas invoquer une méthode directement de cette façon :D

ViPHP
xTG
ViPHP | 7331 Messages

08 janv. 2013, 16:32

Bah si...
De façon pas propre :
$myClass = new myClass();
include('monFichierDeFonctionEclatePourMyClass.inc.php');
$obj->myFunctionName();
Après un singleton serait plus simple et plus propre à utiliser...

Mais le mieux serait encore de ne pas utiliser une technologie qui n'a pas été développée pour cela. ;)

Est-ce que j'utilise ma voiture pour tondre ma pelouse moi hein ? :twisted:

Eléphant du PHP | 120 Messages

08 janv. 2013, 17:35

Euh, non, ça ne marche pas ^^
Fatal error: Call to undefined method Test::maFonction() in C:\Apache2\htdocs\test\index.php on line 11
<?php
class Test {
	public function __construct() {
		$this->maFonction = function () {
			echo 'test';
		};
	}
}

$Test = new Test();
$Test->maFonction();
Il faut faire ça :
$fonction = $Test->maFonction();
$fonction();
Mais effectivement, s'il s'avère nécessaire de diviser une classe en plusieurs fichiers, c'est qu'il y a une erreur de conception.

ViPHP
xTG
ViPHP | 7331 Messages

08 janv. 2013, 19:49

C'est ce que règle ma fonction __call(). Mais je peux me tromper, je n'ai pas de quoi tester. :)
Car du coup on ne manipule pas des fonctions mais des attributs de class pointant vers des fonctions. Il est donc normal de se retrouver avec une méthode non trouvée.

Eléphant du PHP | 120 Messages

08 janv. 2013, 20:23

Ah ^^
Mouais, c'est du bricolage ^^

ViPHP
xTG
ViPHP | 7331 Messages

08 janv. 2013, 20:35

Ah ^^
Mouais, c'est du bricolage ^^
On est d'accord sur ce point. ;)

ViPHP
ViPHP | 928 Messages

08 janv. 2013, 21:04

Bonjour,
il me semble que les Traits en PHP 5.4 sont parfaitement adaptés pour ce que vous souhaitez faire : http://php.net/manual/fr/language.oop5.traits.php

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

09 janv. 2013, 10:20

Avant de partir sur des solutions techniques, il faudrait peut être déjà comprendre la raison qui pousse Nocta à vouloir faire ça.
J'envisage plein de réponses, des bonnes et des très mauvaises.

Peut-être que la "bonne" manière de faire sera toute autre que la demande initiale ;)
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

Petit nouveau ! | 3 Messages

10 janv. 2013, 01:28

Oui avant de séparer en plusieurs fichiers, il faut que vous nous expliquiez pourquoi ?

Si comme vous le dites l’intérêt est de séparer plusieurs catégorie alors je pense que vous devriez créer plusieurs class avec des relations ou même de l'héritage, peu importe le nombre de méthode par Class si elles sont bien commenté vous pourrez créer une documentation pour vous y retrouver et éclipse vous aidera à coder en vous donnant les méthodes disponible et le descriptif.

Je vous conseille de visiter ce lien http://pear.php.net/manual/fr/standards.php pour voir le standard Pear, une bonne référence dans le codage PHP orienté objet.

Quand vous créez vos class il faut bien se demander si cette fonction appartient à cette class ou non, comme pour une base de données.

Exemple typique vous avez 3 class une class Chien, un class Chat, et une class Oiseau.
La méthode « aboyer » doit être dans la class Chien uniquement, par contre une méthode « manger » n’est pas unique au chien elle appartient aux 3 animaux, donc je vous conseille de créer une class parent nommé Animal qui sera le parent des 3 class et aura la méthode « manger » qui par héritage sera accessible aux 3 autres class.

Eléphant du PHP | 120 Messages

10 janv. 2013, 01:32

Je vous conseille de visiter ce lien http://pear.php.net/manual/fr/standards.php pour voir le standard Pear, une bonne référence dans le codage PHP orienté objet.
Bof, ils parlent toujours en grande partie de PHP4, pas de Namespace, pas de Trait, rien. PSR est quand même bien meilleur là-dedans.

ViPHP
xTG
ViPHP | 7331 Messages

10 janv. 2013, 09:43

Je rejoins l'avis de Perine, Pear était bien aux débuts de PHP mais depuis je trouve qu'ils sont bien à la traine...