1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536
|
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- EN-Revision: 1.45 Maintainer: spisto Status: working -->
<chapter id="control-structures">
<title>Strutture di controllo</title>
<simpara>
Qualsiasi script PHP costituito da una serie di istruzioni. Una istruzione
pu essere un'assegnazione, una chiamata di funzione, un loop, una istruzione condizionale
che non fa nulla (istruzione vuota).
Le istruzioni terminano con un punto e virgola. Inoltre, le istruzioni
si possono raggruppare in blocchi di istruzioni racchiudendole tra
parentesi graffa.
Un gruppo di istruzioni , a sua volta, un'istruzione. Il presente capitolo
descrive i differenti tipi di istruzioni.
</simpara>
<sect1 id="control-structures.if">
<title><literal>if</literal></title>
<para>
Il costrutto <literal>if</literal> uno delle pi importanti
caratteristiche di qualsiasi linguaggio, incluso PHP.
Permette l'esecuzione condizionata di frammenti di codice.
La struttura di controllo <literal>if</literal> di PHP simile a quella del linguaggio C:
<informalexample>
<programlisting>
<![CDATA[
if (espressione)
istruzione
]]>
</programlisting>
</informalexample>
</para>
<simpara>
Come descritto nel capitolo sulle espressioni, expr restituir il
suo valore di verit. Se <replaceable>espressione</replaceable>
&true;, PHP eseguir l'espressione, se
&false;, la ignorer.
</simpara>
<para>
L'esempio che segue visualizzer <computeroutput>a maggiore
di b</computeroutput> se <replaceable>$a</replaceable> sar maggiore
di <replaceable>$b</replaceable>:
<informalexample>
<programlisting role="php">
<![CDATA[
if ($a > $b)
print "a maggiore di b";
]]>
</programlisting>
</informalexample>
</para>
<para>
Spesso sar necessario eseguire pi di una istruzione
condizionale. Naturalmente non necessario, utilizzare una singola clausola
<literal>if</literal> per ciascuna istruzione. Si possono raggruppare diverse istruzioni
in un singolo gruppo di istruzioni. Per esemipo, il codice che segue
visualizzer <computeroutput>a is bigger than b</computeroutput>
se <replaceable>$a</replaceable> maggiore di <replaceable>$b</replaceable>,
e successivamente assegner il valore della variabile <replaceable>$a</replaceable>
alla variabile <replaceable>$b</replaceable>:
<informalexample>
<programlisting role="php">
<![CDATA[
if ($a > $b) {
print "a maggiore dib";
$b = $a;
}
]]>
</programlisting>
</informalexample>
</para>
<simpara>
Si possono annidare indefinitamente istruzioni
<literal>if</literal>, la qual cosa fornisce piena
flessibilit per l'esecuzione di istruzioni condizionali in differenti punti del
programma.
</simpara>
</sect1>
<sect1 id="control-structures.else">
<title><literal>else</literal></title>
<para>
Spesso necessario eseguire un'istruzione se una proposizione vera
e un'altra istruzione se la proposizione falsa. Per questo
si usa la clausola <literal>else</literal>. <literal>else</literal>
estende il costrutto <literal>if</literal> aggiungendo la possibilit
di eseguire un'istruzione se l'espressione nel ramo <literal>if</literal>
&false;. L'esempio che segue
visualizzer <computeroutput>a maggiore di
b</computeroutput> se <replaceable>$a</replaceable> maggiore di
<replaceable>$b</replaceable> e <computeroutput>a NON maggiore
di b</computeroutput> altrimenti:
<informalexample>
<programlisting role="php">
<![CDATA[
if ($a > $b) {
print "a maggiore di b";
} else {
print "a NON maggiore di b";
}
]]>
</programlisting>
</informalexample>
Il ramo <literal>else</literal> viene eseguito solo se l'espressione
nel ramo <literal>if</literal>
&false;, e, nel caso ci fossero delle clausole
<literal>elseif</literal>, solamente se le espressioni in esse contenute fossero
anch'esse &false; (vedere <link
linkend="control-structures.elseif">elseif</link>).
</para>
</sect1>
<sect1 id="control-structures.elseif">
<title><literal>elseif</literal></title>
<para>
<literal>elseif</literal>, come facile intuire, una combinazione
di <literal>if</literal> and <literal>else</literal>. Analogamente a
<literal>else</literal>, estende <literal>if</literal>
aggiungendo la possibilit di eseguire un'altra istruzione nel caso
in cui l'espressione contenuta nel ramo <literal>if</literal>
sia &false;. Per, a differenza
di <literal>else</literal>, si eseguir l'istruzione alternativa
solamente se l'espressione contenuta nel ramo <literal>elseif</literal>
sar &true;. L'esempio
che segue, visualizzer <computeroutput>a maggiore di
b</computeroutput>, <computeroutput>a uguale a b</computeroutput>
oppure <computeroutput>a minore di b</computeroutput>:
<informalexample>
<programlisting role="php">
<![CDATA[
if ($a > $b) {
print "a maggiore di b";
} elseif ($a == $b) {
print "a uguale a b";
} else {
print "a minore di b";
}
]]>
</programlisting>
</informalexample>
</para>
<simpara>
Nel medesimo blocco <literal>if</literal> possono essere presenti
pi d'una clausola <literal>elseif</literal>. L'istruzione del
primo ramo <literal>elseif</literal> la cui espressione
sia &true; verr eseguito. In PHP possibile
scrivere 'else if' (due parole) e il significato sar
lo stesso di 'elseif' (una sola parola). Il significato sintattico
leggermente differente (se si ha familiarit con il linguaggio C, esso ha lo stesso
comportamento) per al lato pratico l'effetto
il medesimo.
</simpara>
<simpara>
L'istruzione di un ramo <literal>elseif</literal> si eseguir solo se l'espressione del
ramo <literal>if</literal> e le espressioni dei
rami <literal>elseif</literal> precedenti sono
&false;, e se l'espressione
del ramo <literal>elseif</literal>
&true;.
</simpara>
</sect1>
<sect1 id="control-structures.alternative-syntax">
<title>Sintassi alternativa per le strutture di controllo</title>
<para>
PHP offre una sintassi alternatica per alcune delle sue strutture di controllo;
vale a dire, <literal>if</literal>,
<literal>while</literal>, <literal>for</literal>,
<literal>foreach</literal> e <literal>switch</literal>.
Fondamentalmente la sintassi alternativa consiste nel sostituire
la prima parentesi graffa con il carattere "duepunti" (:) e la seconda parentesi graffa con
<literal>endif;</literal>, <literal>endwhile;</literal>,
<literal>endfor;</literal>, <literal>endforeach;</literal>, oppure
<literal>endswitch;</literal>, rispettivamente.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php if ($a == 5): ?>
A maggiore di 5
<?php endif; ?>
]]>
</programlisting>
</informalexample>
</para>
<simpara>
Nell'esempio precedente, il blocco HTML "A = 5" incluso nel ramo
<literal>if</literal> scritto con utilizzando la sintassi alternativa.
Il blocco HTML verr visualizzato solamente se $a uguale a 5.
</simpara>
<para>
La sintassi alternativa si applica anche a <literal>else</literal> e
<literal>elseif</literal>. Nell'esempio che segue si mostra come utilizzare la sintassi alternativa
nel caso di un <literal>if</literal> con <literal>elseif</literal> e
<literal>else</literal>:
<informalexample>
<programlisting role="php">
<![CDATA[
if ($a == 5):
print "a uguale a 5";
print "...";
elseif ($a == 6):
print "a uguale a 6";
print "!!!";
else:
print "a non uguale n a 5 n a 6";
endif;
]]>
</programlisting>
</informalexample>
</para>
<para>
Vedere anche <link linkend="control-structures.while">while</link>,
<link linkend="control-structures.for">for</link>, e <link
linkend="control-structures.if">if</link> per ulteriori esempi.
</para>
</sect1>
<sect1 id="control-structures.while">
<title><literal>while</literal></title>
<para>
Il ciclo <literal>while</literal> la forma di ciclo pi semplice
tra quelle possibili in PHP. Si comporta come la sua controparte nel linguaggio C.
La forma basica di un ciclo <literal>while</literal> la seguente:
<informalexample>
<programlisting>
<![CDATA[
while (espressione) istruzione
]]>
</programlisting>
</informalexample>
</para>
<simpara>
Il significato di un ciclo <literal>while</literal> semplice.
Istruisce l'interprete PHP perch esegua l'istruzione (o le istruzioni)
in esso racchiuse, ripetutamente, fintanto che l'espressionbe contenuta
nella clausola <literal>while</literal> ha valore &true;.
Il valore dell'espressione viene verificato ogni volta che il ciclo
si ripete (iterazione), cos che anche se il valore dell'espressione cambia durante
l'esecuzione dell'istruzione, il ciclo non termina fino
all'iterazione successiva.
Ovviamente, se l'espressione nella clausola <literal>while</literal> ha valore
&false; dall'inizio, l'istruzione racchiusa nel blocco non verr eseguita nemmeno
una volta.
</simpara>
<para>
Come nel caso della struttura di controllo <literal>if</literal>, si possono raggruppare
pi istruzioni nello medesimo ciclo <literal>while</literal>
racchiudendo le istruzioni in parentesi grafa, oppure
utilizzando la sintassi alternativa:
<informalexample>
<programlisting>
<![CDATA[
while (espressione): istruzione ... endwhile;
]]>
</programlisting>
</informalexample>
</para>
<para>
Gli esempi seguenti sono identici e entrambi visualizzano i numeri da
1 a 10:
<informalexample>
<programlisting>
<![CDATA[
/* esempio 1 */
$i = 1;
while ($i <= 10) {
print $i++; /* Il valore visualizzato il valore della
variabile $i prima dell'incremento
(post-increment) */
}
/* esempio 2 */
$i = 1;
while ($i <= 10):
print $i;
$i++;
endwhile;
]]>
</programlisting>
</informalexample>
</para>
</sect1>
<sect1 id="control-structures.do.while">
<title><literal>do..while</literal></title>
<simpara>
Il ciclo <literal>do..while</literal> simile al ciclo
<literal>while</literal>, con l'unica differenza che il valore dell'espressione
viene controllato alla fine di ogni iterazione anzich all'inizio.
La differenza pi importante rispetto a <literal>while</literal> che
la prima iterazione di un blocco <literal>do..while</literal>verr
sempre eseguita (il valore dell'espressione viene controllato alla fine
del ciclo), mentre non necessariamente vero in un
ciclo <literal>while</literal> questo (il valore dell'espressione viene
controllato all'inizio del ciclo, e se tale valore
&false; dall'inizio, l'esecuzione del ciclo
termina immediatamente).
</simpara>
<para>
ammessa una sola sintassi per il ciclo <literal>do..while</literal>:
<informalexample>
<programlisting role="php">
<![CDATA[
$i = 0;
do {
print $i;
} while ($i>0);
]]>
</programlisting>
</informalexample>
</para>
<simpara>
Il ciclo precedente verr eseguito un'unica volta, dal momento che
alla prima iterazione, quando si controlla l'espressione, il suo valore sar
&false; ($i non maggiore di 0) e il ciclo di
esecuzioni, termina.
</simpara>
<para>
Chi ha utilizzato il linguaggio C conosce probabilmente un'altro modo di utilizzare
il ciclo <literal>do..while</literal>, che permette di terminare l'esecuzione
delle istruzioni durante l'esecuzione stessa, utilizzando
<literal>do..while</literal>(0), e usando l'istruzione <link
linkend="control-structures.break"><literal>break</literal></link>.
Il codice che segue esemplifica questa possibilit:
<informalexample>
<programlisting role="php">
<![CDATA[
do {
if ($i < 5) {
print "i non abbastanza grande";
break;
}
$i *= $factor;
if ($i < $minimum_limit) {
break;
}
print "i ok";
...processa i...
} while(0);
]]>
</programlisting>
</informalexample>
</para>
<simpara>
Non vi preoccupate se l'esempio non sufficientemente chiaro.
Si possono scrivere ottimi programmi PHP anche senza far ricorso a questa
'possibilit'.
</simpara>
</sect1>
<sect1 id="control-structures.for">
<title><literal>for</literal></title>
<para>
Il ciclo <literal>for</literal> il ciclo pi complesso tra quelli disponibili in PHP.
Si comporta come la sua controparte nel linguaggio C.
La sintassi di un clico <literal>for</literal> :
<informalexample>
<programlisting>
<![CDATA[
for (expr1; expr2; expr3) istruzione
]]>
</programlisting>
</informalexample>
</para>
<simpara>
Il valore della prima espressione (<replaceable>expr1</replaceable>) viene
verificato (eseguito) una sola volta incondizionatamente all'inizio del
ciclo.
</simpara>
<simpara>
Ad ogni iterazione,
si controlla il valore di <replaceable>expr2</replaceable>. Se
&true;, il ciclo prosegue e viene eseguita
l'istruzione (o le istruzioni) contenuta nel blocco;
se &false;, l'esecuzione del ciclo termina.
</simpara>
<simpara>
Al termine di ogni iterazione, <replaceable>expr3</replaceable> si verifica
il valore di <replaceable>expr3</replaceable>.
</simpara>
<simpara>
Le due espressioni possono anche non essere presenti.
Se non esiste <replaceable>expr2</replaceable> significa che il ciclo deve
essere eseguito indefinitamente (PHP considera implicitamente che il
suo valore &true;, come in C). Questa possibilit in fondo non
utile come pu sembrare perch obbliga a terminare il ciclo utilizzando
l'istruzione <link
linkend="control-structures.break"><literal>break</literal></link>
invece di utilizzare le espressioni di verit del ciclo <literal>for</literal>
.
</simpara>
<para>
Si considerino gli esempi seguenti. In ciascun caso si visualizzeranno
i numeri da 1 a 10:
<informalexample>
<programlisting role="php">
<![CDATA[
/* example 1 */
for ($i = 1; $i <= 10; $i++) {
print $i;
}
/* example 2 */
for ($i = 1;;$i++) {
if ($i > 10) {
break;
}
print $i;
}
/* example 3 */
$i = 1;
for (;;) {
if ($i > 10) {
break;
}
print $i;
$i++;
}
/* example 4 */
for ($i = 1; $i <= 10; print $i, $i++) ;
]]>
</programlisting>
</informalexample>
</para>
<simpara>
Naturalmente il primo esempio sembra il migliore (o
forse il quarto), ma l'uso del
ciclo <literal>for</literal> senza espressioni pu essere utile
in molti casi.
</simpara>
<para>
PHP offre una sintassi alternativa (con i "punto e virgola") per i
cicli <literal>for</literal>.
<informalexample>
<programlisting>
<![CDATA[
for (expr1; expr2; expr3): istruzione; ...; endfor;
]]>
</programlisting>
</informalexample>
</para>
<para>
Alcuni linguaggi permettono l'uso della struttura di controllo <literal>foreach</literal> per
attraversare un array o una tabella hash. PHP 3 non premette l'uso di tale ciclo mentre PHP 4 s
(vedere <link
linkend="control-structures.foreach">foreach</link>). In PHP 3
possibile combinare <link linkend="control-structures.while">while</link>
con la funzione <function>list</function> e <function>each</function>
per ottenere la stessa funzionali. Si veda la documentazione si queste funzioni
per ulteriori esempi.
</para>
</sect1>
<sect1 id="control-structures.foreach">
<title><literal>foreach</literal></title>
<para>
PHP 4 (non PHP 3) permette l'uso della struttura di controllo <literal>foreach</literal>,
alla stessa maniera del linguaggio Perl e altri.
<literal>foreach</literal> offre una maniera semplice di attraversare un array. Esistono due possibili notazioni sintattiche; la seconda
un'utile estensione della prima:
<informalexample>
<programlisting>
<![CDATA[
foreach(array_expression as $value) istruzione
foreach(array_expression as $key => $value) istruzione
]]>
</programlisting>
</informalexample>
</para>
<simpara>
La prima attraversa l'array dato da <literal>array_expression</literal>.
Ad ogni ciclo, si assegna il valore dell'elemento corrente a <literal>$value</literal>
e il puntatore interno avanza di una posizione (in modo tale che
al ciclo successivo l'elemento corrente sar il successivo elemento
dell'array).
</simpara>
<simpara>
La seconda esegue lo stesso ciclo con la differenza che il
valore dell'indice corrente viene assegnato ad ogni ciclo,
alla variabile <literal>$key</literal>.
</simpara>
<para>
<note>
<para>
All'inizio dell'esecuzione di un ciclo <literal>foreach</literal>
il puntatore interno viene automaticamente posizionato nella prima
posizione. Questo significa che non necessario utilizzare la
funzione <function>reset</function> prima di un ciclo <literal>foreach</literal>
.
</para>
</note>
</para>
<para>
<note>
<para>
importante notare che <literal>foreach</literal> opera su una copia
dell'array, pertanto il puntatore dell'array originale non viene
modificato come accade utilizzando la funzione <function>each</function>
e le modifiche agli elementi dell'array non
appaiono nell'array originale.
</para>
</note>
</para>
<note>
<para>
<literal>foreach</literal> non offre la possibilit di annullare la generazione
di messaggi d'errore utilizzando il carattere '@'.
</para>
</note>
<para>
Avete probabilmente notato che i due cicli seguenti sono identici da un
punto di vista funzionale:
<informalexample>
<programlisting role="php">
<![CDATA[
reset ($arr);
while (list(, $value) = each ($arr)) {
echo "Valore: $value<br>\n";
}
foreach ($arr as $value) {
echo "Valore: $value<br>\n";
}
]]>
</programlisting>
</informalexample>
Allo stesso modo i due cicli seguenti sono identici:
<informalexample>
<programlisting role="php">
<![CDATA[
reset ($arr);
while (list($key, $value) = each ($arr)) {
echo "Key: $key; Valore: $value<br>\n";
}
foreach ($arr as $key => $value) {
echo "Key: $key; Valore: $value<br>\n";
}
]]>
</programlisting>
</informalexample>
</para>
<para>
Di seguito, altri esempi per mostrare possibili utilizzi:
<informalexample>
<programlisting role="php">
<![CDATA[
/* foreach example 1: value only */
$a = array (1, 2, 3, 17);
foreach ($a as $v) {
print "Valore corrente of \$a: $v.\n";
}
/* foreach example 2: value (with key printed for illustration) */
$a = array (1, 2, 3, 17);
$i = 0; /* for illustrative purposes only */
foreach($a as $v) {
print "\$a[$i] => $v.\n";
}
/* foreach example 3: key and value */
$a = array (
"one" => 1,
"two" => 2,
"three" => 3,
"seventeen" => 17
);
foreach($a as $k => $v) {
print "\$a[$k] => $v.\n";
}
/* foreach example 4: multi-dimensional arrays */
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";
foreach($a as $v1) {
foreach ($v1 as $v2) {
print "$v2\n";
}
}
/* foreach example 5: dynamic arrays */
foreach(array(1, 2, 3, 4, 5) as $v) {
print "$v\n";
}
]]>
</programlisting>
</informalexample>
</para>
</sect1>
<sect1 id="control-structures.break">
<title><literal>break</literal></title>
<simpara>
<literal>break</literal> termina l'esecuzione di una struttura
<literal>for</literal>, <literal>foreach</literal>
<literal>while</literal>, <literal>do..while</literal> o
<literal>switch</literal>.
</simpara>
<simpara>
<literal>break</literal> accetta un argomento opzionale che definisce,
nel caso di cicli annidati, il livello del ciclo che da
interrompere.
</simpara>
<para>
<informalexample>
<programlisting role="php">
<![CDATA[
$arr = array ('one', 'two', 'three', 'four', 'stop', 'five');
while (list (, $val) = each ($arr)) {
if ($val == 'stop') {
break; /* Si pu anche usare 'break 1;'. */
}
echo "$val<br>\n";
}
/* Uso dell'argomento opzionale. */
$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "At 5<br>\n";
break 1; /* Interrompe solo awitch. */
case 10:
echo "At 10; quitting<br>\n";
break 2; /* Interrompe switch e while. */
default:
break;
}
}
]]>
</programlisting>
</informalexample>
</para>
</sect1>
<sect1 id="control-structures.continue">
<title><literal>continue</literal></title>
<simpara>
<literal>continue</literal> si utilizza per interrompere l'esecuzione
del ciclo corrente e continuare con l'esecuzione
all'inizio del ciclo successivo.
</simpara>
<simpara>
<literal>continue</literal> accetta un argomento numerico opzionale
che definisce, nel caso di cicli annidati, il numero di cicli da interrompere
e a cui iniziare l'esecuzione dell'iterazione successiva.
</simpara>
<para>
<informalexample>
<programlisting role="php">
<![CDATA[
while (list ($key, $value) = each ($arr)) {
if (!($key % 2)) { // skip odd members
continue;
}
do_something_odd ($value);
}
$i = 0;
while ($i++ < 5) {
echo "Outer<br>\n";
while (1) {
echo " Middle<br>\n";
while (1) {
echo " Inner<br>\n";
continue 3;
}
echo "This never gets output.<br>\n";
}
echo "Neither does this.<br>\n";
}
]]>
</programlisting>
</informalexample>
</para>
</sect1>
<sect1 id="control-structures.switch">
<title><literal>switch</literal></title>
<simpara>
<literal>switch</literal> simile a una serie di
IF sulla stessa espressione. In molti casi pu essere
necessario confrontare una variabile (o espressione) con differenti
valori ed eseguire un differente blocco di istruzioni a seconda
del valore di detta variabile. Questo esattamente quello che fa la struttura
di controllo <literal>switch</literal>.
</simpara>
<para>
Gli esempi seguenti mostrano due maniere differenti di scrivere
la stessa cosa, uno utilizzando una serie di <literal>if</literal>,
l'altro utilizzando <literal>switch</literal>
:
<informalexample>
<programlisting role="php">
<![CDATA[
if ($i == 0) {
print "i equals 0";
}
if ($i == 1) {
print "i equals 1";
}
if ($i == 2) {
print "i equals 2";
}
switch ($i) {
case 0:
print "i equals 0";
break;
case 1:
print "i equals 1";
break;
case 2:
print "i equals 2";
break;
}
]]>
</programlisting>
</informalexample>
</para>
<para>
importante comprendere esattamente come viene eseguita la
clausola <literal>switch</literal> per evitare errori.
Un'istruzione <literal>switch</literal> esegue linea dopo linea
le istruzioni in essa contenuta.
Solamente quando incontra una clausola <literal>case</literal>
il cui valore uguale al valore della viariabile, PHP inizia ad
eseguire le istruzioni contenute nel blocco case.
PHP continua l'esecuzione delle istruzioni fino alla termine del
blocco <literal>switch</literal>, o quando incontra un'istruzione
<literal>break</literal>. Se non esiste alcuna
istruzione <literal>break</literal> al termine di un blocco case
PHP continuer l'esecuzione le istruzioni del blocco case successivo.
Per esempio:
<informalexample>
<programlisting role="php">
<![CDATA[
switch ($i) {
case 0:
print "i uguale a 0";
case 1:
print "i uguale a 1";
case 2:
print "i uguale a 2";
}
]]>
</programlisting>
</informalexample>
</para>
<simpara>
In questo caso se $i uguale a 0, PHP eseguir tutte le
istruzioni contenute nei blocchi case. Se $i uguale a 1,
PHP eseguir le istruzioni degli ultimi due blocchi case e
solamente se $i uguale a 2 otterremo il risultato voluto
e si visualizzer solo '$i uguale a 2'.
Pertanto importante non dimenticare l'istruzione <literal>break</literal>
(anche se in alcuni casi potr essere necessario non utilizzarla).
</simpara>
<simpara>
In un'istruzione <literal>switch</literal>, la condizione in parentesi
viene valutata una sola volta e il risultato viene confrontato con
ciascun ramo <literal>case</literal>. Utilizzando <literal>elseif</literal>,
la ondizione viene valutata una seconda volta. Se tale condizione pi
complessa di un semplice confronto e/o in un ciclo piuttosto pesante,
l'uso di <literal>switch</literal> dovrebbe garantire un minor tempo di esecuzione.
</simpara>
<para>
Un blocco case pu anche non contenere istruzioni, nel qual caso
il controllo passa semplicemente al successivo blocco case.
<informalexample>
<programlisting role="php">
<![CDATA[
switch ($i) {
case 0:
case 1:
case 2:
print "i is less than 3 but not negative";
break;
case 3:
print "i is 3";
}
]]>
</programlisting>
</informalexample>
</para>
<para>
Un blocco case speciale il il blocco case di default.
Uguagli tutte le condizioni non uguagliate nei blocchi case
precedenti e dev'essere l'ultimo blocco <literal>case</literal> statement. Per esempio:
<informalexample>
<programlisting role="php">
<![CDATA[
switch ($i) {
case 0:
print "i uguale a 0";
break;
case 1:
print "i uguale a 1";
break;
case 2:
print "i uguale a 2";
break;
default:
print "i non ugluale a 0, 1 o 2";
}
]]>
</programlisting>
</informalexample>
</para>
<para>
L'espressione in un ramo case <literal>case</literal> pu essere
qualsiasi espressione il cui valore sar di tipo intero, decimale,
numerico e stringa. Array e oggetti (objects) non sono ammessi
a meno che non siano dereferenziati a un tipo di dato semplice tra quelli precedentemente elencati.
</para>
<para>
Come per altre strutture di controllo possibile utilizzare una sintassi
alternativa. Si veda
<link linkend="control-structures.alternative-syntax">Sintassi alternativa per le strutture di controllo</link>
per ulteriori esempi.
<informalexample>
<programlisting role="php">
<![CDATA[
switch ($i):
case 0:
print "i uguale a 0";
break;
case 1:
print "i uguale a 1";
break;
case 2:
print "i uguale a 2";
break;
default:
print "i non uguale a 0, 1 o 2";
endswitch;
]]>
</programlisting>
</informalexample>
</para>
</sect1>
<sect1 id="control-structures.declare">
<title><literal>declare</literal></title>
<para>
Il costrutto <literal>declare</literal> si usa per definire
direttive di esecuzione per blocchi di istruzioni.
La sintassi simile alla
sintassi di altre strutture di controllo:
<informalexample>
<programlisting>
<![CDATA[
declare (direttiva) istruzione
]]>
</programlisting>
</informalexample>
</para>
<para>
La sezione <literal>direttiva</literal> permette di
impostare il comportamento del blocco <literal>declare</literal>
.
Attualemente riconosciuta una sola direttiva: la
direttiva <literal>ticks</literal>. (Fare riferimento pi in basso per ulteriori
informazioni relative alla
direttiva
<link linkend="control-structures.declare.ticks">ticks</link>)
</para>
<para>
La parte <literal>istruzione</literal> del
blocco <literal>declare</literal> verr eseguita. Come
verr eseguita e quali effetti collaterali emergeranno durante l'esecuzione
potr dipendere dalla direttiva impostata nel
blocco <literal>direttiva</literal>.
</para>
<sect2 id="control-structures.declare.ticks">
<title>Ticks</title>
<para>A tick is an event that occurs for every
<replaceable>N</replaceable> low-level statements executed
by the parser within the <literal>declare</literal> block.
The value for <replaceable>N</replaceable> is specified
using <literal>ticks=<replaceable>N</replaceable></literal>
within the <literal>declare</literal> blocks's
<literal>directive</literal> section.
</para>
<para>
The event(s) that occurs on each tick is specified using the
<function>register_tick_function</function>. See the example
below for more details. Note that more than one event can occur
for each tick.
</para>
<para>
<example>
<title>Profile a section of PHP code</title>
<programlisting role="php">
<![CDATA[
<pre>
<?php
// A function that records the time when it is called
function profile ($dump = FALSE)
{
static $profile;
// Return the times stored in profile, then erase it
if ($dump) {
$temp = $profile;
unset ($profile);
return ($temp);
}
$profile[] = microtime ();
}
// Set up a tick handler
register_tick_function("profile");
// Initialize the function before the declare block
profile ();
// Run a block of code, throw a tick every 2nd statement
declare (ticks=2) {
for ($x = 1; $x < 50; ++$x) {
echo similar_text (md5($x), md5($x*$x)), "<br>";
}
}
// Display the data stored in the profiler
print_r (profile (TRUE));
?>
</pre>
]]>
</programlisting>
</example>
The example profiles the PHP code within the 'declare'
block, recording the time at which every second low-level
statement in the block was executed. This information can
then be used to find the slow areas within particular
segments of code. This process can be performed using other
methods: using ticks is more convenient and easier to
implement.
</para>
<simpara>
Ticks are well suited for debugging, implementing simple
multitasking, backgrounded I/O and many other tasks.
</simpara>
<simpara>
See also <function>register_tick_function</function> and
<function>unregister_tick_function</function>.
</simpara>
</sect2>
</sect1>
<sect1 id="function.require">
<title><function>require</function></title>
<simpara>
The <function>require</function> statement replaces itself with
the specified file, much like the C preprocessor's
<literal>#include</literal> works.
</simpara>
<simpara>
If "URL fopen wrappers" are enabled in PHP (which they are in the
default configuration), you can specify the file to be
<function>require</function>ed using an URL instead of a local
pathname. See <link linkend="features.remote-files">Remote
files</link> and <function>fopen</function> for more information.
</simpara>
<simpara>
An important note about how this works is that when a file is
<function>include</function>ed or <function>require</function>ed,
parsing drops out of PHP mode and into HTML mode at the beginning
of the target file, and resumes PHP mode again at the end. For
this reason, any code inside the target file which should be
executed as PHP code must be enclosed within <link
linkend="language.basic-syntax.phpmode">valid PHP start and end
tags</link>.
</simpara>
<simpara>
<function>require</function> is not actually a function in PHP;
rather, it is a language construct. It is subject to some
different rules than functions are. For instance,
<function>require</function> is not subject to any containing
control structures. For another, it does not return any value;
attempting to read a return value from a
<function>require</function> call results in a parse error.
</simpara>
<simpara>
Unlike <function>include</function>, <function>require</function>
will <emphasis>always</emphasis> read in the target file,
<emphasis>even if the line it's on never executes</emphasis>. If
you want to conditionally include a file, use
<function>include</function>. The conditional statement won't
affect the <function>require</function>. However, if the line on
which the <function>require</function> occurs is not executed,
neither will any of the code in the target file be executed.
</simpara>
<simpara>
Similarly, looping structures do not affect the behaviour of
<function>require</function>. Although the code contained in the
target file is still subject to the loop, the
<function>require</function> itself happens only once.
</simpara>
<para>
This means that you can't put a <function>require</function>
statement inside of a loop structure and expect it to include the
contents of a different file on each iteration. To do that, use an
<function>include</function> statement.
<informalexample>
<programlisting role="php">
<![CDATA[
require ('header.inc');
]]>
</programlisting>
</informalexample>
</para>
<simpara>
When a file is <function>require</function>ed, the code it
contains inherits the variable scope of the line on which the
<function>require</function> occurs. Any variables available at
that line in the calling file will be available within the called
file. If the <function>require</function> occurs inside a
function within the calling file, then all of the code contained
in the called file will behave as though it had been defined
inside that function.
</simpara>
<para>
If the <function>require</function>ed file is called via HTTP
using the fopen wrappers, and if the target server interprets the
target file as PHP code, variables may be passed to the
<function>require</function>ed file using an URL request string as
used with HTTP GET. This is not strictly speaking the same thing
as <function>require</function>ing the file and having it inherit
the parent file's variable scope; the script is actually being run
on the remote server and the result is then being included into
the local script.
<informalexample>
<programlisting role="php">
<![CDATA[
/* This example assumes that someserver is configured to parse .php
* files and not .txt files. Also, 'works' here means that the variables
* $varone and $vartwo are available within the require()ed file. */
/* Won't work; file.txt wasn't handled by someserver. */
require ("http://someserver/file.txt?varone=1&vartwo=2");
/* Won't work; looks for a file named 'file.php?varone=1&vartwo=2'
* on the local filesystem. */
require ("file.php?varone=1&vartwo=2");
/* Works. */
require ("http://someserver/file.php?varone=1&vartwo=2");
$varone = 1;
$vartwo = 2;
require ("file.txt"); /* Works. */
require ("file.php"); /* Works. */
]]>
</programlisting>
</informalexample>
</para>
<simpara>
In PHP 3, it is possible to execute a <literal>return</literal>
statement inside a <function>require</function>ed file, as long as
that statement occurs in the global scope of the
<function>require</function>ed file. It may not occur within any
block (meaning inside braces ({}). In PHP 4, however, this ability
has been discontinued. If you need this functionality, see
<function>include</function>.
</simpara>
<simpara>
See also <function>include</function>, <function>require_once</function>,
<function>include_once</function>, <function>readfile</function>,
and <function>virtual</function>.
</simpara>
</sect1>
<sect1 id="function.include">
<title><function>include</function></title>
<simpara>
The <function>include</function> statement includes and evaluates
the specified file.
</simpara>
<simpara>
If "URL fopen wrappers" are enabled in PHP (which they are in the
default configuration), you can specify the file to be
<function>include</function>ed using an URL instead of a local
pathname. See <link linkend="features.remote-files">Remote
files</link> and <function>fopen</function> for more information.
</simpara>
<simpara>
An important note about how this works is that when a file is
<function>include</function>ed or <function>require</function>ed,
parsing drops out of PHP mode and into HTML mode at the beginning
of the target file, and resumes again at the end. For this reason,
any code inside the target file which should be executed as PHP
code must be enclosed within <link
linkend="language.basic-syntax.phpmode">valid PHP start and end
tags</link>.
</simpara>
<para>
This happens each time the <function>include</function> statement
is encountered, so you can use an <function>include</function>
statement within a looping structure to include a number of
different files.
<informalexample>
<programlisting role="php">
<![CDATA[
$files = array ('first.inc', 'second.inc', 'third.inc');
for ($i = 0; $i < count($files); $i++) {
include $files[$i];
}
]]>
</programlisting>
</informalexample>
</para>
<para>
<function>include</function> differs from
<function>require</function> in that the include statement is
re-evaluated each time it is encountered (and only when it is
being executed), whereas the <function>require</function>
statement is replaced by the required file when it is first
encountered, whether the contents of the file will be evaluated or
not (for example, if it is inside an <link
linkend="control-structures.if">if</link> statement whose
condition evaluated to &false;).
</para>
<para>
Because <function>include</function> is a special language
construct, you must enclose it within a statement block if it is
inside a conditional block.
<informalexample>
<programlisting role="php">
<![CDATA[
/* This is WRONG and will not work as desired. */
if ($condition)
include($file);
else
include($other);
/* This is CORRECT. */
if ($condition) {
include($file);
} else {
include($other);
}
]]>
</programlisting>
</informalexample>
</para>
<simpara>
In both PHP 3 and PHP 4, it is possible to execute a
<literal>return</literal> statement inside an
<function>include</function>ed file, in order to terminate
processing in that file and return to the script which called
it. Some differences in the way this works exist, however. The
first is that in PHP 3, the <literal>return</literal> may not
appear inside a block unless it's a function block, in which case
the <literal>return</literal> applies to that function and not the
whole file. In PHP 4, however, this restriction does not
exist. Also, PHP 4 allows you to return values from
<function>include</function>ed files. You can take the value of
the <function>include</function> call as you would a normal
function. This generates a parse error in PHP 3.
</simpara>
<example>
<title><function>include</function> in PHP 3 and PHP 4</title>
<para>
Assume the existence of the following file (named
<filename>test.inc</filename>) in the same directory as the main
file:
<programlisting role="php">
<![CDATA[
<?php
echo "Before the return <br>\n";
if (1) {
return 27;
}
echo "After the return <br>\n";
?>
]]>
</programlisting>
</para>
<para>
Assume that the main file (<filename>main.html</filename>)
contains the following:
<programlisting role="php">
<![CDATA[
<?php
$retval = include ('test.inc');
echo "File returned: '$retval'<br>\n";
?>
]]>
</programlisting>
</para>
<para>
When <filename>main.html</filename> is called in PHP 3, it will
generate a parse error on line 2; you can't take the value of an
<function>include</function> in PHP 3. In PHP 4, however, the
result will be:
<screen>
Before the return
File returned: '27'
</screen>
</para>
<para>
Now, assume that <filename>main.html</filename> has been altered
to contain the following:
<programlisting role="php">
<![CDATA[
<?php
include ('test.inc');
echo "Back in main.html<br>\n";
?>
]]>
</programlisting>
</para>
<para>
In PHP 4, the output will be:
<screen>
Before the return
Back in main.html
</screen>
However, PHP 3 will give the following output:
<screen>
Before the return
27Back in main.html
Parse error: parse error in /home/torben/public_html/phptest/main.html on line 5
</screen>
</para>
<para>
The above parse error is a result of the fact that the
<literal>return</literal> statement is enclosed in a non-function
block within <filename>test.inc</filename>. When the return is
moved outside of the block, the output is:
<screen>
Before the return
27Back in main.html
</screen>
</para>
<para>
The spurious '27' is due to the fact that PHP 3 does not support
<literal>return</literal>ing values from files like that.
</para>
</example>
<simpara>
When a file is <function>include</function>ed, the code it
contains inherits the variable scope of the line on which the
<function>include</function> occurs. Any variables available at
that line in the calling file will be available within the called
file. If the <function>include</function> occurs inside a
function within the calling file, then all of the code contained
in the called file will behave as though it had been defined
inside that function.
</simpara>
<para>
If the <function>include</function>ed file is called via HTTP
using the fopen wrappers, and if the target server interprets the
target file as PHP code, variables may be passed to the
<function>include</function>ed file using an URL request string as
used with HTTP GET. This is not strictly speaking the same thing
as <function>include</function>ing the file and having it inherit
the parent file's variable scope; the script is actually being run
on the remote server and the result is then being included into
the local script.
<informalexample>
<programlisting role="php">
<![CDATA[
/* This example assumes that someserver is configured to parse .php
* files and not .txt files. Also, 'works' here means that the variables
* $varone and $vartwo are available within the include()ed file. */
/* Won't work; file.txt wasn't handled by someserver. */
include ("http://someserver/file.txt?varone=1vartwo=2");
/* Won't work; looks for a file named 'file.php?varone=1&vartwo=2'
* on the local filesystem. */
include ("file.php?varone=1&vartwo=2");
/* Works. */
include ("http://someserver/file.php?varone=1&vartwo=2");
$varone = 1;
$vartwo = 2;
include ("file.txt"); /* Works. */
include ("file.php"); /* Works. */
]]>
</programlisting>
</informalexample>
</para>
<simpara>
See also <function>require</function>, <function>require_once</function>,
<function>include_once</function>, <function>readfile</function>,
and <function>virtual</function>.
</simpara>
</sect1>
<sect1 id="function.require-once">
<title><function>require_once</function></title>
<para>
The <function>require_once</function> statement replaces
itself with the specified file, much like the C preprocessor's
<literal>#include</literal> works, and in that respect is
similar to the <function>require</function> statement. The main
difference is that in an inclusion chain, the use of
<function>require_once</function> will assure that the code is
added to your script only once, and avoid clashes with variable
values or function names that can happen.
</para>
<para>
For example, if you create the following 2 include files
<literal>utils.inc</literal> and <literal>foolib.inc</literal>
<example>
<title>utils.inc</title>
<programlisting role="php">
<![CDATA[
<?php
define("PHPVERSION", floor(phpversion()));
echo "GLOBALS ARE NICE\n";
function goodTea()
{
return "Oolong tea tastes good!";
}
?>
]]>
</programlisting>
</example>
<example>
<title>foolib.inc</title>
<programlisting role="php">
<![CDATA[
<?php
require ("utils.inc");
function showVar($var)
{
if (PHPVERSION == 4) {
print_r($var);
} else {
var_dump($var);
}
}
// bunch of other functions ...
?>
]]>
</programlisting>
</example>
And then you write a script <literal>cause_error_require.php</literal>
<example>
<title>cause_error_require.php</title>
<programlisting role="php">
<![CDATA[
<?php
require("foolib.inc");
/* the following will generate an error */
require("utils.inc");
$foo = array("1",array("complex","quaternion"));
echo "this is requiring utils.inc again which is also\n";
echo "required in foolib.inc\n";
echo "Running goodTea: ".goodTea()."\n";
echo "Printing foo: \n";
showVar($foo);
?>
]]>
</programlisting>
</example>
When you try running the latter one, the resulting ouptut will be (using
PHP 4.01pl2):
<informalexample>
<screen>
<![CDATA[
GLOBALS ARE NICE
GLOBALS ARE NICE
Fatal error: Cannot redeclare goodTea() in utils.inc on line 5
]]>
</screen>
</informalexample>
By modifying <literal>foolib.inc</literal> and
<literal>cause_errror_require.php</literal>
to use <function>require_once</function>
instead of <function>require</function> and renaming the
last one to <literal>avoid_error_require_once.php</literal>, we have:
<example>
<title>foolib.inc (fixed)</title>
<programlisting role="php">
<![CDATA[
...
require_once("utils.inc");
function showVar($var)
{
...
]]>
</programlisting>
</example>
<example>
<title>avoid_error_require_once.php</title>
<programlisting role="php">
<![CDATA[
...
require_once("foolib.inc");
require_once("utils.inc");
$foo = array("1",array("complex","quaternion"));
...
]]>
</programlisting>
</example>
And when running the latter, the output will be (using PHP 4.0.1pl2):
<informalexample>
<screen>
<![CDATA[
GLOBALS ARE NICE
this is requiring globals.inc again which is also
required in foolib.inc
Running goodTea: Oolong tea tastes good!
Printing foo:
Array
(
[0] => 1
[1] => Array
(
[0] => complex
[1] => quaternion
)
)
]]>
</screen>
</informalexample>
</para>
<para>
Also note that, analogous to the behavior of the
<literal>#include</literal> of the C preprocessor, this statement
acts at "compile time", e.g. when the script is parsed and before it
is executed, and should not be used for parts of the script that need
to be inserted dynamically during its execution. You should use
<function>include_once</function> or <function>include</function>
for that purpose.
</para>
<para>
For more examples on using <function>require_once</function> and
<function>include_once</function>, look at the PEAR code included in
the latest PHP source code distributions.
</para>
<para>
See also: <function>require</function>,
<function>include</function>, <function>include_once</function>,
<function>get_required_files</function>,
<function>get_included_files</function>, <function>readfile</function>,
and <function>virtual</function>.
</para>
</sect1>
<sect1 id="function.include-once">
<title><function>include_once</function></title>
<para>
The <function>include_once</function> statement includes and evaluates
the specified file during the execution of the script.
This is a behavior similar to the <function>include</function> statement,
with the important difference that if the code from a file has already
been included, it will not be included again.
</para>
<para>
As mentioned in the <function>require_once</function> description, the
<function>include_once</function> should be used in the cases in which
the same file might be included and evaluated more than once during a
particular execution of a script, and you want to be sure that it is
included exactly once to avoid problems with function redefinitions,
variable value reassignments, etc.
</para>
<para>
For more examples on using <function>require_once</function> and
<function>include_once</function>, look at the PEAR code included in
the latest PHP source code distributions.
</para>
<para>
<function>include_once</function> was added in PHP 4.0.1pl2
</para>
<para>
See also: <function>require</function>,
<function>include</function>, <function>require_once</function>,
<function>get_required_files</function>,
<function>get_included_files</function>, <function>readfile</function>,
and <function>virtual</function>.
</para>
</sect1>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
|