Je travaille sur un PHP IRC Bot, et je travaille actuellement sur les commandes. P>
au début de edit: strong> Fondamentalement, je veux pouvoir modifier et recharger la classe sans avoir à redémarrer le bot. P> main.php code>, le script qui démarre le bot, il inclut le fichier
class_lib.php code> et instancie l'objet de cette classe. Je veux travailler sur un
! Recharger la commande code>, où elle "n'include pas" le fichier, puis la réinclure. Serait-ce possible, ou serait-ce bien si je ne faisais que
inclure à nouveau code> quand cette commande a été envoyée? P>
6 Réponses :
j'ai peur qu'il n'y aient aucun moyen de non suivre un fichier. S'il s'agit d'une fonction, vous pouvez générer une nouvelle fonction de manière dynamique à chaque fois. p>
vérifier: p>
http://php.net/manual/fr/funcunction.create- fonction.php p>
Vous pouvez attribuer une fonction à une variable, puis effacer cette variable et l'attribuer à nouveau. P>
Non, vous ne pouvez pas. Revisitez votre conception. Ne couple pas la définition de la classe avec l'instanciation de l'objet. P>
L'instanciation est effectuée dans Main.PHP, alors que la définition est en classe_lib.php.
Pourquoi ne pas simplement permettre à l'objet de recharger les paramètres par défaut ou de redémarrer, au lieu de ce que vous décrivez? Je suis sûr que vous ne pouvez pas faire cela de toute façon. P>
Aussi, n'essayez pas de charger l'objet avec la classe_lib.php. Incluez le fichier de classe avec l'objet, puis où vous en avez besoin, créez votre objet. De cette façon, vous pouvez l'arrêter, détruire l'objet, puis ré-instantifier un autre objet, ce qui devrait accomplir ce que vous voulez. P>
Je ne suis pas sûr de savoir comment détruire l'objet
Si vous détruisez un objet créé des connexions de base de données ou d'autres types d'activités dans lesquelles il existe des ressources ouvertes, vous devez également créer une fonction $ ObjectVar-> Destroy () dans la classe d'objet pour arrêter toutes les ressources, sauver quoi que ce soit Cela doit être sauvé, puis non défini ($ objetvar).
Pouvez-vous élaborer un peu? Votre dernier commentaire touche la base avec le problème qui le désautorting a provoqué.
Habituellement, lorsque vous avez un objet, vous avez deux méthodes standard: __Construction (), __Deduct (). Lisez-les ici: PHP.net/manual/fr/Language.oop5.decon .php principalement, ce que vous voulez faire dans le constructeur est de démarrer vos connexions, chargez-vous dans les paramètres (interne / extérieur), créez des objets à charge utilisés par la classe. Ensuite, lorsque l'objet est détruit, le destructeur est appelé, et veille à nettoyer des éléments tels que l'écriture des modifications apportées aux fichiers / bases de données, à la fermeture des connexions de base de données, des sessions de compensation, etc. LIRE À propos de OOP: php.net/manual/fr/language.oop5.php
Voici un exemple de quand un "non-Inclure" serait utile: dites que vous avez un fichier de classe et que le nom du fichier doit être modifié [dire, pour se conformer à une nouvelle norme de codage], mais il y a un code hérité que le renommé se cassera , donc le fichier avec l'ancien nom n'est pas supprimé, mais la définition de la classe est déplacée vers le nouveau fichier. Et, dans l'ancien fichier, avec "Exigence_once 'new_class_file_name.php"; ", une classe de journalisation des erreurs est incluse pour enregistrer un avertissement chaque fois que l'ancien fichier est utilisé. Il serait plus propre si ce fichier de classe d'erreur peut être inclus.
@ReReDeMF - La manière appropriée est de refactuer et de modifier les références à l'ancienne incluse (sauf si je suis en quelque sorte mal compris ce que vous suggérez, indiquant que le fichier réel i> est préféré directement). PhPstorm et autres éditeurs de code fournissent des moyens simples de le faire. Je ne vois pas non plus pourquoi "scriptomagiquement non compris" serait utile du tout. Interdiction manuellement, passez à autre chose.
réponse tardive .. p>
Vous pouvez créer un tableau contenant les fichiers, puis eval (file_get_contents ($ fichier fichier)) p>
J'ai travaillé sur mon propre client IRC nommé PITC et qui peut être la méthode que je pourrais utiliser, c'est comme ça que j'ai fait des choses avant p>
inclure $ le nom de fichier fait exactement la même chose.
La question est essentiellement sur la question de développer des plug-ins php dynamiquement chargeux dans PHP, qui ne causent pas d'interférence avec d'autres plug-ins ou le code principal.
Le seul moyen que je connaisse de vouloir redéfinir la classe_lib.php et créerait Une classe «plugin» qui servirait de classe de proxy qui serait sur chaque fonction de fonction / méthode exécutez une nouvelle instance PHP et transmettez les arguments de fonction avec un appel JSON_Decode, puis écho à la réponse avec JSON_ENCODE. P>
function proxyExternalFunction($fileName, $functionName, $args, $setupStatements = '') { $output = array(); $command = $setupStatements.";include('".addslashes($fileName)."');echo json_encode(".$functionName."("; foreach ($args as $arg) { $command .= "json_decode('".json_encode($arg)."',true),"; } if (count($args) > 0) { $command[strlen($command)-1] = ")";//end of $functionName } $command .= ");";//end of json_encode $command = "php -r ".escapeshellarg($command); exec($command, $output); $output = json_decode($output,true); }
en retard à la fête, mais je dois mentionner l'extension PHP suivante: P>
http://www.php.net/manual/fr /book. runkit.php p>
L'extension Runkit fournit des moyens de modifier les constantes, les fonctions définies par l'utilisateur et les classes définies par l'utilisateur. Il fournit également des variables superglobales personnalisées et des sous-interprètes embarquables via Sandboxing. P> blockQuote>
Cela vous permettrait de redéfinir des classes, ce qui se produit lors de l'analyse des fichiers inclus. P>
Remarque: Je n'ai pas utilisé cela, je suis venu dessus après la recherche de la recherche s'il était possible d'en quelque sorte des classes. Je ne peux pas garantir la sécurité et ne peut pas fournir des informations utiles. Pourtant. P>
Vous devriez expliquer ce que vous essayez d'accomplir, ou plus précisément pourquoi. Vous pouvez simplement rétabiliser l'objet avec déchargement et rechargement de la définition de la classe.
Pourquoi une instance "nouvelle myClass ()" ne fonctionnera pas?
jamais pensé à cela. Je vais essayer, lepe