2010-07-06 5 views
3

Déboguer le code PHP de quelqu'un d'autre, je voudrais remplacer sélectivement une de leurs classes. La classe est incluse via:Empêcher PHP require_once de jamais courir

require_once('classname.php'); 

Mais, cela apparaît à divers endroits dans l'application. Je préfère «simuler» le require_once, afin qu'il ne soit jamais exécuté du tout. C'est à dire. il suffit de définir class classname comme je le veux. Ensuite, la prochaine fois que le fichier sera require_once, il sera marqué comme déjà chargé et donc non rechargé.

Je peux créer moi-même un fichier classname.php, mais je préfère garder les tests que je fais contenus dans un seul fichier, comme je le fais pour d'autres classes, et j'aimerais contrôle plus facile sur le dépassement.

En Perl, ce que je veux faire serait:

$INC{'classname.pm'} = 1; 

Yat-il un moyen d'accéder à l'équivalent PHP de %INC Perl?

Mise à jour: Constamment surpris par ce que PHP ne vous laisse pas faire ...

Ma solution était d'utiliser runkit « s runkit_method_redefine. Je charge les classes que je tentais pour empêcher le chargement, puis redéfinir toutes les méthodes que je tentais de « faux », par exemple:

require_once('classname.php'); 
runkit_method_redefine('classname','method','$params','return "testdata";'); 
+1

Si vous voulez inclure newclass.php à la place de classname.php, pourquoi ne pas ajouter deux lignes au début de classname.php ?: 'require_once 'newclass.php'; return; ' –

+0

Étant donné que je le fais pour de nombreuses classes, je ne veux pas modifier les fichiers de classe d'origine. Et parce que je veux un meilleur contrôle, je préfère avoir une solution non basée sur des fichiers. (c'est-à-dire que je me contenterai probablement d'ajouter un/tmp dir à include_path et de créer uniquement les fichiers de classe que je veux remplacer.) – benizi

+0

Benizi ne vous inquiétez pas Je sais ce que vous voulez dire, et c'est une question importante. Je n'ai rien trouvé en PHP, c'est une langue si limitée.Je n'ai aucune idée de comment cela est devenu si populaire quand Perl existe. Je suppose que les gens sont trop paresseux pour apprendre. – ekerner

Répondre

2

Lieu:

<?php return; ?> 

au sommet de classname.php fichier .

0

Ensuite, la prochaine fois que le fichier sera requis, il sera marqué comme déjà chargé et donc non rechargé.

require_once fait pour vous ..

De plus, vous pouvez utiliser quelque chose comme hacky

if(!class_exists("my_class")) { 
    class my_class {} // define your class here 
} 
+0

Désolé, n'était probablement pas clair dans l'explication: la «prochaine fois» est la première fois. Je veux, dans mon propre code, sans créer un autre fichier, empêcher 'require_once ('somefile.php');' de toujours charger somefile.php. Votre class_exists comprend pourquoi je veux faire ça. – benizi

0

Je pense que vous voulez dire est qu'il est tout à fait possible qu'il y ait une autre « required_once » ailleurs dans le code qui provoquerait l'écrasement du vôtre.

Il y a deux choses que vous pouvez faire:

1) Traquez le premier « nécessaire », puis en commentaire.

2) Allez dans le fichier de classe et incluez votre classe et retour avant que l'autre classe soit définie.

Questions connexes