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 (819 lines) | stat: -rw-r--r-- 33,692 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
<?xml version="1.0" encoding="utf-8"?>
<chapter id="language.variables">
	<title>변수 (Variables)</title>
	<sect1 id="language.variables.basics">
		<title>기본(Basics)</title>
		<simpara>
    PHP에서 변수는 변수명앞에 달러표시($)를 붙여서 사용한다. 
    또한 변수명에 있어 대소문자도 구분한다. 
   </simpara>
		<para>
    변수명은 PHP내의 다른 라벨명을 정의하는 것과 동일한 규칙을 적용 받는다. 
    유효한 변수명은 문자나 혹은 밑줄(_)로 시작하여야 하고, 
     두번째 문자부터는 문자나 숫자,밑줄 등을 사용할수 있고 길이에는 제한이 없다. 
     정규식으로 표현하자면 다음과 같이 나타낼수 있다. : 
    '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
   </para>
		<note>
			<simpara>
     여기서 문자란 a-z, A-Z 사이의 알파벳과 ASCII 코드 127부터 255까지(0x7f-0xff)를 의미한다 
    </simpara>
		</note>
		<para>
			<informalexample>
				<programlisting role="php"> 
$var = "Bob"; $Var = "Joe"; echo "$var, $Var"; $4site = 'not yet'; // 변수명이 숫자로 시작했으므로 규칙에 위배된다 $_4site = 'not yet'; // 언더스코아로 시작된 변수는 사용할수 있다. $t_e = 'mansikka'; // '_는 ASCII 228번째 문자이므로 유효하다. 
$var = "Bob";
$Var = "Joe";
echo "$var, $Var";      // 결과값은 "Bob, Joe" 

$4site = 'not yet';      // 변수명이 숫자로 시작했으므로 규칙에 위배된다
$_4site = 'not yet';    // 밑줄로 시작된 변수는 사용할수 있다. 
$tae = 'mansikka';    // 'a는 ASCII 228번째 문자이므로 유효하다. 
     </programlisting>
			</informalexample>
		</para>
		<para>
    PHP 3 에서 변수는 항상 값을 가지고 있다. 
    다시말해서, 표현식의 값을 변수에 적용하면 표현식의 결과값이 변수로 복사된다. 
    표현식의 값을 변수에 복사하므로 복사되고 난 후에 발생한 표현식의 변화는 변수에 더이상 영향을 주지 않는다. 
    이에 대한 자세한 설명은 <link linkend="language.expressions">표현식(Expressions)</link>을 참조하기 바란다. 
   </para>
		<para>
    PHP 4 에서는 변수에 값을 대입하는 다른 방법을 제공한다. : 
    <emphasis>참조를 사용한 값 대입 (assign by reference)</emphasis>.
    이는 새로운 변수가 값을 복사하여 가지고 오는 것이 아니라 원래 값이 있는 곳을 단순히 참조하는 방법이다. 
    원래 값이 있는 변수의 별칭이 된다라고 할수도 있고, 원래 변수를 가리킨다고 표현할 수도 있다. 
    새로운 변수값의 변화는 원래 변수의 값에 영향을 주고, 반대로 원래변수의 값이 변하여도 새로운 변수에 영향을 미친다. 
    값을 복사하는 것과는 전혀 다른 개념이라 할수 있다. 
    따라서 크기가 큰 배열이나 객체를 지정할 때나, 반복문을 수행하는데 있어 수행속도가 빨라진다.
   </para>
		<para>
    참조(reference)를 사용한 대입을 하려면, 대입문에서 대입하려는 값을 가지고 있는 
    변수(source 변수)의 앞에 &amp;를 붙여주면 된다.
    예를들어, 다음의 예제 코드는 'My name is Bob'을 두번 출력한다.

    <informalexample>
				<programlisting role="php">
&lt;?php
$foo = 'Bob';              // Assign the value 'Bob' to $foo
$bar = &amp;$foo;          // Reference $foo via $bar.
$bar = "My name is $bar";  // Alter $bar...
echo $foo;                 // $foo is altered too.
echo $bar;
?&gt;
     </programlisting>
			</informalexample>
		</para>
		<para>
    여기서 중요한 한가지는 이름을 가지고 있는 변수만이 참조를 사용한 대입이 가능하다는 것이다.
    즉, 특정한 값에 &amp;를 사용할 수 없다는 것이다.
    <informalexample>
				<programlisting role="php">
