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

    Problema con i namespace

    Ciao, ho un problema personale con i namespace.
    Ne ho lette di guide, compresa quella di questo sito, ma qualche cosa mi sfugge ancora.
    Siccome poi, per comprendere ho bisogno di esempi me ne sono fatto uno.
    Ho creato una applicazione fittizia, tanto per provare, che ho chiamato Rubrica.
    5 File!
    Il primo che si chiama rubrica.php dovrebbe essere il primo ( index file ) e da cui tutto inizia.
    Codice PHP:
    namespace Rubrica;


    use 
    dbDefineFactory as DF;
    use 
    dbConnect;
    use 
    dbRubrica;


    include_once( 
    __DIR__ '/src/inc/splAutoload.inc.php');
    try
    {
      
    $objDB = new DF();
      
    $objRubrica $objDB->createHandle('dbRubrica');    //    Apre l'handle alla rubrica.
      
    echo '<pre>HANDLE:<br>';var_dump($objRubrica->getHandle());echo '</pre>';
      unset(
    $objDB);
    }
    catch (\
    Exception $e)
    {
      echo 
    '<h3>Errore!</h3>' 
        
    'Messaggio: ' $e->getMessage() . '<br>' .
        
    'Line: ' $e->getLine() . '<br>' 
        
    'Nel file: ' $e->getFile() .
        
    "<br>\n";
      echo 
    '<pre>Autoload functions:<br>';var_dump (spl_autoload_functions());echo "</pre>\n";

    Segue il file dell'autoload: ( senza namespace )
    Codice PHP:
    //    Autoload
    spl_autoload_extensions(".php"); // Così carica solo i file con estensione PHP

    spl_autoload_register(function($class_name)
    {
      
    $file 'src' DIRECTORY_SEPARATOR 'class' .DIRECTORY_SEPARATOR $class_name '.class.php';
      include (
    $file);  //    echo 'Sto tentando di accedere a <strong>' . $file . '</strong><br>';
      
    if (class_exists($class_namefalse) == false)
      {
        throw new \
    Exception("Non riesco a caricare la classe: <strong>$class_name</strong> dal file: <em>$file</em>");
      }
    }); 
    E quindi gli altri tre file che aprono una connessione ad un database, e realizzano una sistema a Pattern Factory, un tanto per fare, è tutto fittizio per ora.
    dbDefineFactory
    Codice PHP:
    namespace Rubrica\dbDefineFactory;


    /**
    * Definisce il tipo di Fattoria per la creazione dell'handle.
    * Non possono esistere più handle dello stesso tipo.
    */
    interface iDefineFactory{
      public static function 
    createHandle($dbType);
    }
    /**
    * Definisce come ottenere l'handle.
    */
    interface iConnect{
      public function 
    getHandle();
    }
    /**
    * Implementa il metodo per verificare se l'handle esiste già.
    *
    * @var string $dbType nome della classe da implementare.
    */
    class dbDefineFactory implements iDefineFactory
    {
      public static function 
    createHandle($dbType)
      {
        if (
    class_exists($dbType))
        {
          return new 
    $dbType;
        }
        else
       {
          die(
    "Tipo di database sconosciuto");
       }
      }

    e quindi il dbConnect che implementa alcune proprietà del Pattern
    Codice PHP:
    namespace Rubrica\dbConnect;

    /*
    *
    * Implementa le proprietà dei seguenti metodi.
    *
    * @var object $handle handle all'oggetto.
    *
    * @var string $dsn stringa contenente l'inizializzazione per la connessione al database ( PDO )
    *
    * @var Array $options array contenenti indicazione su come deve essere creata la connessione al database ( PDO )
    */
    class dbConnect
    {
      protected 
    $handle null;
      protected 
    $dsn null;
      protected 
    $options = array();

    ed infine dbRubrica che di fatto apre la connessione al database e restituisce l'handle
    Codice PHP:
    namespace Rubrica\dbRubrica;
    /*
    *
    * Implementazione della classe dbRubrica.
    *
    * Apre una connessione al database rubrica e ritora l'handle al database stesso ( PDO )
    */
    class dbRubrica extends dbConnect implements iConnect
    {
      public function 
    __construct()
      {
        
    $admin 'marco';
        
    $password 'bau';
        
    $host 'localhost';
        
    $this->dsn 'mysql:dbname=marco_rubrica;host=' $host ';charset=UTF8';
        
    $this->options = array(
          
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
          
    PDO::ATTR_PERSISTENT => false,
          
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
          
    PDO::ATTR_EMULATE_PREPARES   => false
        
    );
        if (
    $this->handle === null)
        {
          
    $this->handle = new \PDO($this->dsn$admin$password$this->options);
        }
      }

      function 
    __destruct()
      {
        if (
    $this->handle !== null$this->handle null;
      }

      
    /*
      *
      * Ritorna l'handle al database ( PDO ).
      *
      * @return $handle
      */
      
    public function getHandle()
      {
        return 
    $this->handle;
      }

    Il file system reale dell'applicazione è il seguente:
    ROOT --> src --> class dove sono i file che definiscono il Pattern
    ROOT --> src --> lib dove si trova ilfile autoload.php
    In ROOT si trova Rubrica.php

    Inutile dire che se non dichiaro i namespace tutto funziona bene.
    Se li dichiaro così come li vedete, mi esce a video la seguente definizione di errore:
    Errore!

    Messaggio: Non riesco a caricare la classe: dbDefineFactory dal file: src\class\dbDefineFactory.class.php
    Line: 11
    Nel file: C:\Apache\users\marco\BABILON\OOP\src\inc\splAutol oad.inc.php
    Autoload functions:

    C:\Apache\users\marco\BABILON\OOP\apriDB.php:23:
    array (size=1)
    0 =>
    object(Closure)[1]
    public 'parameter' =>
    array (size=1)
    '$class_name' => string '<required>' (length=10)
    Ma non comprendo dove sto sbagliando.

    PS:
    tranquilli la password è ovviamente falsa.
    conoscete un servizio online per la modifica degli script da IDE a textarea? Ho passato 20 minuti a togliere le tabulazioni.
    Ultima modifica di Marcolino's; 12-12-2019 a 11:56

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2019
    residenza
    Sicilia
    Messaggi
    86
    Ciao,

    ma li rimuovi i namespace dal nome delle classi che richiami nell'autoload?

    Ad esempio se vuoi richiamare la classe dbRubrica che ha come namespace Rubrica\dbRubrica, dentro la callback dell'autoload dovrai scrivere

    Codice PHP:
    $class_name str_replace("Rubrica\\"""$class_name);
    $file "percorso".$class_name;

    if(
    is_file($file)) {
        require(
    $file);

    Così dovrebbe andare

    Due consigli:


    1. Usa require quando devi includere un file fondamentale per il funzionamento dell'applicazione, poiché se il file non esiste l'applicazione va in errore, con include invece il flusso del programma continua. Io comunque ho messo un controllo con is_file().
    2. Se hai la seguente struttura di directory rubrica/src/class, le classi contenute nella cartella class, dovrebbero avere namespace uguale a Rubrica\Src\Class. In realtà class è una parola chiave riservata, quindi andrebbe messo al plurale Rubrica\Src\Classes.

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