2 votes

Est-il judicieux de fermer un fichier qui n'a pas pu être ouvert ?

Je révise un code qui a été écrit par un autre développeur. Le code tente d'ouvrir un fichier et définit $canOpen sur la base de la réussite ou de l'échec.

$fh = @fopen('files.php', 'a+');        
if (!$fh){
   fclose($fh);
   $canOpen = false;
} else {
   $canOpen = true; 
}

Ce que je trouve étrange, c'est qu'il tente également de fermer le fichier, mais uniquement lorsque l'ouverture échoue. if (!$fh) . Est-ce que cela a un sens ? La fermeture ne devrait-elle pas se trouver dans l'instruction else lorsque le fichier a été ouvert avec succès ?

1voto

DaveRandom Points 45661

Non, cela n'a aucun sens.

Si !$fh est remplie comme condition, cela signifie que le $fh contient booléen FALSE (ou éventuellement, en cas d'erreur interne bizarre de PHP, NULL ). Ce que vous faites donc en réalité, c'est

fclose(FALSE);

...ce qui est inutile et entraîne une erreur.

Et, si tout ce que vous essayez de faire, c'est de remplir le fichier $canOpen et ne pas faire quelque chose d'utile avec la poignée du fichier, une combinaison de is_file() , is_readable() et is_writable() suffisent ?

1voto

cdeszaq Points 16275

La seule raison de fermer un fichier non ouvert est la résilience. Par exemple, le fait de toujours fermer le fichier dans le finally bloc d'un try...catch .

Dans votre cas, il s'agit d'une erreur de codage.

1voto

Tim G Points 1058

Si vous mettez un var_dump( $fh ) dans le bloc true de votre if, vous constaterez qu'il ne s'agit pas d'un resource handle.

En Le manuel php indique que fclose prend une ressource. Par conséquent, fclose ne peut pas être appelé sur un fichier qui ne peut pas être ouvert.

<?php
$fh = @fopen('files.php', 'a+');

if (!$fh){
    var_dump( $fh );
    fclose($fh); // this will cause an error
    $canOpen = false;
} else {
    $canOpen = true; 
}

1voto

Spikey21 Points 343

Non, cela n'a pas de sens, si vous ne pouvez pas ouvrir le fichier, vous n'aurez pas besoin de le fermer non plus. À ce stade, le pointeur de fichier est toujours ouvert, car si le fichier n'existe pas, il en créera un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X