&lt;?php
$foo = 25;
$bar = &amp;$foo;      // This is a valid assignment.
$bar = &amp;(24 * 7);  // Invalid; references an unnamed expression.

function test() {
   return 25;
}

$bar = &amp;test();    // Invalid.
?&gt;
     </programlisting>
			</informalexample>
		</para>
	</sect1>
	<sect1 id="language.variables.predefined">
		<title>미리 정의된 변수 (Predefined variables)</title>
		<simpara>
	PHP는 모든 스크립트에 대해 그 스크립트가 실행 될 때 여러개의 미리 정의된 변수를 제공한다. 
	이 변수중 서버의 종류나 버전, 기타 다른 요인으로 인해 달라지는 것도 많은데, 그런 변수는 이곳에 문서화 되지 않았다. 
	또한 이 변수중 다수는 PHP가 command-line으로 동작할 때는 사용할 수 없다.
   </simpara>
		<simpara>
	이런 여러 요인이 있지만 이곳에서는 가장 일반적인 환경인 <ulink url="&url.apache;">Apache</ulink> 1.3.6 에서 
	모듈로 PHP3를 설치한 환경에서의 미리 정의된 변수를 살펴보도록 하자.
   </simpara>
		<simpara>
	여러분이 사용하는 시스템의 모든 미리 정의된 변수를 보려면 <function>phpinfo</function> 함수를 사용하자. 
	(이 함수는 다른 여러 유용한 정보도 알려준다.)
   </simpara>
		<note>
			<simpara>
	여기나온 목록은 완전하지 않다. (완벽할 생각도 없다.) 
	이 목록은 단순히 여러분의 스크립트에서 어떤 종류의 미리 정의된 변수가 사용될 수 있는가의 예시일 뿐이다.
    </simpara>
		</note>
		<sect2 id="language.variables.predefined.apache">
			<title>Apache variables</title>
			<simpara>
	이 변수는 <ulink url="&url.apache;">Apache</ulink> 웹서버로부터 생성된 것이다. 
	만약 여러분이 다른 웹서버를 사용하고 있다면 이와 동일한 변수가 생성된다고 보장할 수 없다. 
	아마도 일부는 없어지고, 여기에 없는 변수가 새로 생길 것이다. 
	여기에 있는 변수중 대부분은 <ulink url="&url.cgispec;">CGI 1.1
     specification</ulink>에서 나온 것이고, 그 내용대로 사용된다.
    </simpara>
			<simpara>
	이곳에 있는 변수중 PHP가 command line으로 동작할 경우 사용될 수 있는 것은 거의 없다.
    </simpara>
			<para>
				<variablelist>
					<varlistentry>
						<term>GATEWAY_INTERFACE</term>
						<listitem>
							<simpara>
		서버가 사용하고 있는 CGI specification의 revision. 예: 'CGI/1.1'. 
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>SERVER_NAME</term>
						<listitem>
							<simpara>
		현재 스크립트가 실행되고 있는 호스트의 이름. 
		만약 스크립트가 가상 호스트에서 실행되고 있다면, 이 값은 가상 호스트의 값이 될 것이다.
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>SERVER_SOFTWARE</term>
						<listitem>
							<simpara>
		요구에 대한 대답의 헤더에 사용할 서버 identification 문자열
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>SERVER_PROTOCOL</term>
						<listitem>
							<simpara>
		페이지가 요구되어질 때 사용한 프로토콜의 이름과 리비젼. 예: 'HTTP/1.0'; 
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>REQUEST_METHOD</term>
						<listitem>
							<simpara>
         페이지가 요구될 때 사용된 method: 예: 'GET', 'HEAD', 'POST', 'PUT'.
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>QUERY_STRING</term>
						<listitem>
							<simpara>
		해당 페이지를 접근할 때 사용된 query string.
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>DOCUMENT_ROOT</term>
						<listitem>
							<simpara>
         현재 스크립트가 샐행중인 document root 디렉토리. 서버의 설정 파일에 정의되어 있다.
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>HTTP_ACCEPT</term>
						<listitem>
							<simpara>
         현재의 요구(request)에 포함된 <literal>Accept:</literal> 헤더의 내용 (존재하는 경우만)
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>HTTP_ACCEPT_CHARSET</term>
						<listitem>
							<simpara>
         현재의 요구(request)에 포함된 <literal>Accept-Charset:</literal> 헤더의 내용 (존재하는 경우만).
         예: 'iso-8859-1,*,utf-8'.
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>HTTP_ENCODING</term>
						<listitem>
							<simpara>
         현재의 요구(request)에 포함된 <literal>Accept-Encoding:</literal> 헤더의 내용 (존재하는 경우만).
         예: 'gzip'.
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>HTTP_ACCEPT_LANGUAGE</term>
						<listitem>
							<simpara>
         현재의 요구(request)에 포함된 <literal>Accept-Language:</literal> 헤더의 내용 (존재하는 경우만).
         예: 'en'.
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>HTTP_CONNECTION</term>
						<listitem>
							<simpara>
         현재의 요구(request)에 포함된 <literal>Connection:</literal> 헤더의 내용 (존재하는 경우만).
         예: 'Keep-Alive'.
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>HTTP_HOST</term>
						<listitem>
							<simpara>
         현재의 요구(request)에 포함된 <literal>Host:</literal> 헤더의 내용 (존재하는 경우만).
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>HTTP_REFERER</term>
						<listitem>
							<simpara>
         현재 페이지를 찾아온 페이지. 현재페이지로 넘어오는 링크가 있고,
         이 링크를 클릭하여 현재 페이지로 넘어온 경우 이전 페이지의 주소가 설정된다.
         이 값은 사용자의 브라우저에 따라 설정될 수도 있고 아닐 수도 있다.
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>HTTP_USER_AGENT</term>
						<listitem>
							<simpara>
         현재의 요구(request)에 포함된 <literal>User_Agent:</literal> 헤더의 내용 (존재하는 경우만).
         현재 페이지를 화면에 표시할 브라우저 소프트웨어의 상징이 되는 문자열이다.
         예:<computeroutput>Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)</computeroutput>
         특히, 이 값을 <function>get_browser</function>함수와 함께 사용하면,
         해당 페이지를 시용자의 브라우저의 능력에 맞춰서 만들어 낼 수도 있다.
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>REMOTE_ADDR</term>
						<listitem>
							<simpara>
         사용자가 현재 페이지를 보고 있는 시스템의 IP 주소 
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>REMOTE_PORT</term>
						<listitem>
							<simpara>
         사용자의 시스템이 웹서버와 통신하고 있는 port 번호
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>SCRIPT_FILENAME</term>
						<listitem>
							<simpara>
         현재 실행되고 있는 스크립트의 절대 경로명
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>SERVER_ADMIN</term>
						<listitem>
							<simpara>
         웹서버 설정 파일에서 SERVER_ADMIN (Apache의 예) 지시자에 설정되어 있는 값.
         만약 스크립트가 가상 호스트 상에서 실행되고 있다면 이 값은 virtual host 설정내에 설정된 값이 된다.
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>SERVER_PORT</term>
						<listitem>
							<simpara>
         웹서버가 사용하는 port 번호. 기본값으로 보통 '80'이 사용되지만, 
         예를들어 SSL을 사용하는 경우 여러분이 지정한 secure HTTP 포트의 값이 사용된다.
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>SERVER_SIGNATURE</term>
						<listitem>
							<simpara>
         server-generated 페이지에 추가되는 서버 버전과 가상 호스트 명. (enabled된 경우만)
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>PATH_TRANSLATED</term>
						<listitem>
							<simpara>
         모든 virtual을 real로의 전환을 마친 후, 현재 페이지의 파일시스템 기준의 경로. 
         (document root 기준이 아니다.)
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>SCRIPT_NAME</term>
						<listitem>
							<simpara>
         현재 스크립트의 경로. 이것은 해당 페이지가 자기 자신을 가리킬 때 사용하면 유용하다.
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>REQUEST_URI</term>
						<listitem>
							<simpara>
         이 페이지를 접근하기 위해 사용한 URI. 예: '/index.html'.
        </simpara>
						</listitem>
					</varlistentry>
				</variablelist>
			</para>
		</sect2>
		<sect2 id="language.variables.predefined.environment">
			<title>환경 변수 (Environment variables)</title>
			<simpara>
     이 변수들은 PHP 파서가 실행되고 있는 환경 변수로 부터 PHP의 전역 변수 영역으로 옮겨진 변수들이다.
     많은 변수는 PHP가 실행되는 쉘에서 제공하고 있고, 그 내용은 시스템과 쉘에 따라 모두 각각 다르기
     때문에 명확한 변수들의 목록을 제시하는 것은 불가능하다.
     어떤 환경 변수들이 정의 되어 있는지 알아보려면 여러분의 쉘에 관한 문서를 살펴 보도록 하라.
    </simpara>
			<simpara>
     CGI 변수를 포함한 다른 환경변수들은 PHP가 CGI로 동작하거나 모듈로 동작하건 간에
     사용할 수 있다.
    </simpara>
		</sect2>
		<sect2 id="language.variables.predefined.php">
			<title>PHP 변수</title>
			<simpara>
     이 변수들은 PHP 자신이 만드는 것이다.

     <varname>$HTTP_*_VARS</varname> 변수들은 
     <link linkend="ini.track-vars">track_vars</link> 설정이
     켜져 있는 경우에만 사용이 가능하다.
    </simpara>
			<note>
				<para>
      PHP 4.0.3에서 <link linkend="ini.track-vars">track_vars</link>는 설정 파일의 설정과 관계없이 항상 켜져 있다.
     </para>
			</note>
			<para>
     만약 <link linkend="ini.register-globals">register_globals</link> 지시자가 설정되어 있으면,
     이 변수들은 스크립트의 전역 영역에서 접근 가능한 변수로 만들어 진다. 
     (<varname>$HTTP_*_VARS</varname> 배열 변수와는 별도로 생성된다.)
     이 설정은 매우 조심해서 사용해야 하고, 가능하면 이 설정은 꺼 두고 
     <varname>$HTTP_*_VARS</varname> 변수를 사용하는 것이 안전하다.
     악의적인 의도를 가진 사용자가 사용자 입력을 사용해서 원래 있는 
     전역 변수의 내용을 덮어 써 버릴 수 있다.
     만약 <link linkend="ini.register-globals">register_globals</link>설정을 끌 수 없는 상황이라면,
     여러분이 해당 변수를 사용하는 각 스텝마다 그 변수가 안전한 것인지를 반드시 확인하는 절차가 있어야 한다.
    </para>
			<para>
				<variablelist>
					<varlistentry>
						<term>argv</term>
						<listitem>
							<simpara>
         스크립트에 전달된 아귀먼트(argument)의 배열. 
         스크립트가 커맨드라인 에서 실행되었다면, 커맨드라인의 파라메터들을
         C 형태로 접근할 수 있게 해 준다. 만약 GET 방식으로 호출된 경우라면,
         이 배열은 쿼리 문자열의 내용을 담고 있다.
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>argc</term>
						<listitem>
							<simpara>
         스크립트로 넘어온 커맨드라인 파라메터의 개수. (커맨드라인 형태로 호출한 경우)
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>PHP_SELF</term>
						<listitem>
							<simpara>
         document root를 기준으로 한 현재 실행중인 스크립트의 파일 이름.
         PHP를 커맨드라인으로 샐행한 경우 이 변수는 사용할 수 없다.
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>HTTP_COOKIE_VARS</term>
						<listitem>
							<simpara>
         현재 스크립트에 HTTP 쿠키를 사용해 전달된 변수의 associative 배열
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>HTTP_GET_VARS</term>
						<listitem>
							<simpara>
         현재 스크립트에 HTTP GET 메소드를 사용해 전달된 변수의 associative 배열
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>HTTP_POST_VARS</term>
						<listitem>
							<simpara>
         현재 스크립트에 HTTP POST 메소드를 사용해 전달된 변수의 associative 배열
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>HTTP_POST_FILES</term>
						<listitem>
							<simpara>
         현재 스크립트에 HTTP POST 메소드를 사용해 업로드된 파일에 대한 정보를 가진 associative 배열
         <varname>$HTTP_POST_FILES</varname> 배열의 내용에 대한 자세한 정보는 
         <link linkend="features.file-upload.post-method">POST method uploads</link> 부분을 살펴보자.
        </simpara>
							<para>
								<varname>$HTTP_POST_FILES</varname> 변수는 4.0.0 이후에서만 유효하다.
        </para>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>HTTP_ENV_VARS</term>
						<listitem>
							<simpara>
         현재 스크립트에 현재 환경 변수에서 전달된 변수의 associative 배열
        </simpara>
						</listitem>
					</varlistentry>
					<varlistentry>
						<term>HTTP_SERVER_VARS</term>
						<listitem>
							<simpara>
         현재 스크립트에 HTTP 서버에서 전달된 변수의 associative 배열
         이 변수들은 위에서 언급한 Apache 변수들과 유사한 내용으로 되어있다.
        </simpara>
						</listitem>
					</varlistentry>
				</variablelist>
			</para>
		</sect2>
	</sect1>
	<sect1 id="language.variables.scope">
		<title>변수 사용 범위 (Variable Scope)</title>
		<simpara>
	변수가 사용가능한 곳은 그 변수가 선언된 곳 안에서 만이다. 
	PHP 변수의 대부분은 한 개의 범위(single scope)만을 가지고 있다. 
	이 범위는 include나 require되어서 읽혀온 파일에도 동일하게 적용된다. 예를들어 :
   </simpara>
		<informalexample>
			<programlisting role="php">
