Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    funzioni e importo di classi PHPMailer tramite 'use'

    Ciao,

    vorrei includere in una funzione uno script per l’invio di email tramite la libreria PHPMailer, che fa uso di ‘use’ per includere le proprie classi che, da quel che ho capito, deve essere dichiarato come prima cosa della pagina php.

    Ho quindi messo gli 'use' all'inizio della pagina, mentre la funzione viene richiamata alla fine della stessa.

    Per fare funzionare lo script incluso nella funzione devo passargli, sotto forma di argomento, quanto importato con ‘use’?

    Grazie.

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2016
    Messaggi
    580
    L'operatore use serve a creare un alias per classi/namespace. Ma non ti include la classe, per quello devi utilizzare un classico require oppure (meglio) un autoloader.

    Infatti se guardi nella doc di PHPMailer c'è questo:

    codice:
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    
    require 'path/to/PHPMailer/src/Exception.php';
    require 'path/to/PHPMailer/src/PHPMailer.php'; 
    require 'path/to/PHPMailer/src/SMTP.php';


    Gli use fanno in modo che nel tuo codice tu possa richiamare la classe utilizzando soltanto il nome PHPMailer invece di usare il nome completo di namespace che sarebbe PHPMailer\PHPMailer\PHPMailer e che come ben capisci risulteebbe abbastanza scomodo e brutto da vedere (stessa cosa per Exception nel secondo use).

    Dopo la dichiarazione degli use vengono invece importati i file contenenti le classi che ti servono, come vedi sono 2 operazioni separate ed entrambe necessarie.

    Da qui in poi puoi istanziare PHPMailer ed utilizzare la classe come meglio credi.

    p.s. guardati come funzionano i namespace in php: https://www.html.it/pag/59601/namespace-in-php/

  3. #3
    Ciao,
    ho fatto un file di prova che comincia creando un alias di classi/namespace (‘use’) e includendo le classi (‘include’).

    Nello stesso file ho creato due funzioni: una funzione per l’invio dell’email (1) e un altra funzione che la invoca (2). Ho invocato la funzione (2) e tutto ha funzionato: l’email è arrivata.

    Ma … se sposto le funzioni in un file esterno dedicato alle funzioni e lo includo prima di invocarla, ricevo un errore di tipo “Fatal error: Uncaught Error: Class 'PHPmailer' not found in …465 Stack trace: #0 … “ mostrando tutto il percorso a ritroso partendo dalla funzione 1, poi quella 2 ed infine la pagina dove viene invocata.

    Non riesco a cogliere la differenza.
    Grazie.


    Se ho ben capito:
    è come essere in una grossa biblioteca ed avere bisogno di soli pochi libri tra le migliaia a disposizione.
    Il namespace è come un foglio di carta nel quale mi appunto il nome di quei 4 o 5 volumi che mi servono.
    Gli include/require invece sono la richiesta alla bibliotecaria di trovarmi quei libri e di mettermeli a disposizione senza che io mi debba preoccupare di eventuali conflitti tra percorsi ecc.

    Ancora se ho ben capito: “è roba da grandi progetti”?
    Ultima modifica di Luca Diver; 30-12-2018 a 12:01

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2016
    Messaggi
    580
    Non è roba da grandi progetti, io utilizzo i namespace e l'autoloading anche per piccole cose, anche perché probabilmente andrò ad utilizzare composer e quindi usare questo metodo rende tutto estremamente semplice.

    Ora senza vedere il codice non so dirti quale sia il problema, probabilmente includi le tue funzioni (dove usi la classe PHPmailer) prima di includere le classi di PHPmailer, che quindi non vengono riconosciute.

  5. #5
    Per fare questa prova ho cercato di mantenere il codice più elementare possibile.
    Questo è il file che richiamo digitando l'indirizzo nel url:

    <?php
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    include_once '../PHPMailer/src/Exception.php';
    include_once '../PHPMailer/src/PHPMailer.php';
    include_once '../PHPMailer/src/SMTP.php';

    include 'funzioni.php';
    controlli();
    ?>

    e questo è il file funzioni.php:

    <?php
    function controlli(){invio_email();}

    function invio_email() {… tutto il codice per l’invio dell’’email …}
    ?>

    Non mi pare che il problema sia nell'ordine di inclusione dei file.

  6. #6
    richiamando (non so se sia il termine giusto) il namespace anche nel file che contiene le funzioni ...funziona!

    Ho aggiunto:
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    al file funzioni.

    Grazie
    Ultima modifica di Luca Diver; 31-12-2018 a 08:07

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2016
    Messaggi
    580
    Si, gli use "funzionano" per file, se includi un nuovo file ed utilizzi la classe dello use devi metterlo anche dentro quel file.

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