Comment diviser une classe PHP pour séparer les fichiers?
Je veux faire quelque chose comme catégories de classes en Objective-C, de définir une classe dans un fichier, mettre en œuvre certaines méthodes de base là-bas, puis de mettre en œuvre certaines des méthodes d'assistance dans un autre sans sous-classement ou des interfaces, juste "continuer" la classe.
Possible en PHP?
- N'est-ce pas un require_once() assez?
- Je veux utiliser des trucs privés de la classe en deux endroits (comme certains privée partagée et certaines variables d'instance).
- J'ai pensé à quelque chose de similaire, d'être en mesure de "s'étendre" une méthode à l'intérieur d'une classe, pour le client, le code spécifique, pour les installations de client. Diviser en fichiers séparés est assez facile, surtout avec de l'autochargeur.
- Pourriez-vous faire un exemple et expliquer pourquoi l'extension de la classe n'est pas indiqué?
- Sémantique des trucs. Une classe de gestion de la base de données n'est pas vraiment comme les enfants d'une classe avec des méthodes d'assistance seulement. De toute façon, je vais composer les outils via un simple exemple alors.
- Ok je vois maintenant ce que tu veux dire. Eh bien, d'une certaine façon, on pourrait même envisager l'ENSEMBLE de vos classes comme les enfants d'une classe générique qui contient les méthodes d'assistance. Comme vous l'avez dit, la sémantique des trucs.
- PHP n'est pas objective-C, ne vous attendez pas à de la même façon. La seule chose qui pourrait venir de loin, en PHP est de traits et comme ils sont relativement nouveaux, je ne dépendent pas de PHP hôtes avoir une version de PHP qui prend en charge disponibles.
- J'ai essayé traits juste avant, mais je ne peut pas se référer à la même base de cette de cette façon. C'est la même chose, alors que si j'avais utilisé une DBHelpers::dissectFields(); statique des choses, ou alors.
- De telles choses sont assez moche de toute façon, peu importe comment vous les appelez (mixin, les traits, quelle que soit l'obj-c appelle la chose que vous décrivez. Probablement mieux d'avoir des classes d'assistance qui peuvent être passés dans la classe principale qui fournissent plugin fonctionnalité.
- Par ailleurs, j'ai emprunté un peu d'Objectif-C-que des choses que, pour certains complexes classes I extrait de l'interface publique dans un fichier séparé (la même chose que pour les fichiers d'en-tête), il est donc moins sujette aux erreurs.
- Ce sujet de traits?
Vous devez vous connecter pour publier un commentaire.
a-priori PHP fais pas vous donner cette fonctionnalité par la langue de la construction, de l'ensemble de la classe doit être en un seul fichier.
Maintenant il y a des trucs qui pourrait faire des trucs, mais ils sont assez lourds CPU exigeants:
Vous pouvez par exemple dissocier vos classes entre les différents fichiers, puis de charger les fichiers et de construire une chaîne unique avec l'ensemble du code, puis faire un eval(string) pour interpréter les classes et de les intégrer dans la zone de code exécutable.
pas vraiment une bonne idée btw pour de nombreuses raisons
Depuis PHP 5.4, vous pouvez accomplir cela avec Traits. Pour citer la documentation officielle:
À l'aide d'un trait vous permet de stocker des méthodes d'aide que d'aborder les sujets transversaux dans un endroit central et l'utilisation de ces méthodes dans ce que les classes dont vous avez besoin.
Si votre seul but est de rendre la définition de la classe de réduire la taille du fichier, vous pouvez inclure des fichiers à l'intérieur d'une définition de fonction
Au sein de l'inclure, à votre portée locale s'applique ($foo,$bar et $quz sera défini)
Je ne suis pas sûr de ce que la surcharge est - inclure semble se produire au moment de l'exécution, pas le temps de compilation (depuis un include peut effectivement renvoyer une valeur ..)
$2c,
*-brochet
Je pense que vous mieux diviser votre classe en n parties le long de critères fonctionnels, et ensuite utiliser l'injection de dépendance modèle à "injecter" de la classe A à la classe B dans le constructeur de B, sans besoin de sous-classement/interfaces.
Vous pouvez utiliser cette méthode pour ajouter des fonctions à certains objets de l'extérieur, ce qui est différent de l'ajout de méthodes de la classe elle-même.
https://stackoverflow.com/a/2938020/2277620
$a = new test0(); $a->neu = function(){ print( "neue funktion: " . $this->name . "\n"); }; $a->name = "testclass"; $a->neu();
Un autre pas-si-bon sens est-il crée de multiples sous-classes de sorte que chaque niveau de sous-classes d'ajouter seulement un groupe de fonctions.
J'ai utilisé cette astuce dans un seul cas où une classe a été plus que 10k lignes.
Maintenant j'ai 6 niveaux de l'héritage où chaque niveau d'ajouter une seule catégorie de fonctions de la "précédente" au niveau de la classe.
Pas si cpu-consommer, laid à voir, pas si difficile à maintenir