begin process at 2012 05 30 19:42:11
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive PHP

 > 

Archives

 > 

Class et Objet ( POO )

 > 

Intercepter un require_once


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Intercepter un require_once

jeudi 16 février 2006 à 11:31:03 | Intercepter un require_once

malalam

Administrateur CodeS-SourceS

Hello,

je bloque rarement au point de poser une question, mais là...je ne parviens pas à mes fins et j'ai épuisé mes idées ;-)

La problématique est relativement simple :
je travaille sur un bug connu de mon script de documentation.
Le principe pour documenter des classes est simple : le fichier dans lequel se trouve la classe est choisi, et je fais un require_once dessus. Jusque là, tout va bien. Mais comme mon script remonte les classes héritées, j'ai dû faire un require_once sur toutes les classes uploadées, car, sans règle de nommage, je n'ai pas de moyen de savoir dans quel fichier se trouve la classe héritée.
Ca marche très bien (tant qu'on a pas 200 fichiers uploadés, évidemment, mais ça, c'est un autre problème) quand le fichier de la classe héritée se trouve "au-dessus", ou "avant" le fichier de la classe héritante dans le répertoire.
Mais si elle est après, le require_once du fichier de la classe héritante me sort évidemment une erreur, car il ne trouve pas la aclasse héritée (normal, elle n'a pas encore été incluse).

J'ai donc fait plusieurs tests :
@require_once ne plante plus, mais bloque par contre (évidemment, pas de message d'erreur, mais ça bloque quand même au require défaillant).
J'ai alors testé ça :

<?php
 $aDocs = scandir ('classes');
 $aFlag = array_fill (0, count ($aDocs) - 1, 0);
 while (in_array (0, $aFlag)) {
  foreach ($aDocs as $clef => $obj) {
   if ($obj !== '.' && $obj !== '..') {
    try {
     require_once ('classes/'.$obj);
     $aFlag[$clef] = 1;
    } catch (Exception $e) {
     continue;
    }
   }
  }
 }
?>

Le but étanht de flagger les fichiers inclus, et, si on rencontre un problème lors d'une inclusion, on saute et on passe aau suivant. Et on reboucle tant que tous les fichiers n'ont pas été flaggés à 1.
Mais rien à faire, le require_once plante, même dans le bloc du try {}.

J'ai ensuite utilisé la bufferisation de sortie :

<?php
         $contents = '';
 $aDocs = scandir ('classes');
 $aFlag = array_fill (0, count ($aDocs) - 1, 0);
 while (in_array (0, $aFlag)) {
  foreach ($aDocs as $clef => $obj) {
   if ($obj !== '.' && $obj !== '..') {
    try {
                                        ob_start ();
     require_once ('classes/'.$obj);
     $aFlag[$clef] = 1;
                                        $contents .= ob_get_contents ();
                                        ob_end_clean ();
    } catch (Exception $e) {
     continue;
    }
   }
  }
 }
        echo $contents;
?>

Mais pareil, le require_once plante lamentablement.
Idem avec un @, je précise.

Je me suis alors lancé dans un $contents .= get_file_contents (...) à la place du require_once (), et un eval à la fin (voui je sais...mlais j'étais désespéré)
Mais là, ça tourne carrément trop longtemps au niveau du file_get_contents (je ne parle donc même pas du eval...).

Et là, je n'ai plus d'idée...
Alors si quelqu'un en avait une!! ;-)

Merci :-)

jeudi 16 février 2006 à 11:55:19 | Re : Intercepter un require_once

J_G

Réponse acceptée !
Salut malalam.


Problème interessant... Je vais essayer de te donner une piste pour te décoincer (je dis bien "essayer").


Je pense que l'idée du scandir est bonne... mais pas assez exploitée.

C'est à dire, au lieu de charger (require_once) tous les fichiers contenant des classes, je te propose de plutôt parser ces fichiers.



Par exemple :
* Tu ouvre le répertoire du projet à documenter

* Tu parcours récurssivement le projet, soit tous les fichiers de type texte =>
preg_match('@^text/@',mime_content_type($file));

* enfin tu parses chacun de ces fichiers pour trouver des définition de classes
$content = file_get_contents($file);
if( preg_match_all('@class\s+([\w\d_]+)\s+(extends\s+([\w\d_]+)\s+)?{@im',$content,$res) ) {
    /* ici, tu retrouve les classes et leur héritage dans $res */
    $file; // le fichier qui contient des définitions de classes
    $res[1]; // les noms des classes définies
    $res[3]; // les classe parentes de ces dernières
}

* Avec ces infos, tu te construis un tableau, un arbre, des objets, ... tout ce que tu veux pour ensuite pouvoir le parcourir et retrouver facilement les fichier à inclure pour tel ou tel héritage.





Voilà, je ne pense pas que cette passe de parsing soit trop longue et 'espère que ça pourra t'aider...


A+ et bonne chance
jeudi 16 février 2006 à 12:17:30 | Re : Intercepter un require_once

malalam

Administrateur CodeS-SourceS

Hello J_G,

j'avais pensé au parsing en effet, mais je pensais que ce serait trop long et fastidieux...ceci dit, vue que je me retrouve bien coincé là...et que ce que tu me montres est plus abouti que ce à quoi j'avais pensé, je vais tenter le coup.
Ca permettrait en plus de résoudre le problème des require inutiles.

Donc, je teste ça de suite :-) Merci J_G!

jeudi 16 février 2006 à 12:22:52 | Re : Intercepter un require_once

J_G

De rien... surtout que je te laisse le plus dur à faire :

La structure du tableau/arbre à parcourir et les fonction de parcours. Ces exercices algorithmiques sont mes pire casses-têtes.

A+
jeudi 16 février 2006 à 12:31:37 | Re : Intercepter un require_once

malalam

Administrateur CodeS-SourceS
Je suis dessus lol...je réflêchis à la meilleure structure pour avoir un arbre facile à remonter. Et effecivement, ce sont les pires casse-têtes :-( Mais c'est rigolo!
J'ai ajouté implements dans ton pattern au fait, comme choix entre exteneds et implements (pour les interfaces).
Et sinon, ton pattern marche à merveille :-)
jeudi 16 février 2006 à 13:25:55 | Re : Intercepter un require_once

malalam

Administrateur CodeS-SourceS
Réponse acceptée !
Bon vlà le résultat qui fonctionne à merveille :

<?php
if  (isset ($_POST['documenter']) && $_POST['documenter'] === $oloc -> getMsg ('gui', 'app_document') && !empty ($_POST['objet']) && !empty ($_POST['nom'])) {
 $aDocs = scandir ('classes');
 foreach ($aDocs as $clef => $obj) {
  if ($obj !== '.' && $obj !== '..') {
   $content = file_get_contents ('classes/'.$obj);
   if( preg_match_all('@class\s+([\w\d_]+)\s+((extends|implements)\s+([\w\d_]+)\s+)?{@im',$content,$res)) {
    $aHierarchy[$res[1][0]]['parent'] = $res[4][0];
    $aHierarchy[$res[1][0]]['file'] = $obj;
       }
  }
 }
 $className = $_POST['nom'];
 $aIncs[] = $aHierarchy[$className]['file'];
 while (!empty ($aHierarchy[$className]['parent'])) {
  $className = $aHierarchy[$className]['parent'];
  $aIncs[] = $aHierarchy[$className]['file'];
 }
 $aIncs = array_reverse ($aIncs);
 foreach ($aIncs as $files) {
  require_once ('classes/'.$files);
 }
}
?>

Meci à J_G, et à Anthomicro :-)
jeudi 16 février 2006 à 13:34:21 | Re : Intercepter un require_once

