Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306

    includere classi con autoload()

    ciao a tutti ragazzi
    ho incontrato la funzione autoload( ) che dovrebbe rendere più snello il codice , quando si devono richiamare diverse classi in un unico file

    ma quale è il ragionamento per scrivere
    al posto di

    Codice PHP:

    require_once "classi/Libro.php";
    require_once 
    "classi/Cliente.php";
    etc etc
    etc 
    ,quindi richiamare alcune classi che sono state salvate nel proprio pc nella cartella "classi" (ovviamente è il percorso relativo al programma index.php che deve usare le classi) ,

    questo codice?
    Codice PHP:

    function __autoload($classi
    {    
    $filename =  __DIR__ '/classi/' $classi  .  '.php'
       require_once 
    $filename;

    con questo codice si dice "prendi le classi che si trovano nella directory ""classi"" ".
    capisco anche il ".php " finale perchè appunto è l'estensione della classe che io ho creato.

    Ok, ma perchè c'è " $classi "? siam come parametro di ingresso nella funzione autoload che come parametro nella riga sotto?
    cosa sta ad indicare?


    Seconda domanda:

    se avessi una classe dal nome "Libro_autoload.php" come faccio a richiamarla nel mio file index.php?
    Ultima modifica di Alfoxx; 09-10-2016 a 10:36

  2. #2
    1)

    Mettiamo che tu abbia questo pezzo di codice:

    Codice PHP:
    <?php

    $obj 
    = new Cliente();
    php andrà a cercare la classe Cliente tra tutte le classi che in quel momento vede. Ovviamente, non la troverà perchè Cliente è una classe tua custom e devi impostare l'autoload oppure importarti il file a mano. bene fino a qui. Che succede in php quando istanzi Cliente? lui cerca una classe che si chiama, appunto, "Cliente". Quindi, nella variabile che passa all'autoload, ci sarà dentro la stringa "Cliente". Ora, perchè tu o chi per te abbia chiamato la variabile $classi, non frega niente a nessuno, benchemeno a php. Potevi pure chiamarla "$a","$fattiicavolituoi","$iamamac","$stocercandoq uestaclassequalcunomiaiutaatrovarla", etc, il risultato non cambia, dentro ci sarà il nome della classe che php sta cercando di istanziare. Tutto il resto del codice della funzione che stai utilizzando è una convenzione che l'autore di quel codice ha stabilito, ovvero il fatto di dire che la classe "Cliente" si troverà in un file, in una certa directory, dal nome "Cliente.php". Poteva pure decidere che si sarebbe chiamato $classi."AnotherBrikInTheWall.php".

    2) I nomi dei file devono seguire una logica, o meglio una convenzione, che sia semplice da tenere a mente e da implementare nell'autoload. Non fare che alcune classi le metti in file che chiamerai NomeClasse.php e altre classi in file che chiamerai NomeClasse_quellochemigirainquelmomento.php. Nel tuo caso, come faccio ad importare Libro_autoload.php, o crei un secondo autoload per cercare quel particolare tipo di file, oppure modifichi il primo autoload per andare a cercare o un file che si chiami Libro.php oppure se non lo trovasse, Libro_autoload.php. Ma sarebbe una ciofeca.


    Detta sta pappardella sugli autoload, potresti rendere il tuo progetto compatibile con Composer ed utilizzare direttamente l'autoload e le convenzioni di composer, oltre alle innumerevoli librerie che puoi sfruttare agilmente attrraverso tale sistema.
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    Grazie Santino per avermi risposto

    per la 1) ma quindi $classi, è solo per indicare che c'è una variabile php

    2) perfetto il ragionamento, ma poichè sto studiano questi argomenti per la prima volta, volevo differenziare i file con il nome........cosa faccio?
    creo per ogni prova/argomento una cartella specifica con dentro una cartella classi?

    2)in che modo modifico la forma dell'autoload per caricare un simile file Libro_autoload.php


    per imparare Compozer ci vuole un ulteriore corso????

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    Ciao Vam
    grazie per la tua risposta
    ma Composer è un altro programma in cui scrivere codice php?

    2) creo un file di testo txt, che poi salvo col nome composer.json?

    3) questo comando dove lo lancio? nel prompt di msdos/ dei comandi?



    ogni volta che devo creare una classe devo scrivere quel comando "composer dump-autoload" ? dove lo scrivo?

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    ma quindi con composer si riesce a gestire l'inserimento delle classi in maniera molto più rapida?

    lo sviluppo di php, avviene sempre con altri programmi tipo Eclipse??

    come si legano Eclipse e Composer?

  6. #6
    Punto 2)

    definisci una cartella del tuo progetto come root per l'autoload. in questo caso, __DIR__.'/classi/'. Diciamo quindi che vuoi creare le seguenti Classi:

    Cliente
    Libro
    Libro_autoload

    crei in __DIR__.'/classi/' i seguenti file:

    Cliente.php
    Libro.php
    Libro_autoload.php

    e così il tuo autoload non dovrebbe avere problemi. Nel codice le userai così le classi:

    Codice PHP:
    include "autoload.php";

    $cliente = new Cliente();
    $libro = new Libro();
    $libroAutoload = new Libro_autoload(); 
    insomma basta che nome della classe e nome del file coincidano. Se poi vuoi fare uno step aggiuntivo e dividere le classi in namespace, ed avere ad esempio le classi:

    \Alfoxx\Cliente
    \Alfoxx\Libro

    crei dentro la cartella di base la cartella Alfoxx, e dentro i file come sopra (ricordati che dovranno avere il namespace Alfoxx come prima dichiarazione). Detto questo modifichi l'autoload (così su due piedi) in qualcosa del tipo:

    Codice PHP:

    function __autoload($classi
    {    
    $filename =  __DIR__ '/classi/' str_replace("\\","/",$classi)  .  '.php'
       require_once 
    $filename;

    in maniera da fargli cercare il file __DIR__.'/classi/Alfoxx/Cliente.php' etc. Intanto che sperimenti questo, segui la risposta di Vam e provi ad usare composer seguendo il manuale di installazione online e cercando in giro esempi se non capisci bene.
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  7. #7
    Punto 2)

    definisci una cartella del tuo progetto come root per l'autoload. in questo caso, __DIR__.'/classi/'. Diciamo quindi che vuoi creare le seguenti Classi:

    Cliente
    Libro
    Libro_autoload

    crei in __DIR__.'/classi/' i seguenti file:

    Cliente.php
    Libro.php
    Libro_autoload.php

    e così il tuo autoload non dovrebbe avere problemi. Nel codice le userai così le classi:

    Codice PHP:
    include "autoload.php";

    $cliente = new Cliente();
    $libro = new Libro();
    $libroAutoload = new Libro_autoload(); 
    insomma basta che nome della classe e nome del file coincidano. Se poi vuoi fare uno step aggiuntivo e dividere le classi in namespace, ed avere ad esempio le classi:

    \Alfoxx\Cliente
    \Alfoxx\Libro

    crei dentro la cartella di base la cartella Alfoxx, e dentro i file come sopra (ricordati che dovranno avere il namespace Alfoxx come prima dichiarazione). Detto questo modifichi l'autoload (così su due piedi) in qualcosa del tipo:

    Codice PHP:

    function __autoload($classi
    {    
    $filename =  __DIR__ '/classi/' str_replace("\\","/",$classi)  .  '.php'
       require_once 
    $filename;

    in maniera da fargli cercare il file __DIR__.'/classi/Alfoxx/Cliente.php' etc. Intanto che sperimenti questo, segui la risposta di Vam e provi ad usare composer seguendo il manuale di installazione online e cercando in giro esempi se non capisci bene.
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    @Santino
    ma autoload.php dove si trova? dove lo hai salvato???

    per ora non lo so se mi sto complicando la vita, però sto piano piano ampliando la mia classe Libro, quindi quando vado ad istanziare la classe anche se la classe al momento è Libro_autoload.php o Libro_ereditarieta.php, io istanzio sempre con "new Libro".


    @Vam
    PHPStorm allora offre tante peculiarità, ma il programma è molto ampio e vasto???

    Per la forma di autoload, io la vedo al momento come una zappa sui piedi.....così bello
    andare ad inserire quello che ti serve ad inizio file
    Codice PHP:
     require_once "classi/Libro_overriding_senza_tipi.php"
    oppure
    Codice PHP:
     require_once "classi/Libro_overriding.php"

    invece sto fatto dell'autoload mi pare che complichi tutto

  9. #9
    @Alfoxx

    da come avevi scritto te, pensavo che quel file per l'autoload tu l'avessi già in esercizio e quindi stessi cercando di capirne la logica.

    Discorso "quanto è bello usare require invece dell'autoloading" beh, è un commento campato in aria, perchè con il require, ad inizio file, avrai tutta una serie di require a file php (che è una schifezza degna del miglior scripting), in oggetti (e autoloading) avrai ad inizio una bella dichiarazione del tipo "use Cliente;" (che non è obbligatoria, ma fa la sua porca figura). Soprattutto quando usi i namespace, avrai "use \Alfoxx\Cliente;" e dopo nel codice userai "$cliente = new Cliente();" invece di "$cliente = new \Alfoxx\Cliente();"

    per il discorso: dove metto l'autoload? diciamo che se hai una struttura di directory così:

    ROOT
    --- classi
    -------Cliente.php
    --- autoload.php
    --- index.php

    ovviamente autoload.php ha anche il compito di registrare l'autoload, a meno che tu non lo voglia fare in index.php dopo aver fatto l'include di autoload.php
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    Quote Originariamente inviata da Santino83_02 Visualizza il messaggio
    @Alfoxx

    da come avevi scritto te, pensavo che quel file per l'autoload tu l'avessi già in esercizio e quindi stessi cercando di capirne la logica.
    quello era l'obiettivo....capire la logica di come si scrive la funzione autoload per adattarla a quello che mi serve

    quando dici
    .....(che è una schifezza degna del miglior scripting)....
    che vuoi dire? cosa è lo scripting?

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.