$a = 1;
include "b.inc";
    </programlisting>
		</informalexample>
		<simpara>
	위에서 <varname>$a</varname>변수는 <filename>b.inc</filename> 스크립트에서도 사용할 수 있다.
	기본적으로 함수 안에서 선언된 것은 함수 안에서만 사용되는 지역 변수이다. 
	또한 함수 안에서 사용되는 함수들은 기본적으로 지역 변수라고 가정하고 찾게 된다. 예를 들어:
   </simpara>
		<informalexample>
			<programlisting role="php"> 
$a = 1; /* global scope */ 

Function Test () { 
    echo $a; /* reference to local scope variable */ 
} 

Test ();
    </programlisting>
		</informalexample>
		<simpara>
	이 스크립트는 함수 안의 <varname>$a</varname> 변수를 지역변수로 가정하였고, 
	지역변수 $a에는 아무 값도 대입되지 않았기 때문에 아무런 출력도 나타나지 않는다. 
	이것은 C와는 약간 차이가 나는 부분이다. 
	PHP에서 전역변수를 사용하려면 사용하고 싶은 전역 변수를 함수 안에 global 선언을 해 주어야 한다. 예를 들어 : 
		</simpara>
		<informalexample>
			<programlisting role="php">
$a = 1;
$b = 2;

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

    $b = $a + $b;
} 

