OVH Cloud OVH Cloud

Problème : include ou require statique ?

15 réponses
Avatar
Jean Francois Ortolo
Bonjour

J'ai un traitement répétitif ( = une boucle principale externe ) à
faire dans un script php.

Le problème, est que ce scripts php contient d'autres scripts php
inclus ( tous dans le même répertoire que le script initial ), avec
l'instruction include("script.php");

Cepndant, ces include sont contenus dans des blocs de code du script
initial, qui ne sont rencontrés à l'exécution, que dans des conditions
du type :

if($condition)
{ // bloc de code
include("script.php");
}


Comme l'exécution du script initial passera parfois avec certitude
sur ces conditions, ( parfois réalisées parfois non ), est-ce que je
peux être sûr, que ces scripts inclus, ont déjà leur code php inclus à
la compilation dans le script initial, et qu'il n'y aura pas d'effet de
bord quelconque, à faire ces includes ?

Sinon, est-ce-que des require sont ou des includes sont plus indiqués
pour que les inclusions soient "statiques", donc pour les codes inclus
donnent un script d'ensemble fixe quelles que soient les conditions
rencontrées lors de son exécution ?

Il me semble que cette question est classique, mais j'ai l'impression
que le PHP Manual est devenu depuis quelques temps, plus difficile à
comprendre.

Merci beaucoup de vos réponses.

Amicalement.

Jean François Ortolo

5 réponses

1 2
Avatar
Yannick VOYEAUD
This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--XjOoIvIMpkC3Q60JidqapPGGSbxg5mxDI
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Bonjour,

Pour moi require = requiert donc présence obligatoire du fichier. Si
absence de celui-ci le script appelant s'arrête!
Pour moi include = inclure donc présence non impérative Si pas pré sent
on peut continuer le script appelant.

Enfin c'est dans cet esprit que j'utilise ces deux commandes.

Amitiés

--
Yannick VOYEAUD
Nul n'a droit au superflu tant que chacun n'a pas son nécessaire
(Camille JOUFFRAY 1841-1924, maire de Vienne)
http://www.voyeaud.org


--XjOoIvIMpkC3Q60JidqapPGGSbxg5mxDI
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (GNU/Linux)
Comment: Using GnuPG with Icedove - http://www.enigmail.net/

iQEcBAEBAgAGBQJTidHkAAoJEGnJBaLV5Tw9m1IIAIiMM9Bt+wfypI5aqX5McH2M
aaiTVn02FY6bR9Cd85LJXML6w6k0+txeYZf7kNxMC6i5jkr6WiVH9Sitmsn/Udwh
UdIifumgupvlOYsquWjxCfuyXPThQBmlGP3zQ6n6pjQeZ06SYdOknALo0HxrRn2I
G8BAufwUOq6U4sMYDmQxctSaWTqqjYRGndbjg1qt+F3kAUlb1xSRz0IZEv0rDnUH
NXXdcXMnTFCr91y9S+RFulM3y/f+/j1dwviE0Lw9RDkn2ZQQl6X5JvPnir8M/jyV
N5mDZfCSK4xdkgSSmDeWWNm2V9k4zm5MhTZSmKkF0dKeyUFhnTe5m4oPSwY9pJk /8T
-----END PGP SIGNATURE-----

--XjOoIvIMpkC3Q60JidqapPGGSbxg5mxDI--
Avatar
Otomatic
Jean Francois Ortolo
écrivait :

Et vous constatez que dans les cas où l condition n'est pas réalisée,
le code n'apparaît pas ?

C'est précisément ce que dit la page en question.


NON
Elle dit :
Contrairement à include(), require() va toujours lire dans le fichier
cible, même si la ligne n'est jamais exécutée. Si vous souhaitez une
inclusion conditionnelle, utilisez include().

EOF
Avatar
Fred
On 31/05/2014 15:28, Otomatic wrote:
Jean Francois Ortolo
écrivait :

Et vous constatez que dans les cas où l condition n'est pas réalisée,
le code n'apparaît pas ?

C'est précisément ce que dit la page en question.


NON
Elle dit :
Contrairement à include(), require() va toujours lire dans le fichier
cible, même si la ligne n'est jamais exécutée. Si vous souhaitez une
inclusion conditionnelle, utilisez include().

EOF




Cette doc de l'univ-paris7 concerne php 3/4 et elle est périmée.

En PHP5, on peut mettre indiférement include ou require dans une
boucle et le fichier ne sera lu que si include ou require sont
réellement executés.
C'est vérifiable avec fileatime().

Fred
Avatar
Jean Francois Ortolo
Le 31/05/2014 15:28, Otomatic a écrit :
Jean Francois Ortolo
écrivait :

Et vous constatez que dans les cas où l condition n'est pas réalisée,
le code n'apparaît pas ?

C'est précisément ce que dit la page en question.


NON
Elle dit :
Contrairement à include(), require() va toujours lire dans le fichier
cible, même si la ligne n'est jamais exécutée. Si vous souhaitez une
inclusion conditionnelle, utilisez include().

EOF




Rebonjour Monsieur

Encore une fois, vous entendez par : "lire dans le fichier",
l'équivalent de "exécuter le fichier".

Or, la page dit exactement le contraire.

Elle dit : "Le code du fichier n'est exécuté que si la condition est
réalisée". ( résumé ).

Bien à vous.

Amicalement.

Jean François Ortolo
Avatar
Denis Beauregard
Le Sat, 31 May 2014 18:16:49 +0200, Jean Francois Ortolo
écrivait dans
fr.comp.lang.php:

Encore une fois, vous entendez par : "lire dans le fichier",
l'équivalent de "exécuter le fichier".

Or, la page dit exactement le contraire.

Elle dit : "Le code du fichier n'est exécuté que si la condition est
réalisée". ( résumé ).



À mon avis, il y a 2 situations différentes.


if condition
include ou require
fin de condition


Si la condition est vraie, le fichier est inclus.

Si la condition est fausse, le fichier n'est pas inclus. Cela
signifie 2 possibilités.
==> Soit la ligne de code n'est pas exécutée, donc un require sans
fichier ne donnera pas d'erreur,
==> soit les include et require sont exécutés de toutes façons mais
leur code interne est ignoré.

Il me semble que le 2e cas signifie en fait que PHP a un préprocesseur
puis un processeur indépendants, alors que le 1er cas, qu'il y a un
seul processur. C'est ce qu'on appelle une grosse différence entre 2
versions majeures d'un logiciel (entre 3/4 et 5 mais pas entre 3 et
3.1).

Vérifions ce que fait PHP 5 (celui que j'ai sur mon ordi).

<?php

if (0) {
require ("toto.php");
}

?>

toto.php n'existe pas et cela ne génère pas d'erreur. Donc, on n'a pas
de préprocesseur séparé. Avec if (1), il y a erreur.


Denis
1 2