Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 36
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    26

    Leggere una parola dentro a un file senza sapere quale sia e la posizione

    Salve,

    sto cercando di fare una cosa ma sinceramente non so se è possibile.

    In pratica sto realizzando una classe che permette, a seconda dei parametri che gli passo, di includere (include, include_once, require, require_once a seconda del parametro passato) i file e se tra i parametri che gli passo c'è class la deve instanziare e qua casca l'asinello.

    La domanda è: Una volta incluso il file come faccio a cercare dentro a questo file fino a che non trovo il nome della classe ?

    Esempio.

    file: mia_classe.php

    codice:
    <?php
    
    /**
    
    Un pò di roba a mo di commento
    
     */
    
    class miaClasse
    {
    
       function ..............
    
       function ..............
    
       /** 
    
              ... altri metodi ...
         */
    
    }
    
    ?>
    In pratica voglio:
    1) Ignorare tutto ciò che c'è al interno dei commenti quale che sia la forma usata per farli e fin qua ci sono.

    2) Cercare la prima occorrenza utile, non al interno di commenti, di class + uno spazio e anche fin qua ci sono.

    3) Leggere dalla prima lettera, inclusa, dopo lo spazio, fino allo spazio sucessivo escluso e qua non ci sono.

    Qualcuno mi sa aiutare ?

    Grazie per le risposte.
    Adriano

  2. #2
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    quando parli di includere, intendi 'includere' o aprire e leggere il contenuto di un file? perchè se devi farlo dopo un' inclusione tutto si svolge in meno di 5 righe, viceversa no
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  3. #3
    Questa funzione restituisce una lista delle classi definite nel codice che le viene passato:

    Codice PHP:
    function list_classes($source) {

        
    $tokens    token_get_all($source);
        
    $class_def FALSE;
        
    $classes   = array();

        foreach ( 
    $tokens as $token ) {
            if ( 
    $token[0] == T_CLASS )
                
    $class_def TRUE;
            if ( 
    $class_def AND $token[0] == T_STRING ) {
                
    $classes[] = $token[1];
                
    $class_def FALSE;
            }
        }

        return 
    $classes;
    }

    $content file_get_contents('foo.php');
    print_r(list_classes($content)); 

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    26
    Originariamente inviato da dottwatson
    quando parli di includere, intendi 'includere' o aprire e leggere il contenuto di un file? perchè se devi farlo dopo un' inclusione tutto si svolge in meno di 5 righe, viceversa no
    Se ti riferisci al punto 3 intendo dire che se ho una definizione di questo tipo:

    class miaClass

    voglio iniziare a leggere da "m" fino alla seconda "s". Se invece ti riferisci al altro scopo di questa classe i file con include o require quando arrivo a questo punto sono già inclusi nel codice

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    26
    Originariamente inviato da k.b
    Questa funzione restituisce una lista delle classi definite nel codice che le viene passato:

    Codice PHP:
    function list_classes($source) {

        
    $tokens    token_get_all($source);
        
    $class_def FALSE;
        
    $classes   = array();

        foreach ( 
    $tokens as $token ) {
            if ( 
    $token[0] == T_CLASS )
                
    $class_def TRUE;
            if ( 
    $class_def AND $token[0] == T_STRING ) {
                
    $classes[] = $token[1];
                
    $class_def FALSE;
            }
        }

        return 
    $classes;
    }

    $content file_get_contents('foo.php');
    print_r(list_classes($content)); 
    Fantastico.

    l'output di questa funzione passandogli il nome del file di una classe è

    Codice PHP:
    Array ( [0] => miaClasse 
    praticamente quello che cercavo.

    Grazie mille. Ci smanetto un pochino poi vedo di postare la classe finita.

  6. #6
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    aspetta un minuto però....

    nel caso in cui uno faccia riferimento ad include, include_once,require e require_once, tutto il codice all' interne dei files viene preso in considerazione e valutato.

    Ciò implica che quindi se io all' interno di un file richiamato come sopra cerco una classe, questa mi venga restituita come classe DICHIARATA.

    indi per cui

    Codice PHP:
    <?php
    function autoload_class($fileName,$className){
        if(!
    in_array($fileName,get_included_files())){
            include_once(
    $fileName);
            }
        if(
    class_exists($className)){
            
    $tmp=new $className;
            return 
    $tmp;
            }
        return 
    false;
        }


    $myIstance=autoload_class('main.classes.php','pager');

    if(!
    $myIstance) die("la classe pager non esiste");
    ?>
    o almeno, io l'avevo interpretata così...
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    26
    xdottwatson

    Ciao scusa il ritardo nella risposta.

    Sto cercando di fare un qualcosa di un pelo diverso. Supponiamo che crei una classe che si utilizza in questo modo:

    autoload::autoloadClass(method.path.ext[string], type[string], bool, var[string]);

    Ovvero una classe alla quale vanno sempre passati minimo due parametri (bool e var sono opzionali) che sono:

    • method.path
      Method indica il metodo di inclusione ovvero se deve essere incluso un file con include, include_once, require, require_once oppure se il file è un immagine o altro.
      Path è il path del file di includere

      type
      Il secondo argomento può assumere due valori. FILE e CLASS che indicano rispettivamente se il file da includere è un semplice file o una classe. Nel caso venga passato CLASS la classe corrispondente viene instanziata automaticamente ( es: $class = new MyClass(); )

      bool
      Questo può assumere solamente due valori che sono TRUE e FALSE. Nel caso di false il quarto argomento non è necessario ed anzi viene ignorato mentre nel caso di TRUE il quarto argomento deve contenere i parametri da passare alla classe.
      Questo parametro è necessario solamente se il secondo argomento è CLASS

      var
      Sono i parametri da passare alla classe da instanziare. Questo parametro è necessario solamente se il terzo argomento è TRUE.


    Faccio un pò di esempi sia con parametri obbligatori che opzionali.

    Utilizzando la classe in questo modo verrà incluso un file grafico in quanto il suffisso img. farà ignorare la parte di routine corrispondente ai vari include e require.
    [img]<?php autoload::autoloadClass('img.img/admin/header.png', FILE, FALSE); ?>[/img]
    [img]<?php autoload::autoloadClass('img.img/admin/header.png'); ?>[/img]

    // Utilizzandola in questo modo verrà incluso con require un ipotetico file di configurazione
    <?php autoload::autoloadClass ('r.configuration.php', FILE, FALSE);
    <?php autoload::autoloadClass ('r.configuration.php');

    // In questo modo una classe senza passargli parametri (verrà anche instanziata)
    <?php autoload::autoloadClass ('ro.lib/class/mysql.php', CLASS, FALSE); ?>

    // Mentre in questo modo verrà inclusa una classe che non solo verrà instanziata ma le verranno anche passati i suoi parametri
    <?php autoload::autoloadClass ('ro.lib/class/mysql.php', CLASS, TRUE, 'localhost.username.password.dbname'); ?>

    Adesso funziona quasi tutto. Il problema che non riesco a risolvere è che se per caso il file che contiene una classe ha un nome diverso dalla classe stessa

    Codice PHP:
    <?php
    // nome file: pagination.php
    // nome classe: MyClass

    /**

           Ad esempio qua ho un file che si chiama pagination.php e una classe che si chiama MyClass
           Non la istanzia e mi torna un errore

     */

    class MyClass
    {
    {
    ?>
    non mi trova più la classe ma genera un errore.

    Ogni consiglio è ben accetto
    Adriano

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    26
    ... sorry doppio post ...

  9. #9
    io uso questo script semplicissimo e completamente funzionante.

    Codice PHP:
    <?php

    //restituisce un array contenente i file della cartella passata come argomento
    function list_dir($dir)
    {
        
    $handle opendir($dir);
        if (!
    $handle)
            die(
    "Impossibile aprire la directory: $dir");

        
    $d = array();

        while (
    false !== ($file readdir($handle))) {
            if (
    substr($filestrlen($file)-4,4) == ".php")        //sceglie solo i file con estensione .php
                
    $d[count($d)] = $dir "/" $file;
        }

        
    closedir($handle);
        return 
    $d;
    }

    //carica tutte le classi e le funzioni
    $phpVersion_5 = (substr(phpversion(), 01) >= 5);

    //carico tutte le funzioni
    if($client)
    {
        
    $functions=list_dir("include/f/");
        for(
    $i=0$i<count($functions); $i++)
            { require_once(
    $functions[$i]); }
    }
    else
    {
        
    $functions=list_dir("../include/f/");
        for(
    $i=0$i<count($functions); $i++)
            { require_once(
    $functions[$i]); }
    }
        
    //carico le classi e le interfacce
    if($phpVersion_5)
    {
        function 
    __autoload($class_name
        {
            
    $c_client="include/c/".$class_name.".php";
            
    $c_admin="../".$c_client;
            
    //classi lato cliente
            
    if(file_exists($c_client))
                { require_once(
    $c_client); }
            
    //classi lato amministratore
            
    else if(file_exists($c_admin))
                { require_once(
    $c_admin); }
            else
                { die(
    "Classe sconosciuta: $class_name"); }
        }
    }
    else
    {
        
    //carico le classi parenti per prime
        //require_once("path_classe");
        
        //carico le classi lato cliente
        
    $classes=list_dir("include/c");
        for(
    $i=0$i<count($classes); $i++)
            { require_once(
    $classes[$i]); }
        
        
    //carico le classi lato amministratore
        
    $classes=list_dir("../include/c");
        for(
    $i=0$i<count($classes); $i++)
            { require_once(
    $classes[$i]); }
    }
    ?>
    Naturalmente devi modificare i percorsi.

    Ti basta includere questo file in ogni pagina ed il gioco è fatto.

  10. #10
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    <?php autoload::autoloadClass ('ro.lib/class/mysql.php', CLASS, TRUE, 'localhost.username.password.dbname'); ?>
    come tratti i parametri in questo caso? accedi ai $GLOBALS ?
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.