Sum ();
echo $b;
    </programlisting>
		</informalexample>
		<simpara>
	위의 스크립트는 &quot;3&quot;을 출력할 것이다. 
	함수 내에서 <varname>$a</varname>와 <varname>$b</varname>를 global로 선언했으므로, 
	이 함수내의 $a, $b는 전역 변수를 참조하게 된다. 
	함수 내에서 다룰 수 있는 전역변수의 개수에는 제한이 없다.
   </simpara>
		<simpara>
	전역 변수를 참조하는 두 번째 방법은 PHP에서 특별히 정의하고 있는 $GLOBALS라는 배열을 사용하는 것이다. 
	위의 예를 다음과 같이 바꿔 쓸 수 있다. : 
   </simpara>
		<informalexample>
			<programlisting role="php">
$a = 1;
$b = 2;

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

Sum ();
echo $b;
    </programlisting>
		</informalexample>
		<simpara>
			<varname>$GLOBALS</varname> 배열은 변수이름이 Key가 되고, 
	그 변수의 내용이 값이 되는 원소를 가진 associative 배열이다.
   </simpara>
		<simpara>
	변수 범위와 관련하여 알아두어야 할 또 다른 내용으로 
     <emphasis>정적</emphasis> 변수(static variable)가 있다다. 
	정적 변수는 지역 함수 내에서만 존재하지만 지역 함수가 종료되어도 
     그 값을 읽어버리지 않고 가지고 있다. 다음 예를 보자 : 
   </simpara>
		<informalexample>
			<programlisting role="php">
