Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di Gin7
    Registrato dal
    Feb 2011
    Messaggi
    92

    include in funzione esterna?

    Salve a tutti, sto cercando di includere dei file nella mia pagina index.php
    La situazione è la seguente:
    Index.php
    codice:
     $pageParams = array('model' => "model.php", 'controler' => "controler.php", 'template' => "template.tpl"); //Sono dati che prendo dal database.
    Questi sono i dati di una pagina presi dal database, tramite una chiave definita in $_GET.
    Ora, avrei bisogno di includere quei 3 file nella mia pagina, ma invece di usare
    codice:
    require_once($pageParams);
    vorrei includere i file tramite una funzione apposita (possibilmente in una classe apposita, in un file differente.. ma per capire il problema penso che sia meglio usare una funzione direttamente in index.php) per poter effettuare dei controlli.
    Ecco un mio primo tentativo:
    In index:
    codice:
    ....
    ...
    getControler($pageParams['controler']);
    ...
    ...
    function getControler($controler=""){
    		if(file_exists($controler)){
    			require_once($controler);
    		} else {
    			echo "Errore: Controler definito ma non trovato.
    ";
    		}
    	}
    Tuttavia se valorizzo una variabile dentro questo file e la richiamo successivamente nel template (icluso) presente nell' array di prima, questa risulta non definita.
    La funzione deve restituire un oggetto legato al require_once?
    Grazie anticipatamente

  2. #2
    Sembrerebbe un problema di variable scoping.

    Se vuoi avere disponibili le tue variabili all'interno della funzione, devi prima passarle a quest'ultima.

    Leggi qui: http://php.net/manual/en/language.variables.scope.php

    P.S. evita le variabili globali

  3. #3
    Utente di HTML.it L'avatar di Gin7
    Registrato dal
    Feb 2011
    Messaggi
    92
    Eccomi, scusatemi il ritardo ma sono stato impegnato con un esame universitario. Grazie intanto per la risposta, ma cercando un po online penso di aver trovato il mio problema (ma non di averlo risposto).
    Ciò a cui mi sono particolarmente interessato sono i pattern PHP Reposistory e Singleton.
    In particolare, vorrei poter caricare file e classi ovunque voglia io con il medesimo codice. In particolare, non so se ho capito bene l' uso di questi due pattern, posso caricare fisicamente i file tramite loro e, successivamente, con un semplice
    codice:
    $funzione_carica_classe->carica_classe('nome_classe');
    Caricare la classe dove mi serve (evitando tutti i controlli tipo file_exists del file o class_exist)...
    Spero sia stato un pochino più chiaro, grazie ancora

  4. #4
    ti basterebbe fare un Autoload per avere i necessari require delle pagine che contengono le classi, e poi la classe Repository che istanzia oggetti senza preoccuparsi di class_exists e quant'altro perchè visibili. Ah no, di class_exists ti devi preoccupare perchè tu passi una variabile testuale "nome_classe"... se ti sbagli e passi un nome di una classe che non esiste, avresti una eccezione non gestita. però almeno non ti devi preoccupare dei require sui file sorgenti

    non mi ricordo probabilmente se usi i Namespace non serve neanche l'auto load
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  5. #5
    Utente di HTML.it L'avatar di Gin7
    Registrato dal
    Feb 2011
    Messaggi
    92
    ciao, grazie per la risposta. Avevo pensato ad autoload, ma non va bene per il mio progetto.. spiego il perchè:
    ho una index.php (che include un file index.tpl) che riceve in GET il nome di una pagina, tipo:
    http://www.miosito.it/?page=aa

    La index.php cerca il nome (aa) che riceve nel database e mi restituisce il file da includere (poniamo che sia "bb.php") che contiene una classe (poniamo "bbclass");
    In index.php avrò
    codice:
    <?php if(isset($_GET[page'])){ $file_da_includere = $row['file']; } else {$file_da_includere = "";}
    In index.tpl
    codice:
    if(!empty($file_da_includere) && file_exists($file_da_includere)){
    require_once($file_da_includere);
    $bb_classe = new bbclass;
    if(!class_exists('bbclass')){echo "Errore: classe non trovata.
    "; return false;}
    }
    Quello a cui miro io, invece, richidere l' inclusione di functions.class.php in index.php ed al suo interno una classe che si occupi di verficare l' esistenza di una classe ed eventualmente includerla. In codice (che ho provato ma non funziona) così:
    functions.class.php
    codice:
    class functions {
    public function includeFile($fileName=""){
    if(empty($fileName)){return false;}
    if(file_exists($fileName)){
    require_once($fileName)
    $bb_class = new bbclass;
    if(!class_exists('bbclass')){return false;} else {return //?? return che? dovrei ritornare la classe.. per poterla usare in index.php
    }
    }
    }
    }
    index.php
    codice:
    ... //prima ovviamente ce l' inclusione di functions
    <?php if(isset($_GET[page'])){ $file_da_includere = $functions->includeFile(trim($_GET[page'])) } else {$file_da_includere = "";}
    index.tpl
    if(!empty($file_da_includere)){ echo $file_da_includere; //solo per praticità ho messo echo
    }

    Grazie ancora per l' aiuto

  6. #6
    Potresti fare cosi':

    Codice PHP:
    if ( class_exists('bbclass') ) {
      include_once 
    'bbclass';
      return 
    true;
    } else {
      return 
    false;

    Ma non e' un buon modo di gestire questo tipo di problema. Soprattutto ti direi di evitare come la peste l'approccio GET perche' ti esponi a un problema di sicurezza.

    Non ho mai provato l'approccio Autoload ma sembra buono, io andrei con quello.

  7. #7
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Ma infatti, non basterebbe usare autoload? Ti crei un file autoload.php del tipo

    Codice PHP:
    // In questo caso la classe si trova nel file con lo stesso nome (bbclass => bbclass.php)
    function __autoload($className){
       if(
    file_exists(CLASS_PATH.DIRECTORY_SEPARATOR.$className.".php")){
              require_once(
    CLASS_PATH.DIRECTORY_SEPARATOR.$className.".php");
       }

    nella index, basta includere autoload.php. Quando farai new bbclass() ci penserà autoload a includere il file necessario

  8. #8
    Utente di HTML.it L'avatar di Gin7
    Registrato dal
    Feb 2011
    Messaggi
    92
    Sinceramente, non avevo pensato all' autoload come mi avevate suggerito.. spero di riuscire a fare qualche prova stasera stessa. Grazie per quest' importantissimo consiglio.
    Riguardo GET, suppongo che tu me lo sconsigli per le sql injection... ma cosa potrei usare in alternativa??
    Grazie ancora

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.