2017-07-31 2 views
3
$file= @fopen("ssssss.php", r) or die("not found"); 
(@include("ssssss.php")) or die("not found"); 

Dans la première instruction, nous ne mettons pas() autour de @fopen et cela fonctionne bien. Mais dans la seconde si je n'ai pas mis ces() il ne montre aucun message.PHP: Gestion des erreurs avec include

alors pourquoi avec include je dois l'arrondir avec()?

Répondre

2

Je suis d'accord avec les suggestions des autres réponses, mais la réponse réelle à votre question est la suivante:

Dans la documentation PHP disent-ils pour prendre soin lorsque l'on compare la valeur de retour d'inclure. C'est parce que c'est une construction spéciale et les parenthèses ne sont pas nécessaires.

Alors, quand vous faites cela (sans parenthèses d'emballage):

@include("ssssss.php") or die("not found"); 

Vous êtes en train de faire, parce que or est évalué en premier:

@include (("ssssss.php") or die("not found")); 

Maintenant, "ssssss.php" est une chaîne non vide qui évalue logiquement à true.

or est un opérateur logique qui donne true si l'un des paramètres est vrai (ou les deux). En outre, cet opérateur est en court-circuit: si le premier paramètre est vrai, php sait déjà que l'opérateur or retournera vrai, donc il ne perdra pas de temps à évaluer le deuxième paramètre, et die() n'est pas exécuté.

Alors enfin, or donne vrai et votre phrase becames ceci:

@include (1); 

Php tente de « inclure 1 », et il soulèverait un avertissement, mais ne pas à cause de la @.

Ici, vous avez un similar example in php.net.


Votre première phrase n'est pas le même cas.

$file= @fopen("ssssss.php", r) or die("not found"); 

fopen est juste une fonction de régulière Php avec ses parenthèses. Ici, vous devez avoir à l'esprit deux opérateurs: = et or.

= a higher precedence que or, donc, si le résultat de fopen est correctement attribué à $file (et il est), cette opération retourne vrai. Et, comme je l'ai déjà expliqué, "true or rien d'autre", donne true mais die() n'est pas exécuté à cause de l'opérateur de court-circuit.

+0

merci beaucoup @nanocv. Je vois maintenant . mais pourquoi devient-il '@include (1)'? – Mahmoud

+0

mais le même concept peut s'appliquer au premier code aussi !! : '$ file = @fopen ((" ssssss.php ", r) ou die (" non trouvé "));' mais ce n'est pas le cas !!! – Mahmoud

+0

Vous êtes les bienvenus @Mahmoud! J'ai édité ma réponse pour expliquer vos questions dans les deux commentaires (pour le compte rendu). J'espère que cela aide! – nanocv

0

Vous devriez utiliser file_exists au lieu d'utiliser le @ car il couvre toutes sortes de problèmes. Une meilleure solution serait ...

if (file_exists("ssssss.php")) { 
    $file= @fopen("ssssss.php", r);      
} 

et

if (file_exists("ssssss.php")) { 
    include("ssssss.php");      
} 
+0

remercie Nigel. les 2 déclarations ne sont pas du tout liées. ils sont séparés. la seule chose qui est liée est la gestion des erreurs. c'était ma question. pourquoi je dois utiliser() avec inclure et l'autre pas! – Mahmoud

+1

Il y a beaucoup de choses en PHP qui peuvent être imprévisibles et "bizarres". Mais utiliser la logique «include» ou «die» n'est qu'une mauvaise pratique. À mon humble avis en utilisant «die» partout est une mauvaise pratique et vous devriez mettre plus d'efforts dans la bonne pratique que d'essayer de comprendre pourquoi cela est étrange. –

+0

vous avez absolument raison (Y) – Mahmoud

0

Ce n'est pas vraiment une bonne utilisation d'inclure. Si vous devez inclure un fichier php et générer une erreur en cas d'échec, utilisez require ou require_once.

Si vous souhaitez obtenir le contenu de l'ensemble du fichier, vous pouvez utiliser file_get_contents().

Aussi, je suis d'accord avec Nigel Ren sur l'utilisation de @ - c'est une pratique dangereuse et devrait être évitée.

+0

Merci Rich, je n'étais pas préoccupé par l'obtention du contenu du fichier. Je veux juste connaître la différence entre les deux instructions dans la gestion des erreurs. J'ai remarqué que l'utilisation d'utiliser un moyen spécial, donc je veux comprendre la raison derrière ce – Mahmoud