Function Test () {
    $a = 0;
    echo $a;
    $a++;
}
    </programlisting>
		</informalexample>
		<simpara>
    이 함수는 이 함수가 호출될 때마다 <varname>$a</varname>를 <literal>0</literal>으로 설정하고
    &quot;0&quot;을 출력한다. 이 함수가 종료되는 시점에서 <varname>$a</varname> 변수가 사라지므로
    증가 연산인 <varname>$a</varname>++는 무의미한 명령이 된다.
    현재의 수를 잃지 않고 계속 세어나가는 카운팅 함수를 만들기 위해서는
    다음과 같이 <varname>$a</varname> 변수를 정적으로 선언해야 한다.
   </simpara>
		<informalexample>
			<programlisting role="php">
Function Test () {
    static $a = 0;
    echo $a;
    $a++;
}
    </programlisting>
		</informalexample>
		<simpara>
    이제 Test() 함수가 호출될 때 마다 <varname>$a</varname>의 값을
    출력하고 그 값을 하나 증가 시킨다.
   </simpara>
		<simpara>
	또한 정적 변수는 다음과 같이 recursion에서 반드시 필요하다. 
	재귀적인 함수는 자기 자신의 함수를 호출하는 것을 말한다. 
	재귀적인 함수를 사용할 때는 무한 루프에 빠질 수 있기 때문에 매우 주의를 요한다. 
	따라서 여러분은 재귀 호출을 끝내는 적절한 방법을 마련해 두어야 한다. 
	다음의 간단한 예제는 10번의 재귀적 호출을 한다. 
	정적 변수 <varname>$count</varname>를 사용하여 중단될 시기를 알 수 있다.
   </simpara>
		<informalexample>
			<programlisting role="php">
