[PHP] Uso dei namespace

MarcoGrazia

Utente Attivo
15 Dic 2009
852
20
28
62
Udine
www.stilisticamente.com
Ciao, ho un problema con i namespace in PHP ( lo ammetto, non ci ho mai capito nulla in PHP ) ovvero, non è che non comprenda il meccanismo che ne sta alla base, ma il loro funzionamento.
Mi spiego: ho seguito l'esempio che sta sul manuale alla pagina https://www.php.net/manual/en/language.namespaces.php e poi ho iniziato a modificare i file, tanto per giocare e capirne il funzionamento, e ho trovati degli errori per ora, per me, incomprensibili.
Ecco i semplici file:
PHP:
//    File 1

namespace file_1;

error_reporting(-1);
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);

class File1 {
    public $foo;
   
    function __construct() {
        $this->foo = 'Sono il primo!';
    }
    function __toString() {
        return $this->foo;
    }
}

PHP:
//    File 2

namespace file_2;

error_reporting(-1);
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);

class File2 {
    public $foo;
   
    function __construct() {
        $this->foo = 'Sono il secondo!';
    }
    function __toString() {
        return $this->foo;
    }
}

PHP:
//    File 3

namespace file_3;

error_reporting(-1);
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);

class File3 {
    public $foo;
   
    function __construct() {
        $this->foo = 'Sono il terzo!';
    }
    function __toString() {
        return $this->foo;
    }
}

E poi il chiamante.
PHP:
//    Chiamante

namespace chiamante;

error_reporting(-1);
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);

include_once( __DIR__ . '/file1.php');
include_once( __DIR__ . '/file2.php');
include_once( __DIR__ . '/file3.php');
use file_1 as uno;
use file_2 as due;
use file_3;

$uno = new \file_1\File1();
$due = new \due\File2();
$tre = new \file_3\File3(); 
echo $uno . ' ' . $due . ' ' .$tre;
E mi da errore sul $due.
Fatal error: Uncaught Error: Class 'due\File2' not found in C:\Apache\users\marco\BABILON\NS\chiamante.php on line 18
( ! ) Error: Class 'due\File2' not found in C:\Apache\users\marco\BABILON\NS\chiamante.php on line 18

In pratica mi pare di capire che se uso l'alias mi da errore, ma non ne comprendo il motivo, i file con le classi sono state trovate, quindi i file ci sono, anche perché se no l'errore sarebbe ben diverso.
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
$uno = new \file_1\File1();
$due = new \due\File2();
$tre = new \file_3\File3();
Bhè, tendenzialmente i namespace servono a scopi ben precisi, non trovo un nesso a quanto da te scritto...

Sarebbe utile, dividere i concetti, creare uno schema logico funzionale, indicare quale framework (libreria) si utilizza e lo scope dell'applicazione...

In definitiva i namespace si usano così, con scopi precisi insieme ai Trait e le Interface
PHP:
use Test1\Test1 as test1;
use Test2\Test2 as test2;

include_once __DIR__.'/libraries/Test1.php';
include_once __DIR__.'/libraries/Test2.php';
test1::__init__()->index();
echo "\r\n";
test2::__init__()->index();
echo "\r\n";
$a=new ReflectionClass(test1::__init__());
$as=$a->getNamespaceName();
print_r($as);

Test1.php:
PHP:
namespace Test1;
class Test1 {

   public function __construct() {

   }

   public static function __init__(){
      return (new self);
   }

   public function index(){
      echo 'Sono namespace: TEst1 della Classe Test1';
   }

}
Test2.php
PHP:
namespace Test2;


class Test2 {
   public function __construct() {

   }

   public static function __init__(){
      return (new self);
   }

   public function index(){
      echo 'Sono namespace: TEst2 della Classe Test2';
   }

}
 

MarcoGrazia

