Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: Problema con namespace

  1. #1

    Problema con namespace

    ciao!

    avrei un problema con i namespace.
    dalla mia index faccio l'include di un file:
    Codice PHP:
    include_once './lib/costanti_file.php'
    in questo file ho le varie costanti più questo:
    Codice PHP:
    <?php

    // COSTANTI

    function __autoload($class) {
        include_once 
    $class '.php';
    }
    così per fare l'autoload.
    fino a che non usavo i namespace funzionava tutto.
    adesso ho modificato la classe così:
    Codice PHP:
    <?php

    namespace MF {

        class 
    MiaClasse {

                 
    // DO STUFF

        
    }

    }
    ottenendo questi errori:
    codice:
    Warning:  include_once(MF\MiaClasse.php): failed to open stream: No such file or directory in /web/htdocs/www.sito.com/home/site/lib/costanti_file.php on line 9
    
    Warning:  include_once(): Failed opening 'MF\MiaClasse.php' for inclusion (include_path='.:/php5.5/lib/php/') in /web/htdocs/www.sito.com/home/site/lib/costanti_file.php on line 9
    
    Fatal error:  Class 'MF\MiaClasse' not found in /web/htdocs/www.sito.com/home/site/header.php on line 10
    dove sbaglio?

  2. #2
    http://www.php-fig.org/psr/psr-4/

    usa lo standard.. l'autoloading è già pronto

    io uso la SplClassLoader ma ce ne sono anche altre vedi te
    Questa volta, più che un voto.. è favoreggiamento.

  3. #3
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Non sono espertissimo con i namespaces, ma credo che il tuo problema sta nel tuoautoload:
    prima facevi
    $obj = new MiaClasse();
    adesso (almeno credo)
    $obj = new MF\MiaClasse();

    Chiaramente il tuo autoload non è più valido, visto che $class (= MF\MiaClasse ) non corrisponde più al nome del file.
    Quello che devi fare è cambiare l'autoload in modo da tener conto del namespace.
    Ad esempio, mettere MiaClasse.php dentro la cartella MF e nell'autoload cambiare il/i '\' nel DIRECTORY_SEPARATOR.
    Oppure fai un explode('\', $class) e prendi l'ultimo elemento per determinare il nome del file da includere.
    Ancora, puoi adottare un autoload ed una struttura delle directory che segue uno standard preciso PSR-0 o PSR-4

  4. #4
    Quote Originariamente inviata da Al_katraz984 Visualizza il messaggio
    http://www.php-fig.org/psr/psr-4/

    usa lo standard.. l'autoloading è già pronto

    io uso la SplClassLoader ma ce ne sono anche altre vedi te
    allora, nella index faccio questo:
    Codice PHP:
    include_once './lib/SplClassLoader.php';
    include_once 
    './lib/costanti_file.php';

    $causali = new \MF\Causali(\MF\Connessione::getInstance()); 
    poi in costanti_file.php faccio questo:
    Codice PHP:
    // COSTANTI

    $loader = new SplClassLoader('MF');
    $loader->register(); 
    ma ottengo questo errore:
    codice:
    Warning:  require(MF/Causali.php): failed to open stream: No such file or directory in .........../lib/SplClassLoader.php on line 142
    
    Fatal error:  require(): Failed opening required 'MF/Causali.php' (include_path='.:/php5.5/lib/php/') in ......../lib/SplClassLoader.php on line 142
    quello che non ho capito è se devo spostare SplClassLoader.php nella root, o spostare la classi in una directory specifica.
    o se proprio sbaglio in generale.............

  5. #5
    ok, ho messo le classi dentro una directory MF e adesso l'errore è un altro:
    codice:
    Warning:  require(MF/PDO.php): failed to open stream: No such file or directory in ....../lib/SplClassLoader.php on line 142
    
    Fatal error:  require(): Failed opening required 'MF/PDO.php' (include_path='.:/php5.5/lib/php/') in ....../lib/SplClassLoader.php on line 142
    la classe Connessione usa Singleton:
    Codice PHP:
    namespace MF {

        class 
    Connessione {

            private 
    $pdo;
            private static 
    $instance;

            private function 
    __construct() {
                try {
                    
    $this->pdo = new PDO('mysql:host=;dbname='"""", array(
                        
    PDO::ATTR_PERSISTENT => TRUE,
                        
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                        
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
                    
    ));
                } catch (
    PDOException $e) {
                    return 
    '<p class="error">' $e->getMessage() . '</p>';
                    die();
                }
            }

            public static function 
    getInstance() {
                if (!isset(
    self::$instance)) {
                    
    $c __CLASS__;
                    
    self::$instance = new $c;
                }
                return 
    self::$instance;
            }

            public function 
    __clone() {
                
    trigger_error('Clone is not allowed'E_USER_ERROR);
            }

    ............................................
       }


  6. #6
    Allora

    il foglio del codice:

    file: Prova.php all'interno della cartella "base/dir1/dir2"
    nome classe: "base\dir1\dir2\Prova"
    Codice PHP:
    <?php
    namespace base\dir1\dir2;

    class 
    Prova {
    }
    oppure

    file: Session.php all'interno della cartella "app/common"
    nome classe: "app\common\Session"
    Codice PHP:
    <?php
    namespace app\common;

    class 
    Session {
    }
    una volta che hai tutte le tue bella classi ordinate passi alla index e:

    Codice PHP:
    <?php
    namespace Test;

    // uso la classe all'interno del namespace Test
    use app\loading\SplClassLoader;

    // carico la classe
    require_once( __DIR__ '/app/loading/SplClassLoader.php' );

    // registro il namespace e la directory che mi servono
    $appLoader = new SplClassLoader'app'__DIR__ );
    $appLoader->register();

    // se voglio utilizzare le sessione all'interno di questo namespace (Test)
    // devo semplicemente:
    use app\common\Session;

    try {

     
    $s = new Session();

    } catch ( 
    Exception $e ) {
    }
    Questa volta, più che un voto.. è favoreggiamento.

  7. #7
    se vuoi usare una classe all'interno di un'altra classe:
    Codice PHP:
     <?php
    namespace app\common;

    use 
    Exception;
    use 
    app\database\myPDO;

    class 
    Session {

     
    __constructmyPDO $pdo ) {
      throw new 
    Exception'Error' );
     }
    }
    Questa volta, più che un voto.. è favoreggiamento.

  8. #8
    Quote Originariamente inviata da Al_katraz984 Visualizza il messaggio
    se vuoi usare una classe all'interno di un'altra classe:
    Codice PHP:
     <?php
    namespace app\common;

    use 
    Exception;
    use 
    app\database\myPDO;

    class 
    Session {

     
    __constructmyPDO $pdo ) {
      throw new 
    Exception'Error' );
     }
    }
    ok grazie!!

    un'ultima cosa.
    mi dici di usare gli standard.
    però la classe SplClassLoader in verità non è ancora standard, o sbaglio??

  9. #9
    Quote Originariamente inviata da fermat Visualizza il messaggio
    ok grazie!!

    un'ultima cosa.
    mi dici di usare gli standard.
    però la classe SplClassLoader in verità non è ancora standard, o sbaglio??
    come no, si che lo è, è scritta seguendo le direttive dello standard PSR-4.. è l'applicazione dello standard, ce ne sono anche altre ma quella li mi sembrava la più migliore
    Questa volta, più che un voto.. è favoreggiamento.

  10. #10
    uhm ok....
    però non è inclusa nella spl da quanto ho capito.

    quindi è standard perchè la classe segue le direttive standard, però non è inclusa nell'installazione standard di php.
    giusto?

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.