Originariamente inviato da Raulken
il problema è che se programmo un sito in procedurale, dopo dovrò comunque trasformarlo in oggetti e rifare tutto daccapo
ah sì? e perché poi??
Non è che OOP sia intrensicamente migliore della programmazione procedurale....
La OOP è estremamente utile (diciamo pure indispensabile) per grandi progetti, ma per progetti medio piccoli dove ci lavora un unico programmatore e la complessità e contenuta, la programmazione procedurale può essere comunque un'ottima soluzione.
Poi va considerato che anche se fai un sito in OOP sbagliando il design delle classi ti trovi a un certo punto che devi rifare tutto da capo...
Tornando in argomento
Sui costruttori una cosa alla quale devi fare attenzione è questa.
In PHP, al contrario di altri linguaggi di programmazione OOP (C++, Java, ecc), il costruttore esplicito (cioè che hai ridefinito tu) di una della classe figlio non chiama automaticamente il costruttore della classe padre, ma devi farlo tu usando parent::__construct()
in pratica diciamo che hai una classe Tavolo dove il costruttore ogni volta
che viene istanziato un oggetto della classe setta la proprietà $gambe = 4
Codice PHP:
class Tavolo {
public $gambe;
function __construct() {
$this->gambe = 4;
}
}
ora se tu estendi la classe così
Codice PHP:
class TavoloPiccolo extends Tavolo {
public $area_cmq;
}
$t = new TavoloPiccolo();
echo '
gambe='.$t->gambe; //4
TavoloPiccolo - ereditando da Tavolo - avrà anche lui la proprietà $gambe
e $gambe varrà 4 perché non avendo ridefinito il costruttore diTavoloPiccol è stato chiamato implicitamente quello del padre (Tavolo) che ha impostato $gambe a 4
ma se tu estendi la classe in questo modo
Codice PHP:
class TavoloPiccolo extends Tavolo {
public $area_cmq;
function __construct() {
$this->area_cmq = 1600;
}
}
$t = new TavoloPiccolo();
echo '
gambe='.$t->gambe; //null
echo '
area='.$t->area_cmq; //1600
Cioè avendo definito esplicitamente il costruttore di TavoloPiccolo quello della classe padre Tavolo non è stato chiamato.
Per far si che venga chiamato bisogna dirlo eplicitamente con parent::__construct()
Codice PHP:
class TavoloPiccolo extends Tavolo {
public $area_cmq;
function __construct() {
$this->area_cmq = 1600;
parent::__construct() ;
}
}
$t = new TavoloPiccolo();
echo '
gambe='.$t->gambe; //4
echo '
area='.$t->area_cmq; //1600
Ora il costruttore di TavoloPiccolo ha impostato a 1600cmq l'area e poi ha chiamato il costruttpre di Tavolo che ha impostato a 4 le gambe