que - __destruct visibilidad para PHP
protected php class (2)
Creo que debería ser público en el caso en que una subclase necesite llamar explícitamente al método __destruct de la clase principal.
Algo así arrojaría un error:
<?php
class MyParent
{
private function __destruct()
{
echo ''Parent::__destruct'';
}
}
class MyChild extends MyParent
{
function __destruct()
{
echo ''Child::__destruct'';
parent::__destruct();
}
}
$myChild = new MyChild();
?>
¿Debería la "visibilidad" para la función __destruct()
ser pública o alguna otra cosa? Intento escribir un documento de normas para mi grupo y surgió esta pregunta.
Además de la respuesta de Mark Biek:
La función __destruct () debe declararse pública. De lo contrario, la función no se ejecutará al apagar el script:
Warning: Call to protected MyChild1::__destruct() from context '''' during shutdown ignored in Unknown on line 0
Warning: Call to private MyChild2::__destruct() from context '''' during shutdown ignored in Unknown on line 0
Esto puede no ser dañino, sino sucia.
Pero lo más importante de esto: si el destructor se declara privado o protegido, el tiempo de ejecución arrojará un error fatal en el momento en que el recolector de basura intente liberar objetos:
<?php
class MyParent
{
private function __destruct()
{
echo ''Parent::__destruct'';
}
}
class MyChild extends MyParent
{
private function __destruct()
{
echo ''Child::__destruct'';
parent::__destruct();
}
}
$myChild = new MyChild();
$myChild = null;
$myChild = new MyChild();
?>
salidas
Fatal error: Call to private MyChild::__destruct() from context '''' in D:/www/scratchbook/destruct.php on line 20
(¡Gracias a Mark Biek por el excelente ejemplo!)