Page 1 sur 2

Diviser une classe

Posté : 08 janv. 2013, 13:58
par Nocta
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 !

Re: Diviser une classe

Posté : 08 janv. 2013, 14:49
par xTG
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.

Re: Diviser une classe

Posté : 08 janv. 2013, 15:05
par Nocta
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.

Re: Diviser une classe

Posté : 08 janv. 2013, 15:20
par xTG
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...

Re: Diviser une classe

Posté : 08 janv. 2013, 16:03
par Perine
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

Re: Diviser une classe

Posté : 08 janv. 2013, 16:32
par xTG
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:

Re: Diviser une classe

Posté : 08 janv. 2013, 17:35
par Perine
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.

Re: Diviser une classe

Posté : 08 janv. 2013, 19:49
par xTG
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.

Re: Diviser une classe

Posté : 08 janv. 2013, 20:23
par Perine
Ah ^^
Mouais, c'est du bricolage ^^

Re: Diviser une classe

Posté : 08 janv. 2013, 20:35
par xTG
Ah ^^
Mouais, c'est du bricolage ^^
On est d'accord sur ce point. ;)

Re: Diviser une classe

Posté : 08 janv. 2013, 21:04
par Genova
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

Re: Diviser une classe

Posté : 09 janv. 2013, 10:20
par zeus
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 ;)

Re: Diviser une classe

Posté : 10 janv. 2013, 01:28
par Guiloj
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.

Re: Diviser une classe

Posté : 10 janv. 2013, 01:32
par Perine
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.

Re: Diviser une classe

Posté : 10 janv. 2013, 09:43
par xTG
Je rejoins l'avis de Perine, Pear était bien aux débuts de PHP mais depuis je trouve qu'ils sont bien à la traine...