Function Test () {
    static $count = 0;

    $count++;
    echo $count;
    if ($count &lt; 10) {
        Test ();
    }
    $count--;
}
    </programlisting>
		</informalexample>
	</sect1>
	<sect1 id="language.variables.variable">
		<title>가변 변수 (Variable variables)</title>
		<simpara>
	가끔 변수의 이름을 변경할 수 있다면 편리하다고 느낄 때가 있다. 
	이제 변수의 이름을 바꾸어 사용하는 방법을 알아보자. 보통의 변수 선언은 다음과 같다.:
   </simpara>
		<informalexample>
			<programlisting role="php">
$a = "hello";
    </programlisting>
		</informalexample>
		<simpara>
	가변 변수은 변수의 값을 가질 수도 있고, 또한 이 값을 변수의 이름으로 다룰 수도 있다. 
	위의 예에서 $$를 사용하면 <emphasis>hello</emphasis>가 변수 이름이 될 수 있다. 예 : 
   </simpara>
		<informalexample>
			<programlisting role="php">
$$a = "world";
    </programlisting>
		</informalexample>
		<simpara>
	이렇게 하면 PHP의 symbol tree에는 "hello"라는 값을 가지는 
     <varname>$a</varname>와 "world"라는 값을 가지는 
	<varname>$hello</varname>의 두 개의 변수가 생기게 된다. 
     그러므로 다음과 같은 문장은 :
   </simpara>
		<informalexample>
			<programlisting role="php">
echo "$a ${$a}";
    </programlisting>
		</informalexample>
		<simpara>
    다음 문장과 똑 같은 출력을 나타내게 된다.:
   </simpara>
		<informalexample>
			<programlisting>
