Pagina 1 di 6 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 54
  1. #1

    [PIPPE MENTALI] [PHP4] includere classi tramite sintassi python like ...

    Alla fine capita troppo spesso di dover puntare a directory di directory o altro per includere i files o le classi necessarie per far andare il nostro applicativo.

    In PHP5 abbiamo la funzione __autoload che e' pensata proprio per queste situazioni , la dove la classe non e' definita viene richiamata al fine di includerla e caricarla.

    In Python ( di cui ho una diapositiva mentre lo utilizzo => )
    per richiamare un file usiamo questo tipo di sintassi:

    from NomeFile import *

    NomeFile solitamente e' , grazie alla liberta' che ci lascia python, un file qualunque, non necessariamente una classe, dove al suo interno ci saranno tutte le informazioni necessarie o richieste dall' applicativo.

    Ovviamente e' possibile fare piu' di un import su diversi files.

    In Java invece ci sono i package .jar che sono degli "archivi" contenenti una serie di informazioni utili e vengono richiamati o importati con una sintassi "simile" .

    Mi sono chiesto, perche' ogni volta devo andare a perdere tempo scrivendo i giusti requires, oppure forzando l' error_handler al fine di emulare un caca __autoload per php 4 quando potrei scegliere di importare una o piu' folders (intese come packages) e scrollarmi i vari controlli di dosso ?

    Ecco cosa ho pensato di fare, un file, ovviamente da richiamare all' inizio del vostro applicativo, in grado di effettuare questi import in modo automatico.

    Un esempio ?

    from( '/classes' ) . import( '*' );

    Questa chiamata andra' ad includere in automatico tutti i files o classi presenti nella folder ( sempre intesa come package ) classes senza che io debba preoccuparmi di altro.
    Potrei anche scegliere di includere una sola classe
    from( '/classes' ) . import( 'DatabaseClass' );
    oppure una lista di classi
    from( '/classes' ) . import( Array('DatabaseClass', 'FileUploader') );

    Quali sono i vantaggi ?
    i vantaggi sono all' interno delle funzioni del file che oltre a verificare che la classe non sia gia' stata richiamata richiede automaticamente i files necessari dopo averne verificato l' esistenza.
    Oltre a questo se tutti files dell' applicativo avessero questo metodo a inizio file non dovremmo preoccuparci di niente.



    Mi fate sapere cosa ne pensate, eventuali consigli o altro ancora ?

    Grazie
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  2. #2

    file from_import.php

    codice:
    
    <?php //4 //5
    /**
     * Functions "FROM path IMPORT data"
     * 	A list of functions to import from a folder one or more files.
     *      Emulates python sintax with something like:
     *      	from('classes') . import('*');
     * How to:
     * 	from( $files_folder ) . import( $array_string_or_all );
     *      @param		String		path where you want import* files
     *      					*import as require_once
     *      @param		Mixed		single char '*' to import all files
     *      				class or file name 'Example' without extensions
     *                                      array with a list of files without extensions
     * -------------------------------
     * EXAMPLE:
     * 		require_once('from_import.php');
     *              from('classes') . import(Array('MyDBClass', 'MyOtherClass'));
     * _______________________________
     * @author	Andrea Giammarchi
     * @date	2005/06/01 11:00
     * @site	www.devpro.it
     * _______________________________
     */
    
    function from($folder){
    	$temp_folder = $folder;
    	do
    	{
    		$last = substr($temp_folder, -1);
    		$temp_folder = substr($temp_folder, 0, -1);
    		$pos = isSet($pos) ? $pos++ : 0;
    	}
    	while(in_array($last, Array('\\\', '/')));
    	$folder = $pos === 0 ? $folder : substr($folder, 0, $pos);
    	$GLOBALS['__FROM_IMPORT_FOLDER__'] = &$folder;
    }
    
    function import($what) {
    	if(
    		isset( $GLOBALS['__FROM_IMPORT_FOLDER__'] ) &&
    		is_dir( $GLOBALS['__FROM_IMPORT_FOLDER__'] )
    	)
    		if(@$handle = &opendir( $GLOBALS['__FROM_IMPORT_FOLDER__'] ))
    		{
    			while(($file = readdir($handle)) !== false)
    				__fileImporter($file, $what);
    			closedir($handle);
    			unset( $GLOBALS['__FROM_IMPORT_FOLDER__'] );
    		}
    }
    
    function __fileImporter(&$file, &$what) {
    	if(
    		$file !== '.' &&
    		$file !== '..' &&
    		isset( $GLOBALS['__FROM_IMPORT_FOLDER__'] ) && 
    		!is_dir( $GLOBALS['__FROM_IMPORT_FOLDER__'] .'/'. $file ) &&
    		is_file( $GLOBALS['__FROM_IMPORT_FOLDER__'] .'/'. $file )
    	)
    	{
    		$requred = false;
    		if($what === '*')
    			$requred = true;
    		else
    		{
    			$temp_file = array_shift(explode('.', $file));
    			if(!class_exists($temp_file))
    			{
    				if(!is_array($what) && $temp_file === $what){
    					$requred = true;
    				}
    				elseif(is_array($what) && in_array($temp_file, $what))
    					$requred = true;
    			}
    		}
    		if($requred === true)
    			@require_once( $GLOBALS['__FROM_IMPORT_FOLDER__'] .'/'. $file );
    	}
    }
    ?>
    
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  3. #3
    l'idea è carina

    ma ... (come sempre c'è un ma) ...

    se si usa un framework non serve ad una mazza ... se si ha un sistema modulare di caricamento dei moduli, quindi si ha un'unica pagina che esegue le inclusioni ... alla fin fine non serve, anche se in generale è una bella idea perché semplifica molto il lavoro ))

    io però farei una classe con dei metodi statici

    tipo

    Package.LoadFrom('classes/').Import('*');

    Package viene restituita dal metodo LoadFrom.
    Import invece è un metodo normale, pubblico

    Farei cosi perché, tramite questo sistema, la cosa si può notevolemnte ampliare aggiungendo informazioni in formato XML come commenti e quindi dare la possibilità in automatico non solo di generare informazioni e documentazione (anche tramite la reflection) ma anche di mettere informazioni importanti sul package!

    che ne dici?

    (ovviamente ONLY php5)
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  4. #4
    Originariamente inviato da daniele_dll
    che ne dici?

    (ovviamente ONLY php5)
    dico che ho fatto questo file di funzioni proprio per venire in contro a chi ancora non usa o non ha un host in PHP5


    anche perche' in PHP5 c'e' l' autoload che ci fai un po' quello che ti pare
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  5. #5
    Originariamente inviato da andr3a
    dico che ho fatto questo file di funzioni proprio per venire in contro a chi ancora non usa o non ha un host in PHP5


    anche perche' in PHP5 c'e' l' autoload che ci fai un po' quello che ti pare
    ops ...
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  6. #6
    bellino, soprattutto se si hanno grandi package da importare

  7. #7
    ho letto un po il codice ... e dico una cosa cattiva ... mmm non supporta la ricorsione delle cartelle
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  8. #8
    Ciao,
    mi piace l'idea e la sintassi python-like, però internamente anzichè tutto quello screaning delle directory userei ini_set()
    (o set_include_path, sempre per modificare l'include path nello script corrente)

    L'autoload di PHP5 è comodo ma non è una rivoluzione e non fa moltissimo più di quanto già si poteva fare modificando l'include_path
    per favore NIENTE PVT TECNICI da sconosciuti

  9. #9
    Originariamente inviato da daniele_dll
    ho letto un po il codice ... e dico una cosa cattiva ... mmm non supporta la ricorsione delle cartelle
    come python non supporta la ricorsione negli import, come java non supporta la ricorsione nei jar ... come quelo che ti pare non supporta la ricorsione in quello che ti pare ...

    esempio python:

    from wx import *
    from wx.lib import *

    proprio perche' l' * e' il livello di quel package, non ogni sottopackages, e quanto ti pesa con un solo import l' applicativo ???




    in php ... con questo metodo:

    from('classes') . import('*');
    from('classes/database') . import('DatabaseManager');
    from('classes/files') . import('uploader');
    from('classes/users') . import('*');


    oltre che alla prima risposta non avevi letto che era php4 adesso mi dici che non supporta la ricorsione quando un is_dir forse avrebbe dovutop farti capire che non la supporta appositamente ?
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  10. #10
    Originariamente inviato da Fabio Heller
    Ciao,
    mi piace l'idea e la sintassi python-like, però internamente anzichè tutto quello screaning delle directory userei ini_set()
    (o set_include_path, sempre per modificare l'include path nello script corrente)
    dici che invece di fare sempre e comunque un while conviene fare un file_exists per ogni richiesta e usare il while solo con un eventuale * ?
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

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.