partire da PHP 5.3.3, ho provato questo con 5.6 e 7.0, dichiarando il metodo di una classe final
__construct
impedirà qualsiasi classe bambino sovrascrivendo il costruttore sia utilizzando __construct
o lo stile di PHP 4 ClassName()
(notare che il Lo stile PHP 4 è obsoleto a partire da PHP 7). Prevenire una classe figlia che dichiara un costruttore farà in modo che venga sempre chiamato il costruttore genitore. Ciò, ovviamente, non consentirà a nessuna classe figlia di implementare la propria logica di costruzione. Ci sarebbero sicuramente casi d'uso pratico per questo sebbene non lo raccomanderei come buona pratica in generale.
Alcuni esempi:
senza dichiarare __construct
finale
class ParentClassWithoutFinal {
private $value = "default";
public function __construct() {
$this->value = static::class;
}
function __toString() {
return $this->value;
}
}
class ChildClassA extends ParentClassWithoutFinal {
public function __construct() {
// Missing parent::__construct();
}
}
echo (new ChildClassA()); // ouput: default
Con finale __construct
class ParentClassWithFinal extends ParentClassWithoutFinal {
public final function __construct() {
parent::__construct();
}
}
class ChildClassB extends ParentClassWithFinal {
}
echo (new ChildClassB()); // output: ChildClassB
Cercando di dichiarare __construct
in una classe figlia
class ChildClassC extends ParentClassWithFinal {
public function __construct() {
}
}
// Fatal error: Cannot override final method ParentClassWithFinal::__construct()
Cercando di dichiarare ClassName()
costruttore in una classe figlia
class ChildClassD extends ParentClassWithFinal {
public function ChildClassD() {
}
}
// Fatal error: Cannot override final ParentClassWithFinal::__construct() with ChildClassD::ChildClassD()
// Also in PHP 7: Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; ChildClassD has a deprecated constructor
capisco perché non ti fidi di programmatori PHP, ma non capisco il motivo per cui si cura :-) –
Sto solo cercando essere esplicito con il mio codice –