Pagina 2 di 4 primaprima 1 2 3 4 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 36
  1. #11
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    26
    x sirdaniel: grazie per lo script. lo sto valutando

    x dottwatson

    Premesso che non sono in studio e non ho i sorgenti sui quali sto lavorando qua con me ho riscostruito un pò alla buona quanto fatto fino adesso.

    Codice PHP:
    <?php

    class autoloadClass
    {

        
    // In sostanza il costruttore non fa altro che smistare i file da includere
        // ai metodi stabiliti passando di volta volta i parametri necessari.
        // Se $p è settata il metodo instanceClass(); instanzia la classe passandogli
        // i parametri (questa è la parte rognosa).
        
    public static function autoLoad ($path$type$bool=NULL$var=NULL)
        
            switch (
    $type)
            {
            
                case 
    'FILE':
                    
    self::fileInclude($path);
                    break;
                
                case 
    'CLASS':
                    if (
    $bool == TRUE)
                    {
                    
                        
    $p 1;
                        
    self::classInclude($path$var$p);
                    
                    } else {
                    
                        
    self::classInclude($path);
                        
                    }
                    break;
                    
                case default:
                    break;
                    
            }
            
        
    // Questo metodo crea solamente i percorsi per le inclusioni
        
    public static function fileInclude ($path)
        {
        
            
    $path explode '.'$path ); 
            
                
    $suffix $path[0];
                
    $path = unset(sort($path)); // Non sono sicuro funzionino combinate così.
                
                // Utilizzo un altro ciclo switch per determinare dove devono andare a finire
                // i file da includere
                
    switch '$suffix'
                
    {
                
                    case 
    'img':
                    
                        
    self::imageLoad($path);
                    case 
    'i':
                        
    self::iInclude($path);
                        break;
                        
                    case 
    'io':
                        
    self::ioInclude($path);
                    
                    case 
    'r':
                        
    self::rInclude($path);
                        
                    case 
    'ro':
                        
    self::roInclude($path);
                        
                    case default:
                        break;
                        
                  }
                  
        }
            
        
    // Come il precedente
        
    public static function classInclude ($path$var$p)
        {
        
            
    $path explode '.'$path ); 
            
                
    $suffix $path[0];
                
    $path = unset(sort($path)); // Non sono sicuro funzionino combinate così.
                
                // Utilizzo un altro ciclo switch per determinare dove devono andare a finire
                // i file da includere e verifico che sia settata $p. Se lo è gli passo anche
                // i parametri per instanziare la classe. Essendo certo che sto includendo una
                // classe non mi curo di controllare che il suffisso sia img perchè non può
                // esserlo a meno di errori di scrittura.
                
    switch '$suffix'
                
    {
                
                    case 
    'i':
                        (isset(
    $p)) ? self::iInclude($path$var$p) : self::iInclude($path);
                        break;
                        
                    case 
    'io':
                        (isset(
    $p)) ? self::ioInclude($path$var,$p) : self::ioInclude($path);
                        break;
                    
                    case 
    'r':
                        (isset(
    $p)) ? self::rInclude($path$var$p) : self::rInclude($path);
                        break;
                        
                    case 
    'ro':
                        (isset(
    $p)) ? self::roInclude($path$var$p) : self::roInclude($path);
                        break;
                        
                    case default:
                        break;
                        
                  }
                  
        }
        
        
    // Adesso passo a scrivere i metodi per l'inclusione.
        // include
        
    public static function iInclude($path$var=NULL$p=NULL)
        {
        
            if (isset(
    $p)) { 
                include 
    $path;
                
    self::classInstance($path$var$p);
            } else {
                include 
    $path;
            }
            
        }
        
        
    // include_once
        
    public static function ioInclude ($path$var=NULL$p=NULL)
        {
            if (isset(
    $p)) { 
                include_once 
    $path;
                
    self::classInstance($path$var$p);
            } else {
                include_once 
    $path;
            }
        
        }    
        
    // require
        
    public static function rInclude ($path$var=NULL$p=NULL)
        {
            if (isset(
    $p)) { 
                require 
    $path;
                
    self::classInstance($path$var$p);
            } else {
                require 
    $path;
            }
        
        }    
        
    // require_once
        
    public static function roInclude ($path$var=NULL$p=NULL)
        {
            if (isset(
    $p)) { 
                require_once 
    $path;
                
    self::classInstance($path$var$p);
            } else {
                require_once 
    $path;
            }
        
        }

    public static function 
    classInstance($path$var$p)
        {

        
    // Questo metodo mi sta facendo impazzire
        // In sostanza devo:
        
        // Primo passo
        // Contare gli elementi del array contenente i parametri da passare alla classe
        
    $parms explode (' '$var);
        
    $count count($parms); 
        
    // Adesso dovrei trovare il modo di produrre, per ogni elemento del array
        // una variabile con il suo nome contenente i dati.
        // Es: se la chiave 1 è uguale a root dovrei fare un assegnazione di questo
        // tipo $root = root; 
        
        // Secondo passo
        // Estrarre il nome della classe contenuto in $path
        
    $tokens token_get_all($path);
            
    $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// In $classes dovrei avere il nome della classe

        
    if (isset($p))
        {
        
            
    // Ora dovrei fare un qualcosa di simile a:
            
    $classes = new $classes ('/** Qua dovrebbero andarci i parametri e non so come metterceli */ ');
            
        } elseif {
        
            
    $classes = new $classes ();
        
        }

    }

    ?>
    Qualche idea ?
    Adriano

  2. #12
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    26
    La parte problematica è:

    Codice PHP:
    <?php

    class TEST 
    {

           public function 
    __construct ($var1)
           {

                  echo 
    $var;

            }

    }
    ?>
    Se io voglio passare a $var1 il testo "Questo è un test" quando vado a comporre la stringa:

    Codice PHP:
    <?php

    $class 
    = new $class(' /** Qua come metto il il testo . 'Questo è un test' . */ ');

    ?>
    Anche se passo il valore di $var1 nei globali può capitare che a priori non sappia quanti parametri in ingresso accetta una classe e quindi so come fare. Dovrei scorrergli dentro un array ma non saprei come e fare per passargli il valore di una variaibile e non il suo nome.

    Ho provato qualcosa di questo tipo:

    Codice PHP:
    <?php

    $path 
    'username.password.host.dbname';
    $paths implode ' '$path );
    foreach (
    $path as $key => $value)
    {

         
    $key '$'.$value;
         
    // Se provo a stampare le coppie chiave valore 
         // mi ritorna:
         // $username = username
         // $passowrd = password
         // $host = host
         // $dbname = dbname
         // ed ovviamente non ho quello che mi serve

    }
    ?>
    Idee ? Consigli ? Suggerimenti ?
    Adriano

  3. #13
    Scusami ma mi sono completamente perso, puoi riassumere quali sono i problemi che riscontri? Nel tuo ultimo post ci sono diversi errori, ma non ho capito esattamente qual e' il punto.

  4. #14
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    26
    Originariamente inviato da k.b
    Scusami ma mi sono completamente perso, puoi riassumere quali sono i problemi che riscontri? Nel tuo ultimo post ci sono diversi errori, ma non ho capito esattamente qual e' il punto.
    Scusami te è che non essendo a casa mi sono perso pure io

    Il punto è questo
    Codice PHP:
    <?php
    public static function classInstance($path$var$p)
        {

        
    // Questo metodo mi sta facendo impazzire
        // In sostanza devo:
        
        // Primo passo
        // Contare gli elementi del array contenente i parametri da passare alla classe
        
    $parms explode (' '$var);
        
    $count count($parms);
        
    // Adesso dovrei trovare il modo di produrre, per ogni elemento del array
        // una variabile con il suo nome contenente i dati.
        // Es: se la chiave 1 è uguale a root dovrei fare un assegnazione di questo
        // tipo $root = root;
        
        // Secondo passo
        // Estrarre il nome della classe contenuto in $path
        
    $tokens token_get_all($path);
            
    $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// In $classes dovrei avere il nome della classe

        
    if (isset($p))
        {
        
            
    // Ora dovrei fare un qualcosa di simile a:
            
    $classes = new $classes ('/** Qua dovrebbero andarci i parametri e non so come metterceli */ ');
            
        } elseif {
        
            
    $classes = new $classes ();
        
        }


    ?>
    Ovvero quando passo un qualcosa di questo tipo:

    Codice PHP:
    <?php
    autoloadClass 
    ('parms''type''bool''username.password');
    ?>
    Come faccio a passare username e password (o quel che è) alla riga:

    Codice PHP:
    <?php
    $classes 
    = new $classes ('/** Qua dovrebbero andarci i parametri e non so come metterceli */ ');
    ?>

  5. #15
    Nono spiegami, a parole e passo per passo, che cosa devi ottenere. Per ora mi sembra di capire che vuoi creare una classe che istanzi oggetti di altre classi, ma non ho capito sotto quali condizioni. Fai una spiegazione passo passo come se parlassi a un deficiente (che e' il modo migliore per farsi capire da un computer o da un programmatore )

  6. #16
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    26
    Originariamente inviato da k.b
    Nono spiegami, a parole e passo per passo, che cosa devi ottenere. Per ora mi sembra di capire che vuoi creare una classe che istanzi oggetti di altre classi, ma non ho capito sotto quali condizioni. Fai una spiegazione passo passo come se parlassi a un deficiente (che e' il modo migliore per farsi capire da un computer o da un programmatore )
    Dunque sto realizzando una classe che:

    • Includa i file (include, include_once, require, require_once)

      Instanzi le classi se queste sono passatate come argomento

      Instanzi le classi passandogli i parametri se questi sono stati definiti


    Ponendo il caso di avere una classe simile a questa:
    Codice PHP:
    <?php
    class mysql
    {

          public function 
    __construct ($dbhost$dbuser$dbpass$dbname)
          {

                  
    mysql_connect ($dbhost$dbuser$dbname) or die ( 'Errore connettendosi al db');
                  
    mysql_select_db ($dbname) or die ( 'Impossibile selezionare il database' );

           }

    }
    ?>
    In pratica un istruzione come questa:

    Codice PHP:
    autoloadClass('ro.lib/class/mysql.php''class''true''localhost.root.miapass.miodatabase'); 
    Sostituisce queste due istruzioni:

    Codice PHP:
    require_once 'lib/class/mysql.php';
    $dbClass mysql('llocalhost''mioutente''miapassword''miodatabase'); 
    Il mio problema è che dopo aver manipolato la stringa 'localhost.root.miapass.miodatabase' ricavandone la 4 variabili da passare alla classe mysql() non so poi come inserirle in un assegnazione come questa:

    Codice PHP:
    $class = new $class(); 
    Dove $class è il nome della classe e tra parentesi dovrei passare appunto le variabili.

    spero di non essermi espresso con i piedi
    Adriano

  7. #17
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    ribadisco il mio concetto di prima, aggiungendo pure che sviluppare un sistema del genere potrebbe inizialmente darti l' impressione che ti semplifichi enormemente il lavoro, ma poi in fase di debug, potrebbe complicarti la vita.... te lo dico per esperienza personale!

    detto questo provo a buttare giù io una bozza di come la farei (terrò conto solo dell'aspetto classe e non del discorso immagini)

    sto lavorando da un paio di giorni ad esempio ad un aggregatore di classi sullo stile delle query del tipo

    Codice PHP:
    $myclass=aggregator::query('get class_test as myclass extended by class_a,class_b implemented by class_c,class_d',$arg1,$arg2,$arg3);

    $myclass->myMethod(); 
    quindi anche su questo argomento ci sto studiando un attimino ma non è facile...
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  8. #18
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    26
    x dottwatson

    Concordo che in fase di debug possono sorgere dei problemi o dei fastidi per il resto la tua è tutta fuori che una brutta idea se ho ben capito cosa intendi.

    Ora sono a casa e penso di aver trovato la chiusura del cerchio anche se fino a che non avrò finito di testare tutto per bene non potrò esserne certo.

    Tempo un giorno o due (domani purtroppo sono fuori sede quasi tutto il giorno) e vedrò di postare un accrocchio funzionante.

    Per ora mi aggiorno
    Adriano

  9. #19
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    prova questo

    Codice PHP:
    <pre>
    <?php 
    class autoloader{
        
        private static 
    $vars=array();
        private static 
    $query='';
        public static function 
    get($query=''){
            
    self::$vars =array();
            
    self::$query=$query;
            
    preg_match('/^(.*)[\s]{1,}(.*)[\s]{1,}from[\s]{1,}(.*)$/Usmi',$query,$blocks);
            if(!empty(
    $blocks)){
                
    self::$query=$blocks[0];
                foreach(
    func_get_args() as $k=>$arg){
                    if(
    $k 0self::$vars[]=$arg;
                    }
                
                return 
    self::load($blocks[1],$blocks[2],$blocks[3]);
                }
            else die(
    "ERROR: '$query' appears invalid!");
            
    //print_r($blocks);
            
    }
        
        private static function 
    load($method,$cls,$fileName){
            if(!
    is_file($fileName) || !is_readable($fileName)) 
                die(
    "ERROR: $fileName inaccesible called in query '".self::$query."'.");
            
            switch(
    $method){
                case 
    'include':
                case 
    'require':
                    if(!
    in_array(realpath($fileName),get_included_files())){
                        eval(
    "$method ('$fileName');");
                        } 
                break;
                    eval(
    "$method ('$fileName');");
                break;
                default:
                    die(
    'ERROR: invalid inclusion method in '.self::$query);
                break;
                }
            if(
    class_exists($cls)){
                
    $args=array();
                foreach(
    self::$vars as $v_k=>$arg){
                    
    $args[]="self::\$vars[$v_k]";
                    }

                eval(
    "\$out=new $cls(".implode(',',$args).");");
                return 
    $out;
                } 
            else{
                die(
    "ERROR: class $cls not found in query '".self::$query."'.");
                }
            }
        }



    $test_A=autoloader::get('require classname from filename.php','james','bond');
    $test_A->getTime();
    echo 
    "
    "
    ;
    $test_B=autoloader::get('require classname from filename.php','james');
    $test_B->getTime();

    ?>
    e questo il file di prova filename.php
    Codice PHP:
    <?php 
    class classname{
        public function 
    __construct($name='nome',$surname='cognome'){
            echo 
    "benvenuto $name $surname!!
    "
    ;
            }
        
        function 
    getTime(){
            echo 
    "sono le ore ".date('H:i:s')." del ".date('d/m/Y');
            }
        }
    ?>
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  10. #20
    Ma perche' vuoi fare una cosa del genere? E' un semplice progetto didattico o ha uno scopo preciso?

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 © 2025 vBulletin Solutions, Inc. All rights reserved.