Azz, hai ragione...Originariamente inviato da neroux
Scusa, ma questo non è corretto per niente. Il link che hai postato si riferisce alle variabili e non alle costanti.
Le costanti sono SEMPRE global![]()
Azz, hai ragione...Originariamente inviato da neroux
Scusa, ma questo non è corretto per niente. Il link che hai postato si riferisce alle variabili e non alle costanti.
Le costanti sono SEMPRE global![]()
simo990, riguardo alle PDO di php, non riesco a capire cosa faccia il metodo init($db)..
Inoltre credo che la connessione al db e il try catch che scrivevi tu prcedentemente, vada tutto nel costruttore ???
In altri termini, vorrei praticamente usare le PDO di php per usare il database etc... prò vorrei anche garantire che venga creata una unica istanza di PDO, quindi basarmi sul singleton pattern.
Con i sogni possiamo conoscere il futuro...
init è un metodo che ho inventato io, poteva chiamarsi anche pippo, per dire.Originariamente inviato da gaten
simo990, riguardo alle PDO di php, non riesco a capire cosa faccia il metodo init($db)..
Inoltre credo che la connessione al db e il try catch che scrivevi tu prcedentemente, vada tutto nel costruttore ???
Comunque volevo sottolineare che non devi per forza implementare una classe Database; PDO ha già tutto quello che ti serve.
Tuttavia una classe Database ti potrebbe tornare utile nel caso in cui tu voglia dare possibilità agli eventuali futuri programmatori della tua applicazione di poter apportare delle modifiche al tuo codice (tipo cambiare DBMS, o implementare nuovi modi di accesso al database, o addirittura usare metodi alternativi per lo storing dei tuoi dati [penso a XML, JSON ecc...]).
Una possibile implementazione potrebbe essere questa:
Ripeto che non hai bisogno di tutto questo, ma se fai cosi' sicuramente la tua applicazione risultera' piu' robusta e scalabile di fronte ad eventuali futuri cambiamenti.Codice PHP:<?php
class Database {
// istanza privata di PDO o di quello che vuoi te
private static $instance;
// setter statico
public static function init($db) {
self::$instance = $db;
}
// getter statico
public static function getInstance() {
return self::$instance;
}
}
// poi farai:
try {
$db = new PDO( /* qui ci metti i parametri di connessione */ );
} catch (PDOException $e) {
echo "PDOException: " . $e->getMessage();
}
Database::init($db);
// e infine nelle tue classi basta che fai:
class Paperino {
private static $db;
public function __construct() {
self::$db = Database::getInstance();
}
}
Ma poi alla fine di tutto questo, hai trovato qual era il problema?
P.S.: io lascerei perdere il singleton, non ti serve (almeno in questo caso). Ti puo' essere utile invece la dependency injection (vedi esempio sopra).
Spero di esserti stato utile.
![]()
Bè io mi volevo basare su singleton pattern, poichè può capitare che in diverse pagine necessito della connessione al database ed è inutile istanziare un nuovo oggetto PDO ogni volta che mi serve la connessione... Inoltre,
Questa porzione di codice dove la metti ? Non è meglio inserirla in un metodo di Database, che ne sò un metodo chiamato "connect" .. o meglio ancora in un costruttore, poichè notavo che in Database non hai alcun costruttore.Codice PHP:try {
$db = new PDO( /* qui ci metti i parametri di connessione */ );
} catch (PDOException $e) {
echo "PDOException: " . $e->getMessage();
}
Database::init($db);
Con i sogni possiamo conoscere il futuro...
Ma infatti non hai bisogno di tante istanze di PDO, te ne basta una. Il singleton lo puoi anche implementare, ma in realta' ti basta aprire la connessione una volta sola in cima alla tua applicazione (su un file che vuoi tu, non deve stare per forza dentro a una classe).Originariamente inviato da gaten
Bè io mi volevo basare su singleton pattern, poichè può capitare che in diverse pagine necessito della connessione al database ed è inutile istanziare un nuovo oggetto PDO ogni volta che mi serve la connessione...
No, perche' perderesti il beneficio dell'inversion of control.Non è meglio inserirla in un metodo di Database, che ne sò un metodo chiamato "connect" .. ??
Pensaci un attimo: se la classe Database fosse stata fatta da un tuo collega, e il cliente ti chiede di passare a PostgreSQL... ti ritroveresti costretto a modificare la classe Database, rompendo magari tutte le classi che dipendono da essa.
Se invece la connessione la implementi al di fuori della classe, sei libero di fare quello che vuoi.
Per come ho implementato la classe il costruttore non serve (e' una classe statica che non verra' mai inizializzata; un po' come la tua, dove invece hai il costruttore privato)... o meglio ancora in un costruttore, poichè notavo che in Database non hai alcun costruttore.
Si ma ancora non capisco dove andrà a finire:
Inoltre con il SingletonPatterno, controllo in modo più "deciso" se esiste realmente o meno una istanza qui non sò come fai.Codice PHP:try {
$db = new PDO( /* qui ci metti i parametri di connessione */ );
} catch (PDOException $e) {
echo "PDOException: " . $e->getMessage();
}
Database::init($db);
Inoltre se volessi usare il singleton pattern associando le PDO di php ???
Con i sogni possiamo conoscere il futuro...
Lo metterai dove ti serve, dipende da come hai strutturato la tua applicazione.
Il singleton, ripeto, e' inutile in questo caso (IMHO).
Se poi cerchi su google "why singleton is evil" trovi i piu' disparati motivi...
Il motivo principale (sempre IMHO) e' che non hai bisogno di controllare che ci sia una sola connessione attiva. Semplicemente lìmitati ad aprirne una, e hai finito.
Un altro motivo che mi viene in mente potrebbe essere che, nel caso tu voglia implementare una unit test, ti tagli fuori tutta la parte del db (cioè vale a dire tutto), per il semplice fatto che c'è gia' un'istanza attiva in memoria
A me serve avere la connessione in più pagine, e non credo sia tanto positivo fare in diverse pagine:
Codice PHP:try {
$db = new PDO( /* qui ci metti i parametri di connessione */ );
} catch (PDOException $e) {
echo "PDOException: " . $e->getMessage();
}
Database::init($db);
Con i sogni possiamo conoscere il futuro...
Se per pagine intendi richieste HTTP, c'e' poco da fare, sei obbligato a riaprire la connessione ad ogni "cambio di pagina"...
ma in fondo non c'e' niente di male, e' cosi' che funziona![]()
si però un conto è istanziare un oggetto ad ogni richiesta http, un altro conto è rilasciare una istanza dell'oggetto se questo è già stato istanziato precedentemente.
Sono sempre più proiettato ad utilizzare il singleton pattern per la connessione al database, però mi piacerebbe utilizzarlo usando le PDO di php, cioè vorrei fare in modo che se non esiste alcuna istanza dell'oggetto PDO faccio una new altrimenti restituisco l'istanza esistente tramite getInstance(), come posso fare ?
Con i sogni possiamo conoscere il futuro...