Utente Attivo
15 Dic 2009
852
20
28
62
Udine
www.stilisticamente.com
@macus_adi ho provato il tuo esempio e funziona, ho anche apportato una piccola modifica chiedendo al PHP di definire Namespace e nome di Classe, per vedere cosa cambiava, rispetto allo scriverlo esplicitamente.
PHP:
...
public function index(){
        echo 'Sono il namespace: ' . __NAMESPACE__ . ' della Classe ' . __CLASS__;
}
...
che mi riportano giustamente:
Sono il namespace: Test1 della Classe Test1\Test1
Da dove si evince chiaramente che il nome della classe riporta davanti anche il suo spazio dei nomi.
Dal manuale del PHP si comprende chiaramente come i namespace sono dei contenitori comuni per Classi; e quindi loro parti come appunto Traits che tu hai ricordato, Abstract, Funzioni e Interfaces.

Quello che ho compreso alla fine, è il perché nel mio esempio mi dava errore di classe non trovata; ovvero dopo la chiamata della clausola use, la utilizzavo male.
Scrivevo:
PHP:
use File_1 as uno;
....
$uno = new uno\File_1();
mentre in realtà dovevo utilizzare il nome della classe direttamente nella clausola use e poi basta!
Infatti fatta la modifica ha funzionato anche il mio esempio:
PHP:
use File_1\File_1 as uno;
....
$uno = new uno;
echo $uno;
....
Mi riporta correttamente:
Sono il primo! Sono il secondo! Sono il terzo!
Bene, funziona, ed è solo l'abc, ma intanto ho un punto di partenza.
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
echo 'Sono il namespace: ' . __NAMESPACE__ . ' della Classe ' . __CLASS__;

Non condivido la modifica, corretta in debug scorretta in produzione.
Per evitare problemi di compliance dovresti utilizzare Reflection.
PHP:
$a=new ReflectionClass(test1::__init__());
$as=$a->getNamespaceName();
print_r($as);
 
Discussioni simili
Autore Titolo Forum Risposte Data
Aedo1 [PHP] Problimi circa l'uso di Getimagesize PHP 1
G [PHP] composer: forzare l'uso del comando require-dev PHP 0
ken_korn [PHP] Delucidazione sull'uso di classi esterne PHP 0
A consiglio uso jquery php per mostrare parte di un form PHP 6
M php non prende l'orario del server? Eppure uso timestamp() PHP 6
A permesso uso file da un diverso server con PHP PHP 5
F Cerco Hosting con VECCHIE versioni di php Hosting 0
Cosina Captcha php PHP 1
S passare un valore da un form a un file .php con metodo post PHP 4
N php msyql PHP 6
N php problemi a visualizzare video PHP 3
A menu a tendina php PHP 1
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
F Php date_diff PHP 1
K [PHP] Aggiungere caratteri ad una stringa in base alla lunghezza della stessa PHP 2
C Wp-admin a file php WordPress 5
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
csi Inviare file jpg in locale alla stampante con php PHP 0
M Passaggio variabili array php su un tasto jq PHP 3
E Php aggiornamento tabella PHP 9
G phpmailer e php 8.1 con estensione mysqli PHP 6
M Invio dati database via email php PHP 0
K [php] Problema con inner join PHP 4
K [php]form invio dati PHP 0
P Codifica caratteri speciali mysql php PHP 0
K [PHP] Problema con variabili concatenate. PHP 1
E Stampante termica escpos-php PHP 6
JeiMax Modifica codice php personalizzato PHP 2
G Come modificare un pdf in php PHP 1
U Link a doppio file PHP PHP 0
E PHP & jQuery PHP 8
N Passare array da php a javascript PHP 5
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
U PHP creare un file excel dopo ricerca nel DB PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
F Php e fatturazione elettronica PHP 0
P lanciare script asp (o php) da jquery Javascript 1
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
P Data scraping in PHP non funziona PHP 4
C Calcoli matematici in php PHP 5
F Scrivere dei dati in word con php PHP 0
D PHP leggere cartella di Windows PHP 1
I dominio aruba versione php server linux Domini 3
G Colorare menu select attraverso ricerca php PHP 0
L PHP motore di ricerca nel sito PHP 1
S PHP e Mysqli PHP 0
Y Stampare da php su un foglio A6 attraverso una stampante esterna PHP 1
M Visulizzare immagine con php PHP 8
G [PHP] Creare script di prenotazione con controllo disponibilità. PHP 7

Discussioni simili