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_name, false) == 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.