Comment séparer une classe PHP en fichiers séparés?

je veux faire quelque chose comme les catégories de classe dans L'Objectif-C, pour définir une classe dans un fichier, y implémenter quelques méthodes de base, puis implémenter quelques méthodes d'aide dans un autre sans sousclassement ou interfaces, juste "continuer" la classe.

Possible en PHP?

22
demandé sur Josh Caswell 2013-05-17 00:58:08

6 réponses

a-priori PHP ne vous donne pas cette fonctionnalité par construction de langage, toute la classe être en un seul fichier.

Maintenant il y a des trucs qui pourrait faire des trucs, mais ils sont assez lourds CPU exigeant:

vous pouvez par exemple dissocier vos classes entre différents fichiers, puis Charger les fichiers et construire une chaîne simple avec le code entier, puis faire une évaluation (chaîne) pour interpréter les classes et les construire dans le code exécutable zone.

pas vraiment une bonne idée btw pour de nombreuses raisons

15
répondu Ph.T 2013-05-16 21:08:31

à partir de PHP 5.4, vous pouvez accomplir ceci avec Traits. Pour citer la documentation officielle:

Traits [permettent] un développeur de réutiliser des ensembles de méthodes librement dans plusieurs classes indépendantes vivant dans des hiérarchies de classes différentes. [...] Un Trait est similaire à une classe, mais destiné uniquement à grouper les fonctionnalités d'une manière fine et cohérente. Il n'est pas possible d'instancier un Trait seul. C'est un ajout à l'héritage traditionnel et permet la composition horizontale du comportement, c'est-à-dire l'application des membres de la classe sans héritage.

L'utilisation d'un trait vous permet de stocker des méthodes d'aide qui répondent aux préoccupations transversales dans un endroit central et d'utiliser ces méthodes dans toutes les classes dont vous avez besoin.

// File "HelperMethodTrait.php"
trait HelperMethodTrait
{
    public function myIncredibleUsefulHelperFunction()
    {
        return 42;
    }
}

// File "MyClass.php"
class MyClass
{
    use HelperMethodTrait;

    public function myDomainSpecificFunction()
    {
        return "foobar";
    }
}

$instance = new MyClass();
$instance->myIncredibleUsefulHelperFunction(); // 42
29
répondu helmbert 2013-05-16 21:34:23

si votre seul but est de rendre le fichier de définition de classe plus petit, vous pouvez inclure des fichiers dans une définition de fonction

class MyClass {
    public function doStuff($foo,$bar) {
        global $quz;
        include('MyClass.doStuff.php');
    }
}

dans l'include, votre portée locale s'applique ($foo, $bar et $ quz seront définis)

Je ne suis pas sûr de ce qu'est le overhead - l'include semble se produire au moment de l'exécution, pas au moment de la compilation (puisqu'un include peut effectivement retourner une valeur ..)

$2c, *-brochet

3
répondu commonpike 2013-12-27 23:46:13

je pense que vous feriez mieux de diviser votre classe en n Parties selon des critères fonctionnels, puis d'utiliser le modèle d'injection de dépendances pour "injecter" la classe A dans la Classe B dans le constructeur pour B, sans avoir besoin de sous-ensembles/interfaces.

3
répondu Andreas 2014-05-26 17:09:35

vous pouvez utiliser cette méthode pour ajouter des fonctions à certains objets extérieurement, ce qui est différent de l'ajout de méthodes à la classe elle-même.

https://stackoverflow.com/a/2938020/2277620

1
répondu flaschenpost 2017-05-23 12:02:00

une autre manière pas si bonne est de créer plusieurs sous-classes de sorte que chaque niveau de sous-classes n'ajoute qu'un "groupe" de fonctions.

j'ai utilisé cette astuce dans un seul cas où une classe était plus de 10K rangées.

maintenant j'ai 6 niveaux d'héritage où chaque niveau ajoute une seule 'catégorie' de fonctions de la classe "niveau précédent".

Pas si cpu-consommer, laid à voir, pas si difficile à maintenir

1
répondu realtebo 2015-05-29 07:51:37