echo "$a $hello";
    </programlisting>
		</informalexample>
		<simpara>
    i.e. 둘의 출력: <computeroutput>hello world</computeroutput>.
   </simpara>
		<simpara>
	가변 변수를 배열과 함께 사용하려면, 한가지 모호성 문제를 해결해야 한다. 
	그것은, 만약 여러분이 <varname>$$a[1]</varname>이라고 썼으면,
	<varname>$a[1]</varname>을 하나의 변수로 볼 것인지, 
	아니면 <varname>$$a</varname>를 변수로 보고 그 변수에 [1]의 인덱스를 해 줄 것인가 하는 문제이다. 
	다음과 같이 하여 모호성을 해결하자. 전자의 경우 <varname>${$a[1]}</varname>라고 쓰고, 
	후자의 경우는 <varname>${$a}[1]</varname>라고 쓰면 된다. 
	( 역자주: 가변 변수를 나타낼 때는 항상 { }로 둘러 싸는 것이 보기 좋고 오류도 없앨 수 있다.)
   </simpara>
	</sect1>
	<sect1 id="language.variables.external">
		<title>PHP 밖에서 온 변수들 (Variables from outside PHP)</title>
		<sect2 id="language.variables.external.form">
			<title>HTML Forms (GET and POST)</title>
			<simpara>
	폼이 PHP 스크립트로 submit되면 폼에 있는 모든 내용들이 자동적으로 만들어진 PHP 변수로 들어온다. 
	만약 <link linkend="ini.track-vars">track_vars</link> 옵션이 on으로 설정되어 있으면,
	이 변수들 모두는 그것이 어디서 만들어진 것이냐에 따라서 <varname>$HTTP_POST_VARS</varname>,
     <varname>$HTTP_GET_VARS</varname>, 
     <varname>$HTTP_POST_FILES</varname>의 associative 배열에 위치하게 된다.
    </simpara>
			<para>
	이 변수에대한 자세한 설명은 <link linkend="language.variables.predefined">미리 정의된 변수 
	(Predefined variables)</link>을 읽어보기 바란다.
    </para>
			<para>
				<example>
					<title>Simple form variable</title>
					<programlisting role="php">
&lt;form action="foo.php" method="post">
    Name: &lt;input type="text" name="username">&lt;br>
    &lt;input type="submit">
&lt;/form>
      </programlisting>
				</example>
			</para>
			<para>
     위의 폼이 전송될 때, text input의 내용은 <varname>$HTTP_POST_VARS['username']</varname>에 있다.  
     만약 <link linkend="ini.register-globals">register_globals</link> 지시자가 켜져 있으면, 
     스크립트의 전역 영역에서 <varname>$username</varname>이라는 변수에도 이 값이 저장된다.
    </para>
			<simpara>
     PHP는 폼 변수에 배열을 사용할 수도 있다.
     예를들어, 내용적으로 묶을 수 있는 변수들을 하나의 배열로 묶을 수 있고,
     이 기능을 select 문에 사용하여 다중 선택을 구현할 수 있다.
    </simpara>
			<para>
				<example>
					<title>More complex form variables</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>
			<para>
     PHP3에서 폼 배열에 사용되는 배열은 일차원 배열로 제한되었지만,
     PHP4에서는 이 제한이 없어졌다.
    </para>
			<sect3 id="language.variables.external.form.submit">
				<title>IMAGE SUBMIT의 변수 이름</title>
				<simpara>
	폼은 submit할 때 일반적으로 사용하는 submit 버튼 대신 다음과 같이 그림을 사용할 수도 있다. :
				</simpara>
				<informalexample>
					<programlisting role="php">