malalam

Administrateur CodeS-SourceS
Bon, l'acceptation ne marche pour le moment pas, alors j'accepterai la réponse plus tard :-)
jeudi 16 février 2006 à 13:51:28 | Re : Intercepter un require_once
jeudi 16 février 2006 à 14:07:23 | Re : Intercepter un require_once

malalam

Administrateur CodeS-SourceS
Bah j'ai pas de mérite lol, tu m'as mâché tout le travail :-)
Antho m'a aidé à comprendre pq mon pattern marchait mal (en fait, il marchait très bien, j'avais juste oublié que les offset bougeaient...).
Quant à la hiérarchie, ça a finalement été très simple, comme tu peux le voir :-)
jeudi 16 février 2006 à 14:13:02 | Re : Intercepter un require_once

J_G

Oui, c'est pour ça que je dis "bravo"... je ne le voyais pas si simple.

Par contre, j'ai l'impression que tu ne prends pas en compte le fait qu'il puisse y avoir plusieur définition de classe dans un même fichier. Par exemple parent + enfant.

C'est pour ça que je t'ai indiqué le preg_match_all

Voilou.
A+

1 2 3 4

Cette discussion est classée dans : classes, obj, require, contents, once


Répondre à ce message

Sujets en rapport avec ce message

Quelle est la différence entre require_once et include? [ par lolopanama ] Actuellement, je crée un intranet dans mon lycée mais je n'arrive pas à faire la différence entre require_once et include. MERCIlolopanama Erreur phpMyAdmin [ par yoarf ] Salut ! Après avoir configuré un serveur Web IIS6 / PHP5 suivant la procédure présente à l’adresse : http://odelmotte.developpez.com/tutoriels/iis/ii PSframe et erreur 404 personalisée [ par smoke ] Salut tout le monde ;) J'utilises les pseudo frames pour mon site, voici la structure des include:   if ($_GET['rev'] === 's enregistrer fpdf en local [ par minet5 ] Bonjour,J ai un probleme depuis 2 jours concernant l'utilisation de la librairie fpdf.Leurs tutoriels ainsi que google n'ont pas su me répondre, c'est Mes 'require_once' marche plus, j'obtiend 'failed to open stream' [ par pape0 ] J'ai acheter un nouveau PC, une tour Sony. Mais mon EasyPHP marche plus. Mes 'require_once' marche plus, j'obtiend 'failed to open stream' Ma confi Variable de SESSION et require_once [ par fifoooo ] Bonjour, J'ai un probleme avec une variable de session que j'utilise dans un require_once comme suit: require_once '../../'.$_SESSION['comp'].'/Confi surcharger une fonction du core de php (require_once...) [ par z2m ] Salut, je voudrais savoir si il y a une solution pour tracer les appels de require_once, require, include_once et include. au pire sinon, surcharger Probleme de connexion BDD avec dreamweaver require_once () remplacé par virtual [ par Pittichaat ] Bonjour, Débutante en php, j'ai un problème que je n'arrive pas à résoudre. je n'ai pas trouvé d'info à ce sujet et j'ai tout essayé de mon coté sans Fonction autoload et arborescence [ par zzzzzz ] Bonjour, J'ai vu qu'il existait une fonction autoload pour charger automatiquement toutes les classes. Mon problème est que mes classes ne se situe Regex compliquée [ par jjth1 ] Bonjour à tous! Je fais appel à vous car j'ai un problème assez compliqué qui dépasse mes capacités intellectuelles, c'est pourquoi je fais appel à vo


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,014 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales