File: variables.xml

package info (click to toggle)
phpdoc 20020310-1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 35,272 kB
  • ctags: 354
  • sloc: xml: 799,767; php: 1,395; cpp: 500; makefile: 200; sh: 140; awk: 51
file content (951 lines) | stat: -rwxr-xr-x 31,974 bytes parent folder | download
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
<?xml version="1.0" encoding="iso-8859-1"?>
 <chapter id="language.variables">
  <title>Variables</title>
  
  <sect1 id="language.variables.basics">
   <title>Conceptos B&aacute;sicos</title>

   <para>
    En PHP las variables se representan como un signo de d&oacute;lar seguido
    por el nombre de la variable. El nombre de la variable es sensible a
min&uacute;sculas y may&uacute;sculas.
    <informalexample>
     <programlisting role="php"> 
$var = "Bob";
$Var = "Joe";
echo "$var, $Var"; // produce la salida "Bob, Joe"
     </programlisting>
    </informalexample>
   </para>
   <para>
    En PHP3, las variables siempre se asignan por valor. Esto significa que
    cuando se asigna una expresi&oacute;n a una variable, el valor &iacute;ntegro de
    la expresi&oacute;n original se copia en la variable
    de destino. Esto quiere decir que, por ejemplo, despu&eacute;s e asignar el
    valor de una variable a otra, los cambios que se efect&uacute;en a una de esas
    variables no afectar&aacute; a la otra. Para m&aacute;s informaci&oacute;n sobre este tipo de
    asignaci&oacute;n, vea <link
    linkend="language.expressions">Expresiones</link>.
   </para>
   <para>
    PHP4 ofrece otra forma de asignar valores a las variables:
    <emphasis>asignar por referencia</emphasis>. Esto significa que la nueva
    variable simplemente referencia (en otras palabras, "se convierte en un
    alias de" o "apunta a") la variable original. Los cambios a la nueva
    variable afectan a la original, y viceversa. Esto tambi&eacute;n significa que no
    se produce una copia de valores; por tanto, la asignaci&oacute;n ocurre m&aacute;s
    r&aacute;pidamente. De cualquier forma, cualquier incremento de velocidad se 
    notar&aacute; s&oacute;lo en los bucles cr&iacute;ticos cuando se asignen grandes arrays u 
    objetos.
   </para>
   <para>
    Para asignar por referencia, simplemente se antepone un ampersand (&amp;) 
    al comienzo de la variable cuyo valor se est&aacute; asignando (la variable
    fuente). Por ejemplo, el siguiente trozo de c&oacute;digo produce la salida 'Mi
    nombre es Bob' dos veces:

    <informalexample>
     <programlisting role="php">
&lt;?php
$foo = 'Bob';              // Asigna el valor 'Bob' a $foo
$bar = &amp;$foo;              // Referencia $foo v&iacute;a $bar.
$bar = "Mi nombre es $bar";  // Modifica $bar...
echo $foo;                 // $foo tambi&eacute;n se modifica.
echo $bar;
?&gt;
     </programlisting>
    </informalexample>
   </para>

   <para>
    Algo importante a tener en cuenta es que s&oacute;lo las variables con nombre 
    pueden ser asignadas por referencia.
    <informalexample>
     <programlisting role="php">
&lt;?php
$foo = 25;
$bar = &amp;$foo;      // Esta es una asignaci&oacute;n v&aacute;lida.
$bar = &amp;(24 * 7);  // Inv&aacute;lida; referencia una expresi&oacute;n sin nombre.

function test() {
   return 25;
}

$bar = &amp;test();    // Inv&aacute;lida.
?&gt;
     </programlisting>
    </informalexample>
   </para>

  </sect1>

  <sect1 id="language.variables.predefined">
   <title>Variables predefinidas</title>
   
   <simpara>
    PHP proporciona una gran cantidad de variables predefinidas a cualquier 
    script que se ejecute. De todas formas, muchas de esas variables no pueden 
    estar completamente documentadas ya que dependen de sobre qu&eacute; servidor se 
    est&eacute; ejecutando, la versi&oacute;n y configuraci&oacute;n de dicho servidor, y otros 
    factores. Algunas de estas variables no estar&aacute;n disponibles cuando se 
    ejecute PHP desde la l&iacute;nea de comandos.
   </simpara>
   <simpara>
    A pesar de estos factores, aqu&iacute; tenemos una lista de variables
    predefinidas disponibles en una instalaci&oacute;n por defecto de PHP 3 
    corriendo como modulo de un <ulink url="&url.apache;">Apache</ulink> 1.3.6
    con su configuraci&oacute;n tambi&eacute;n por defecto.
   </simpara>
   <simpara>
    Para una lista de variables predefinidas (y muchas m&aacute;s informaci&oacute;n &uacute;til), 
    por favor, vea (y use) <function>phpinfo</function>.
   </simpara>

   <note>
    <simpara>
     Esta lista no es exhaustiva ni pretende serlo. Simplemente es una gu&iacute;a de
     qu&eacute; tipo de variables predefinidas se puede esperar tener disponibles en
     un script.
    </simpara>
   </note>

   <sect2 id="language.variables.predefined.apache">
    <title>Variables de Apache</title>

    <simpara>
     Estas variables son creadas por el servidor web <ulink
     url="&url.apache;">Apache</ulink>. Si se est&aacute; utilizando
     otro servidor web, no hay garant&iacute;a de que proporcione las
     mismas variables; pueden faltar algunas, o proporcionar otras no 
     listadas aqu&iacute;. Dicho esto, tambi&eacute;n est&aacute;n presentes las variables de la
     <ulink url="&url.cgispec;">especificaci&oacute;n CGI 1.1</ulink>, por lo que 
     tambi&eacute;n se deben tener en cuenta.
    </simpara>
    <simpara>
     Tenga en cuenta que unas pocas, como mucho, de estas variables van a estar
     disponibles (o simplemente tener sentido) si se ejecuta PHP desde la l&iacute;nea
     de comandos.
    </simpara>

    <para>
     <variablelist>
      <varlistentry>
       <term>GATEWAY_INTERFACE</term>
       <listitem>
	<simpara>
	 Qu&eacute; revisi&oacute;n de la especificaci&oacute;n CGI est&aacute; usando el servidor;
	 por ejemplo 'CGI/1.1'.
	</simpara>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>SERVER_NAME</term>
       <listitem>
	<simpara>
	 El nombre del equipo servidor en el que se est&aacute; ejecutando el
	 script. Si el script se est&aacute; ejecutando en un servidor virtual, este
	 ser&aacute; el valor definido para dicho servidor virtual.
	</simpara>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>SERVER_SOFTWARE</term>
       <listitem>
	<simpara>
	 Una cadena de identificaci&oacute;n del servidor, que aparece en las
	 cabeceras al responderse a las peticiones.
	</simpara>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>SERVER_PROTOCOL</term>
       <listitem>
	<simpara>
	 Nombre y revisi&oacute;n del protocolo a trav&eacute;s del que se solicit&oacute;
	 la p&aacute;gina; p.ej. 'HTTP/1.0';
	</simpara>
       </listitem>
      </varlistentry>
      
      <varlistentry>
       <term>REQUEST_METHOD</term>
       <listitem>
	<simpara>
	 Qu&eacute; m&eacute;todo de petici&oacute;n se us&oacute; para acceder a la p&aacute;gina; p.ej. 'GET',
	 'HEAD', 'POST', 'PUT'.
	</simpara>
       </listitem>
      </varlistentry>
	  
      <varlistentry>
       <term>QUERY_STRING</term>
       <listitem>
	<simpara>
	 La cadena de la petici&oacute;n, si la hubo, mediante la que se accedi&oacute;
	 a la p&aacute;gina.
	</simpara>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>DOCUMENT_ROOT</term>
       <listitem>
	<simpara>
	 El directorio ra&iacute;z del documento bajo el que se ejecuta el script, 
	 tal y como est&aacute; definido en el fichero de configuraci&oacute;n del servidor.
	</simpara>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>HTTP_ACCEPT</term>
       <listitem>
	<simpara>
	 Los contenidos de la cabecera <literal>Accept:</literal> de la
	 petici&oacute;n actual, si hay alguna.
	</simpara>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>HTTP_ACCEPT_CHARSET</term>
       <listitem>
	<simpara>
	 Los contenidos de la cabecera <literal>Accept-Charset:</literal>
	 de la petici&oacute;n actual, si hay alguna. Por ejemplo:
	 'iso-8859-1,*,utf-8'.
	</simpara>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>HTTP_ENCODING</term>
       <listitem>
	<simpara>
	 Los contenidos de la cabecera <literal>Accept-Encoding:</literal>
	 de la petici&oacute;n actual, si la hay. Por ejemplo: 'gzip'.
	</simpara>
       </listitem>
      </varlistentry>
      
      <varlistentry>
       <term>HTTP_ACCEPT_LANGUAGE</term>
       <listitem>
	<simpara>
	 Los contenidos de la cabecera <literal>Accept-Language:</literal>
	 de la petici&oacute;n actual, si hay alguna. Por ejemplo: 'en'.
	</simpara>
       </listitem>
      </varlistentry>
      
      <varlistentry>
       <term>HTTP_CONNECTION</term>
       <listitem>
	<simpara>
	 Los contenidos de la cabecera <literal>Connection:</literal> de
	 la petici&oacute;n actual, si hay alguna. Por ejemplo: 'Keep-Alive'.
	</simpara>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>HTTP_HOST</term>
       <listitem>
	<simpara>
	 Los contenidos de la cabecera <literal>Host:</literal> de la
	 petici&oacute;n actual, si hay alguna.
	</simpara>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>HTTP_REFERER</term>
       <listitem>
	<simpara>
	 La direcci&oacute;n de la p&aacute;gina (si la hay) desde la que el navegador
	 salt&oacute; a la p&aacute;gina actual. Esto lo establece el navegador del usuario; 
	 no todos los navegadores lo hacen.
	</simpara>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>HTTP_USER_AGENT</term>
       <listitem>
	<simpara>
	 Los contenidos de la cabecera <literal>User_Agent:</literal> de
	 la petici&oacute;n actual, si hay alguna. Indica el navegador que se
	 est&aacute; utilizando para ver la p&aacute;gina actual; p.ej. 
	 <computeroutput>Mozilla/4.5 [en] (X11; U; Linux 
	 2.2.9 i586)</computeroutput>. Entre otras cosas, se puede usar
	 este valor con <function>get_browser</function> para adaptar
	 la funcionalidad de la p&aacute;gina a las posibilidades del navegador
	 del usuario.
	</simpara>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>REMOTE_ADDR</term>
       <listitem>
	<simpara>
	 La direcci&oacute;n IP desde la que el usuario est&aacute; viendo la p&aacute;gina 
	 actual.
	</simpara>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>REMOTE_PORT</term>
       <listitem>
	<simpara>
	 El puerto que se est&aacute; utilizando en la m&aacute;quina del usuario para
	 comunicarse con el servidor web.
	</simpara>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>SCRIPT_FILENAME</term>
       <listitem>
	<simpara>
	 La v&iacute;a de acceso absoluta del script que se est&aacute; ejecutando.
	</simpara>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>SERVER_ADMIN</term>
       <listitem>
	<simpara>
	 El valor que se haya dado a la directiva SERVER_ADMIN (en Apache)
	 en el fichero de configuraci&oacute;n del servidor web. Si el script se
	 est&aacute; ejecutando en un servidor virtual, ser&aacute; el valor definido
	 para dicho servidor virtual.
	</simpara>
       </listitem>
      </varlistentry>
      
      <varlistentry>
       <term>SERVER_PORT</term>
       <listitem>
	<simpara>
	 El puerto del equipo servidor que est&aacute; usando el servidor web para
	 la comunicaci&oacute;n. Para configuraciones por defecto, ser&aacute; '80';
	 al usar SSL, por ejemplo, cambiar&aacute; al puerto que se haya definido
	 como seguro para HTTP.
	</simpara>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>SERVER_SIGNATURE</term>
       <listitem>
	<simpara>
	 Una cadena que contiene la versi&oacute;n del servidor y el nombre del 
	 servidor virtual que es a&ntilde;adida a las p&aacute;ginas generadas por el
	 servidor, si est&aacute; caracter&iacute;stica est&aacute; activa.
	</simpara>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>PATH_TRANSLATED</term>
       <listitem>
	<simpara>
	 V&iacute;a de acceso basada en el sistema de ficheros- (no el directorio
	 ra&iacute;z del documento-) del script en cuesti&oacute;n, despu&eacute;s de que el
	 servidor haya hecho la conversi&oacute;n virtual-a-real.
	</simpara>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>SCRIPT_NAME</term>
       <listitem>
	<simpara>
	 Contiene la v&iacute;a de acceso del script actual. Es &uacute;til para p&aacute;ginas
	 que necesitan apuntar a s&iacute; mismas.
	</simpara>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>REQUEST_URI</term>
       <listitem>
	<simpara>
	 La URI que se di&oacute; para acceder a esta p&aacute;gina; por ejemplo, 
	 '/index.html'.
	</simpara>
       </listitem>
      </varlistentry>
     </variablelist>
    </para>

   </sect2>

   <sect2 id="language.variables.predefined.environment">
    <title>Variables de entorno</title>

    <simpara>
     Estas variables se importan en el espacio de nombres global de PHP desde
     el entorno en el que se est&eacute; ejecutando el int&eacute;rprete PHP. Muchas son
     proporcionadas por el int&eacute;rprete de comandos en el que se est&aacute; ejecutando
     PHP, y dado que a sistemas diferentes les gusta ejecutar diferentes tipos
     de int&eacute;rpretes de comandos, es imposible hacer una lista definitiva. Por
     favor, mire la documentaci&oacute;n de su int&eacute;rprete de comandos para ver una
     lista de las variables de entorno definidas.
    </simpara>
    <simpara>
     Otras variables de entorno son las de CGI, que est&aacute;n ah&iacute; sin importar si
     PHP se est&aacute; ejecutando como un m&oacute;dulo del servidor o como un int&eacute;rprete
     CGI.
    </simpara>
	
   </sect2>

   <sect2 id="language.variables.predefined.php">
    <title>Variables de PHP</title>

    <simpara>
     Estas variables son creadas por el propio PHP.
    </simpara>

    <para>
     <variablelist>
      <varlistentry>
       <term>argv</term>
       <listitem>
	<simpara>
	 Array de argumentos pasados al script. Cuando el script se ejecuta
	 desde la l&iacute;nea de comandos, esto da un acceso, al estilo de C, a 
	 los par&aacute;metros pasados en l&iacute;nea de comandos. Cuando se le llama
	 mediante el m&eacute;todo GET, contendr&aacute; la cadena de la petici&oacute;n.
	</simpara>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>argc</term>
       <listitem>
	<simpara>
	 Contiene el n&uacute;mero de par&aacute;metros de la l&iacute;nea de comandos pasados
	 al script (si se ejecuta desde la l&iacute;nea de comandos).
	</simpara>
       </listitem>
      </varlistentry>

      <varlistentry>
       <term>PHP_SELF</term>
       <listitem>
	<simpara>
	 El nombre del fichero que contiene el script que se esta 
	 ejecutando, relativo al directorio ra&iacute;z de los documentos. 
	 Si PHP se est&aacute; ejecutando como int&eacute;rprete de l&iacute;nea de comandos,
	 esta variable no est&aacute; disponible.
	</simpara>
       </listitem>
      </varlistentry>
	  
      <varlistentry>
       <term>HTTP_COOKIE_VARS</term>
       <listitem>
	<simpara>
	 Un array asociativo de variables pasadas al script actual
	 mediante cookies HTTP. S&oacute;lo est&aacute; disponible si el seguimiento de
	 variables ha sido activado mediante la directiva de configuraci&oacute;n 
	 <link linkend="ini.track-vars">track_vars</link> o la directiva 
	 <computeroutput>&lt;?php_track_vars?&gt;</computeroutput>.
	</simpara>
       </listitem>
      </varlistentry>
      
      <varlistentry>
       <term>HTTP_GET_VARS</term>
       <listitem>
	<simpara>
	 Un array asociativo de variables pasadas al script actual mediante
	 el m&eacute;todo HTTP GET. S&oacute;lo est&aacute; disponible si --variable tracking--
	 ha sido activado mediante la directiva de configuraci&oacute;n
	 <link linkend="ini.track-vars">track_vars</link> o la directiva
	 <computeroutput>&lt;?php_track_vars?&gt;</computeroutput>.
	</simpara>
       </listitem>
      </varlistentry>
	 
      <varlistentry>
       <term>HTTP_POST_VARS</term>
       <listitem>
	<simpara>
	 Un array asociativo de variables pasadas al script actual mediante
	 el m&eacute;todo HTTP POST. S&oacute;lo est&aacute; disponible si --variable tracking--
	 ha sido activado mediante la directiva de configuraci&oacute;n
	 <link linkend="ini.track-vars">track_vars</link> o la directiva
	 <computeroutput>&lt;?php_track_vars?&gt;</computeroutput>.
	</simpara>
       </listitem>
      </varlistentry>
     </variablelist>
    </para>
	
   </sect2>

  </sect1>


  <sect1 id="language.variables.scope">
   <title>Ambito de las variables</title>

   <simpara>
    El &aacute;mbito de una variable es el contexto dentro del que la variable est&aacute;
    definida. La mayor parte de las variables PHP s&oacute;lo tienen un &aacute;mbito
    simple. Este &aacute;mbito simple tambi&eacute;n abarca los ficheros incluidos y los
    requeridos. Por ejemplo:
   </simpara>
   <informalexample>
    <programlisting role="php">
$a = 1;
include "b.inc";
    </programlisting>
   </informalexample>
   <simpara>
    Aqu&iacute;, la variable $a dentro del script incluido b.inc.  De todas formas, 
    dentro de las funciones definidas por el usuario aparece un &aacute;mbito local
    a la funci&oacute;n.  Cualquier variables que se use dentro de una funci&oacute;n est&aacute;,
    por defecto, limitada al &aacute;mbito local de la funci&oacute;n.  Por ejemplo:
   </simpara>
    
   <informalexample>
    <programlisting role="php"> 
$a = 1; /* &aacute;mbito global */ 

Function Test () { 
    echo $a; /* referencia a una variable de &aacute;mbito local */ 
} 

Test ();
    </programlisting>
   </informalexample>

   <simpara>
    Este script no producir&aacute; salida, ya que la orden echo utiliza una versi&oacute;n
    local de la variable $a, a la que no se ha asignado ning&uacute;n valor en su
    &aacute;mbito.  Puede que usted note que hay una peque&ntilde;a diferencia con el
    lenguaje C, en el que las variables globales est&aacute;n disponibles
    autom&aacute;ticamente dentro de la funci&oacute;n a menos que sean expresamente
    sobreescritas por una definici&oacute;n local.  Esto puede causar algunos
    problemas, ya que la gente puede cambiar variables globales
    inadvertidamente.  En PHP, las variables globales deben ser declaradas
    globales dentro de la funci&oacute;n si van a ser utilizadas dentro de dicha
    funci&oacute;n. Veamos un ejemplo:</simpara>

   <informalexample>
    <programlisting role="php">
$a = 1;
$b = 2;

Function Sum () {
    global $a, $b;

    $b = $a + $b;
} 

Sum ();
echo $b;
    </programlisting>
   </informalexample>

   <simpara>
    El script anterior producir&aacute; la salida &quot;3&quot;. Al declarar $a y 
    $b globales dentro de la funci&oacute;n, todas las referencias a tales variables
    se referir&aacute;n a la versi&oacute;n global.  No hay l&iacute;mite al n&uacute;mero de variables
    globales que se pueden manipular dentro de una funci&oacute;n.
   </simpara>

   <simpara>
    Un segundo m&eacute;todo para acceder a las variables desde un &aacute;mbito global es
    usando el array $GLOBALS propio de PHP3.  El ejemplo anterior se puede
    reescribir as&iacute;:
   </simpara>

   <informalexample>
    <programlisting role="php">
$a = 1;
$b = 2;

Function Sum () {
    $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
} 

Sum ();
echo $b;
    </programlisting>
   </informalexample>

   <simpara>
    El array $GLOBALS es un array asociativo con el nombre de la
    variable global como clave y los contenidos de dicha variable
    como el valor del elemento del array.
   </simpara>

   <simpara>
    Otra caracter&iacute;stica importante del &aacute;mbito de las variables es la
    variable <emphasis>static</emphasis>.  Una variable est&aacute;tica existe
    s&oacute;lo en el &aacute;mbito local de la funci&oacute;n, pero no pierde su valor
    cuando la ejecuci&oacute;n del programa abandona este &aacute;mbito.  Consideremos
    el siguiente ejemplo:
   </simpara>

   <informalexample>
    <programlisting role="php">
Function Test () {
    $a = 0;
    echo $a;
    $a++;
}
    </programlisting>
   </informalexample>

   <simpara>
    Esta funci&oacute;n tiene poca utilidad ya que cada vez que es llamada 
    asigna a $a el valor 0 y representa un &quot;0&quot;.  La sentencia
    $a++, que incrementa la variable, no sirve para nada, ya que en cuanto la
    funci&oacute;n termina la variable $a desaparece.  Para hacer una funci&oacute;n &uacute;til
    para contar, que no pierda la pista del valor actual del conteo, la
    variable $a debe declararse como est&aacute;tica:</simpara>

   <informalexample>
    <programlisting role="php">
Function Test () {
    static $a = 0;
    echo $a;
    $a++;
}
    </programlisting>
   </informalexample>

   <simpara>
    Ahora, cada vez que se llame a la funci&oacute;n Test(), se representar&aacute; el
    valor de $a y se incrementar&aacute;.
   </simpara>

   <simpara>
    Las variables est&aacute;ticas tambi&eacute;n proporcionan una forma de manejar
    funciones recursivas. Una funci&oacute;n recursiva es la que se llama a s&iacute; misma.
    Se debe tener cuidado al escribir una funci&oacute;n recursiva, ya que puede
    ocurrir que se llame a s&iacute; misma indefinidamente.  Hay que asegurarse
    de implementar una forma adecuada de terminar la recursi&oacute;n.  La siguiente
    funci&oacute;n cuenta recursivamente hasta 10, usando la variable est&aacute;tica 
    $count para saber cu&aacute;ndo parar:
   </simpara>

   <informalexample>
    <programlisting role="php">
Function Test () {
    static $count = 0;

    $count++;
    echo $count;
    if ($count < 10) {
        Test ();
    }
    $count--;
}
    </programlisting>
   </informalexample>

  </sect1>

  <sect1 id="language.variables.variable">
   <title>Variables variables</title>

   <simpara>
    A veces es conveniente tener nombres de variables variables.  
    Dicho de otro modo, son nombres de variables que se pueden establecer
    y usar din&aacute;micamente.  Una variable normal se establece con una
    sentencia como:
   </simpara>

   <informalexample>
    <programlisting role="php">
$a = "hello";
    </programlisting>
   </informalexample>

   <simpara>
    Una variable variable toma el valor de una variable y lo trata como
    el nombre de una variable.  En el ejemplo anterior,
    <emphasis>hello</emphasis>, se puede usar como el nombre de una variable
    utilizando dos signos de d&oacute;lar. p.ej.
   </simpara>

   <informalexample>
    <programlisting role="php">
$$a = "world";
    </programlisting>
   </informalexample>

   <simpara>
    En este momento se han definido y almacenado dos variables en el
    &aacute;rbol de s&iacute;mbolos de PHP: $a, que contiene "hello", y $hello, que
    contiene "world".  Es m&aacute;s, esta sentencia:
   </simpara>

   <informalexample>
    <programlisting role="php">
echo "$a ${$a}";
    </programlisting>
   </informalexample>

   <simpara>
    produce el mismo resultado que:
   </simpara>

   <informalexample>
    <programlisting>
echo "$a $hello";
    </programlisting>
   </informalexample>

   <simpara>
     p.ej. ambas producen el resultado: <emphasis>hello world</emphasis>.
   </simpara>

   <simpara>
    Para usar variables variables con arrays, hay que resolver
    un problema de ambigedad.  Si se escribe $$a[1] el int&eacute;rprete
    necesita saber si nos referimos a utilizar $a[1] como una variable,
    o si se pretend&iacute;a utilizar $$a como variable y el &iacute;ndice [1] como &iacute;ndice
    de dicha variable.  La sintaxis para resolver esta ambiguedad es:
    ${$a[1]} para el primer caso y ${$a}[1] para el segundo.
   </simpara>
  
  </sect1>

  <sect1 id="language.variables.external">
   <title>Variables externas a PHP</title>

   <sect2 id="language.variables.external.form">
    <title>Formularios HTML (GET y POST)</title>

    <simpara>
     Cuando se env&iacute;a un formulario a un script PHP, las variables de
     dicho formulario pasan a estar autom&aacute;ticamente disponibles en el
     script gracias a PHP. Por ejemplo, consideremos el siguiente
     formulario:
    </simpara>

    <para>
     <example>
      <title>Variables de formulario simples</title>
      <programlisting role="php">
&lt;form action="foo.php3" method="post">
    Name: &lt;input type="text" name="name">&lt;br>
    &lt;input type="submit">
&lt;/form>
      </programlisting>
     </example>
    </para>

    <simpara>
     Cuando es enviado, PHP crear&aacute; la variable
     <computeroutput>$name</computeroutput>, que contendr&aacute;
     lo que sea que se introdujo en el campo <emphasis>Name:</emphasis>
     del formulario.
    </simpara>

    <simpara>
     PHP tambi&eacute;n maneja arrays en el contexto de variables de formularios,
     pero s&oacute;lo en una dimensi&oacute;n. Se puede, por ejemplo, agrupar juntas
     variables relacionadas, o usar esta caracter&iacute;stica para recuperar
     valores de un campo select input m&uacute;ltiple:</simpara>

    <para>
     <example>
      <title>Variables de formulario m&aacute;s complejas</title>
      <programlisting role="php">
&lt;form action="array.php" method="post">
    Name: &lt;input type="text" name="personal[name]">&lt;br>
    Email: &lt;input type="text" name="personal[email]">&lt;br>
    Beer: &lt;br>
    &lt;select multiple name="beer[]">
        &lt;option value="warthog">Warthog
        &lt;option value="guinness">Guinness
        &lt;option value="stuttgarter">Stuttgarter Schwabenbr&auml;u
        &lt;/select>
    &lt;input type="submit">
&lt;/form>
      </programlisting>
     </example>
    </para>

    <simpara>
     Si la posibilidad de PHP de track_vars est&aacute; activada, ya sea
     mediante la opci&oacute;n de configuraci&oacute;n <link 
     linkend="ini.track-vars">track_vars</link> o mediante la directiva
     <computeroutput>&lt;?php_track_vars?&gt;</computeroutput>, las
     variables enviadas con los m&eacute;todos POST o GET tambi&eacute;n se encontrar&aacute;n
     en los arrays asociativos globales $HTTP_POST_VARS y $HTTP_GET_VARS.
    </simpara>

    <sect3 id="language.variables.external.form.submit">
     <title>IMAGE SUBMIT variable names</title>

     <simpara>
      Cuando se env&iacute;a un formulario, es posible usar una imagen en vez
      del bot&oacute;n submit est&aacute;ndar con una etiqueta como:</simpara>

     <informalexample>
      <programlisting role="php">
&lt;input type=image src="image.gif" name="sub">
      </programlisting>
     </informalexample>

     <simpara>
      Cuando el usuario hace click en cualquier parte de la imagen, el
      formulario que la acompa&ntilde;a se transmitir&aacute; al servidor con dos
      variables adicionales, sub_x y sub_y. Estas contienen las coordenadas
      del click del usuario dentro de la imagen.  Los m&aacute;s experimentados 
      puede notar que los nombres de variable enviados por el navegador 
      contienen un gui&oacute;n en vez de un subrayado (gui&oacute;n bajo), pero PHP 
      convierte el gui&oacute;n en subrayado autom&aacute;ticamente.
     </simpara>
    </sect3>

   </sect2>

   <sect2 id="language.variables.external.cookies">
    <title>Cookies HTTP</title>

    <simpara>
     PHP soporta cookies de HTTP de forma transparente tal y como est&aacute;n
     definidas en en las <ulink url="&spec.cookies;">Netscape's Spec</ulink>.
     Las cookies son un mecanismo para almacenar datos en el navegador y as&iacute; 
     rastrear o identificar a usuarios que vuelven.  Se pueden crear cookies
     usando la funci&oacute;n <function>SetCookie</function>.  Las cookies son parte
     de la cabecera HTTP, as&iacute; que se debe llamar a la funci&oacute;n SetCookie antes
     de que se env&iacute;e cualquier salida al navegador.  Es la misma restricci&oacute;n
     que para la funci&oacute;n <function>header</function>.  Cualquier cookie que
     se reciba procedente del cliente ser&aacute; convertida autom&aacute;ticamente en
     una variable de PHP como con los datos en los m&eacute;todos  GET y POST.</simpara>

    <simpara>
     Si se quieren asignar m&uacute;ltiples valores a una sola cookie, 
     basta con a&ntilde;adir <emphasis>[]</emphasis> al nombre de la.  
     Por ejemplo:
    </simpara>

    <informalexample>
     <programlisting role="php">
SetCookie ("MyCookie[]", "Testing", time()+3600);
     </programlisting>
    </informalexample>

    <simpara>
     N&oacute;tese que una cookie reemplazar&aacute; a una cookie anterior que tuviese el
     mismo nombre en el navegador a menos que el camino (path) o el
     dominio fuesen diferentes.  As&iacute;, para una aplicaci&oacute;n de carro de la
     compra se podr&iacute;a querer mantener un contador e ir pas&aacute;ndolo. P.ej.
    </simpara>

    <example>
     <title>SetCookie Example</title>
     <programlisting role="php">
$Count++;
SetCookie ("Count", $Count, time()+3600);
SetCookie ("Cart[$Count]", $item, time()+3600);
     </programlisting>
    </example>

   </sect2>

   <sect2 id="language.variables.external.environment">
    <title>Variables de entorno</title>

    <para>
     PHP hace accesibles las variables de entorno autom&aacute;ticamente 
     trat&aacute;ndolas como variables normales.
     
     <informalexample>
      <programlisting role="php">
echo $HOME;  /* Shows the HOME environment variable, if set. */
      </programlisting>
     </informalexample>
    </para>

    <para>
     Dado que la informaci&oacute;n que llega v&iacute;a mecanismos GET, POST y Cookie 
     crean autom&aacute;ticamente variables de PHP, algunas veces es mejor
     leer variables del entorno expl&iacute;citamente para asegurarse
     de que se est&aacute; trabajando con la versi&oacute;n correcta.  La funci&oacute;n
     <function>getenv</function> se puede usar para ello.  Tambi&eacute;n
     se puede asignar un valor a una variable de entorno con la
     funci&oacute;n <function>putenv</function>.
    </para>
   </sect2>

   <sect2 id="language.variables.external.dot-in-names">
    <title>Puntos en los nombres de variables de entrada</title>

    <para>
     T&iacute;picamente, PHP no altera los nombres de las variables cuando se 
     pasan a un script. De todas formas, hay que notar que el punto
     no es un car&aacute;cter v&aacute;lido en el nombre de una variable PHP. 
     Por esta raz&oacute;n, mire esto:
     <programlisting role="php">
$varname.ext;  /* nombre de variable no v&aacute;lido */
     </programlisting>
     Lo que el int&eacute;rprete ve es el nombre de una variable $varname, seguido
     por el operador de concatenaci&oacute;n, y seguido por la prueba
     (es decir, una cadena sin entrecomillar que no coincide con ninguna
     palabra clave o reservada conocida) 'ext'. Obviamente, no se pretend&iacute;a
     que fuese este el resultado.
    </para>

    <para>
     Por esta raz&oacute;n, es importante hacer notar que PHP reemplazar&aacute;
     autom&aacute;ticamente cualquier punto en los nombres de variables de 
     entrada por guiones bajos (subrayados).
    </para>

   </sect2>

   <sect2 id="language.variables.determining-type-of">
    <title>Determinando los tipos de variables</title>

    <para>
     Dado que PHP determina los tipos de las variables y los convierte
     (generalmente) seg&uacute;n necesita, no siempre resulta obvio de qu&eacute; tipo
     es una variable dada en un momento concreto.  PHP incluye varias
     funciones que descubren de qu&eacute; tipo es una variable. Son
     <function>gettype</function>, <function>is_long</function>,
     <function>is_double</function>, <function>is_string</function>,
     <function>is_array</function>, y
     <function>is_object</function>.
    </para>
   </sect2>

  </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:
 -->