Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Domanda sui namespace

  1. #1
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626

    Domanda sui namespace

    Credevo di aver capito come funizionassero i namespace, ma qualcosa ancora mi sfugge.
    Ho un semplice autoloader:

    Codice PHP:
    spl_autoload_register(function ($class){
      include 
    dirname(__DIR__).DS.str_replace('\\'DS$class).'.php';
    }); 
    ed una struttura delle directory, ad esempio:
    libs
    |--View.php
    |--helpers
    |----FormHelper.php

    Ora dentro FormHelper.php
    Codice PHP:
    namespace libs\helpers;

    class 
    FormHelper{...} 
    e dentro view.php
    Codice PHP:
    use libs\helpers\FormHelper;
    namespace 
    libs;

    class 
    View.php{

       ...
       
    $helper = new FormHelper();
       ...

    Ma così la classe FormHelper non viene trovata e se nel autoloader stampo il path che va ad includere noto che il namespace di FormHelper è quello corrente:
    $class = libs\FormHelper.
    Se invece nella view faccio $helper = new helpers\FormHelper(); allora funziona.

    Mi sapete dire dov'è che sbaglio? Mica devo comunque includere il namespace nella new ? Questa cosa mi capita solo se la classe è in un sotto-namespace/directory

    Grazie
    Ultima modifica di boots; 22-07-2022 a 14:48

  2. #2
    In quale percorso si trova la chiamata alla funzione spl_autoload_register()?

  3. #3
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Si scusa... effettivamente non l'ho scritto:
    app
    |--bootstrap.php
    libs
    |--View.php
    |--helpers
    |----FormHelper.php

    l'autoloader sta messo dentro bootstrap.php. new View() lo chiamo sempre dal bootstrap.php e tutti i file che includono bootstrap.php stanno dentro app e sotto directory
    Ultima modifica di boots; 22-07-2022 a 19:07

  4. #4
    Codice PHP:
    spl_autoload_register(function ($class){  
        require_once(
    dirname(dirname(__DIR__)).DS.str_replace('\\'DS$class).'.php');
    }); 
    E' sbagliato il path perchè lo hai messo in una sottodirectory

  5. #5
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    scusa ma non credo sia quello.
    Se stampo $class nell autoloader mi scrive

    libs\FormHelper

    ignorando l'use libs\helpers\FormHelper;

    Tra l'altro con la modifica suggerita da te non funziona nulla perchè si "mangia" una directory dato che il progetto è in una cartella di htdocs (quelle che si mangia):

    home/emilio/workspace/htdocs/libs/core/View.php <-- si mangia <applicazione>
    home/emilio/workspace/htdocs/<applicazione>/libs/core/View.php

    Edit:
    Credo di aver risolto. use va messo dopo la definizione del namespace. Quindi:
    Codice PHP:

    namespace libs;
    use 
    libs\helper\FormHelper;

    class 
    View(){ ... } 
    Ultima modifica di boots; 22-07-2022 a 19:50

  6. #6
    Struttura:

    /app/boostrap.php
    /libs/View.php
    /libs/helpers/FormHelper.php
    /test.php

    Codice PHP:
    // /app/bootstrap.php
    spl_autoload_register(function ($class){    
        require_once(
    dirname(__DIR__) . DIRECTORY_SEPARATOR str_replace('\\'DIRECTORY_SEPARATOR$class) . '.php');
    }); 
    Codice PHP:
    // /libs/helpers/FormHelper.php

    namespace libs\helpers;

    class 
    FormHelper {    
        public function 
    __construct() {       
            echo(
    __METHOD__);    
        }

    Codice PHP:
    // /libs/View.php

    namespace libs;

    use 
    libs\helpers\FormHelper;

    class 
    View {        
         public function 
    __construct() {
             
    $helper = new FormHelper();    
        }

    Codice PHP:
    // /test.php use libs\View;
    require_once(__DIR__ '/app/bootstrap.php');
    $view = new View
    Testato e funzionante.

  7. #7
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Si...funziona anche a me. Io avevo messo use prima di namespace in view.php.
    Se hai tempo puoi verificare se invertendoli non funziona ?

    Grazie del tempo :-)

  8. #8

  9. #9
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    grazie.

    ps: che editor è? vs code? io ho quello ma non me lo segna come errore? qualche plug-in?

  10. #10
    Quote Originariamente inviata da filippo.toso Visualizza il messaggio
    error.jpg

    Usare un editor moderno è utile.
    Ciao Filippo, sto avendo problemi anch'io a causa di autoloader e ritengo dei path. Interesserebbe anche a me sapere che editor usi.
    Grazie infinite.

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.