2008-10-23 14 views
19

¿La "visibilidad" de la función __destruct() debería ser pública o alguna otra cosa? Intento escribir un documento de normas para mi grupo y surgió esta pregunta.__destruct visibilidad para PHP

Respuesta

23

Además de la respuesta de Mark Biek:

pública

La función __destruct() debe ser declarado. De lo contrario, la función no se ejecutará en el cierre del 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, pero no está limpio.

Pero lo más importante acerca de esto: Si el destructor se declara privada o protegida, el tiempo de ejecución arrojará un error fatal en el momento en que el recolector de basura trata de objetos libres:

<?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!)

+0

Eso es un buen descargo de mi respuesta. +1 para ti :) –

8

Creo que tendría que ser público en el caso donde una subclase necesita llamar explícitamente al método __destruct de la clase padre.

Algo como esto podría producir 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(); 
?>