&lt;input type=image src="image.gif" name="sub">
      </programlisting>
				</informalexample>
				<simpara>
	사용자가 image를 클릭하면, 폼은 sub_x와 sub_y의 두 개의 변수가 추가되어 서버에 전송된다. 
	이 두 변수는 이미지에서 사용자가 click한 위치 정보를 담고 있다. 
	일부 브라우저에서는 밑줄(_)대신 마침표(.)를 사용하는 경우도 있는데, 
	PHP는 이런 경우 자동적을 마침표(.)를 밑줄(_)로 바꿔준다.
     </simpara>
			</sect3>
		</sect2>
		<sect2 id="language.variables.external.cookies">
			<title>HTTP Cookies</title>
			<simpara>
	PHP는 HTTP 쿠키를 <ulink url="&spec.cookies;">Netscape's Spec</ulink>의 정의에 따라 제공한다. 
	Cookie 메카니즘은 트래킹이나 사용자 식별 등을 위해 원격 browser에 저장된 데이터를 돌려 받는 과정을 말한다. 
	여러분은 cookie를 설정하기 위해 <function>SetCookie</function>함수를 사용할 수 있다. 
	Cookie는 HTTP 헤더의 한 부분이므로, <function>SetCookie</function> 
	함수는 브라우저로 보내는 어떤 데이터보다도 앞에 사용해야 한다. 
	이 제약은 <function>header</function> 함수와 같은 제약으로 보면 된다. 
	보낸 모든 cookie는 자동적으로 GET이나 POST 방식 데이터와 같은 PHP 변수로 변환된다. 
			</simpara>
			<simpara>
	만약 여러분이 동일한 cookie에 여러 값을 저장하고 싶다면 Cookie이름에 
	<emphasis>[]</emphasis>를 더하면 된다. 예를 들어 : 
    </simpara>
			<informalexample>
				<programlisting role="php">
SetCookie ("MyCookie[]", "Testing", time()+3600);
     </programlisting>
			</informalexample>
			<simpara>
	쿠키는 새로 설정하면 path나 도메인이 다르지 않는 한 이전의 쿠키를 덮어쓰게 된다. 
	그러므로 쇼핑 카트 같은 응용 프로그램에서는 다음과 같이 카운터를 사용하여, 
	이것을 기준으로 Cookie를 사용하는 것이 좋다. 예 : 
    </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>환경 변수 (Environment variables)</title>
			<para>

     PHP는 자동적으로 환경 변수들을 일반적인 PHP 변수로 만든다. 

     <informalexample>
					<programlisting role="php">
echo $HOME;  /* Shows the HOME environment variable, if set. */
      </programlisting>
				</informalexample>
			</para>
			<para>
	GET, POST, Cookie 메카니즘을 통해서 들어 온 정보로부터도 PHP 변수가 생기므로, 
	때때로 환경변수로부터 받은것이 확실한가를 확인할 필요가 있을 때도 있다.
	이를 위해 <function>getenv</function> 함수를 사용한다. 
	환경 변수를 설정하기 위해서는 <function>putenv</function> 함수를 사용한다.
    </para>
		</sect2>
		<sect2 id="language.variables.external.dot-in-names">
			<title>외부 변수명에 있는 '.' (Dots in incoming variable names)</title>
			<para>
	일반적으로 PHP는 변수를 스크립트로 가져올 때 변수명을 바꾸지 않는다. 
	그러나, PHP의 변수명에는 '.' (점)을 사용할 수 없다. 다음과 같은 경우를 보자. :
     <programlisting role="php">
$varname.ext;  /* invalid variable name */
     </programlisting>
	위의 경우 PHP 파서는 <varname>$varname</varname>이라는 변수와, 
	연결 연산자, 'ext'(따옴표가 없는 경우 그것이 어떤 알려진 키나 예약어가 아니면 문자열로 취급된다.)로 해석한다. 
	이것은 우리가 원하는 결과가 아니다.
    </para>
			<para>
	위와 같은 이유로 PHP는 외부에서 불러들인 변수의 이름에 '.'이 있으면 '_'(밑줄)로 바꾸어 읽어들인다.
    </para>
		</sect2>
		<sect2 id="language.variables.determining-type-of">
			<title>변수의 Type 판단 (Determining variable types)</title>
			<para>
	PHP는 변수의 type을 알아서 정하고 (일반적으로) 필요한 경우에는 그 type을 바꾸므로, 
	특정 시점에 그 변수 어떤 type인지는 쉽게 알 수 없다. 
	PHP는 변수의 type을 알아보기 위해 여러개의 함수를 가지고 있다. 
	<function>gettype</function>, <function>is_long</function>,
     <function>is_double</function>, <function>is_string</function>,
     <function>is_array</function>, <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:
-->