| 12
 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
 
 | <?xml version="1.0" encoding="utf-8"?>
<chapter id="language.types">
	<title>변수 형태 (Types)</title>
	<para>
	PHP는 다음과 같은 변수형을 지원한다. : 
   <itemizedlist>
			<listitem>
				<simpara>
					<link linkend="language.types.array">배열(array)</link>
				</simpara>
			</listitem>
			<listitem>
				<simpara>
					<link linkend="language.types.float">실수형(floating-point numbers)</link>
				</simpara>
			</listitem>
			<listitem>
				<simpara>
					<link linkend="language.types.integer">정수형(integer)</link>
				</simpara>
			</listitem>
			<listitem>
				<simpara>
					<link linkend="language.types.object">객체(object)</link>
				</simpara>
			</listitem>
			<listitem>
				<simpara>
					<link linkend="language.types.string">문자열(string)</link>
				</simpara>
			</listitem>
		</itemizedlist>
	</para>
	<simpara>
	변수타입은 보통 프로그래머가 설정해 줄 필요가 없다. 
	대신 PHP가 실행중에 변수 값의 내용에 따라 자동으로 바꿔가며 설정한다.
  </simpara>
	<simpara>
	만약 여러분이 어떤 변수를 특정한 변수 타입으로 지정하고 싶다면
	해당 변수를 <link linkend="language.types.typecasting">cast</link> 하거나, 
	<function>settype</function> 함수를 사용한다.
  </simpara>
	<simpara>
	종종 변수들은 실행시 어떤 타입으로 되어 있느냐에 따라 특정한 상황에서 원하는 대로 동작하지 않을 때가 있다. 
	<link linkend="language.types.type-juggling">Type Juggling</link> 편을 보면 자세히 알 수 있다.
  </simpara>
	<sect1 id="language.types.integer">
		<title>정수형 (Integers)</title>
		<para>
    정수형은 다음과 같은 형태의 명령으로 지정할 수 있다.
    <informalexample>
				<programlisting role="php">
$a = 1234; # 십진수
$a = -123; # 음수
$a = 0123; # 8진수 (십진수 83과 같음)
$a = 0x12; # 16진수 (십진수 18과 같음)
     </programlisting>
			</informalexample>
	정수의 크기는 실행환경에 따라 다르다(platform-dependent).
	보통 최대값이 약 20억(32 bits signed)인 경우가 많다.
   </para>
	</sect1>
	<sect1 id="language.types.float">
		<title>실수형 (Floating point numbers)</title>
		<para>
	실수형("doubles")은 다음과 같은 형태의 문장으로 지정할 수 있다.
    <informalexample>
				<programlisting role="php"> 
$a = 1.234; $a = 1.2e3;
     </programlisting>
			</informalexample>
	정수의 크기는 실행환경에따라 다르다.(platform-dependent) 
	보통 최대값이 약 ~1.8e308에 14자리의 정밀도(64 bit IEEE format)인 경우가 많다.
   </para>
		<warning id="warn.float-precision">
			<para>
     여기서 <literal>0.1</literal> 이나 <literal>0.7</literal>같은 단순한 소수값이 
     PHP 내부에 저장될 때 아주 약간의 그 값에 오차가 생길 수 있다는 것을 알아야 한다.
     문제는 그 작은 오차로 인해 다음의 예와 같은 명백히 잘못된 결과가 나올 수도 있다는 점이다. :
     <literal>floor((0.1+0.7)*10)</literal>의 식은 일반적인 실행 환경에서는 <literal>8</literal>이 아닌 
     <literal>7</literal>을 반환한다. 함수의 괄호안에 있는 값이 <literal>7.9999999999...</literal>가 되기 때문이다.
    </para>
			<para>
     이는 유한한 십진수로 분수를 정확하게 표현하기 불가는 하다는 것과 일맥상통한다.
     예를 들자면 분수 <literal>1/3</literal> 을 십진수로 표현하자면 <literal>0.3333333. . .</literal>이 된다.
    </para>
			<para>     
     따라서 실수 결과값에 대해서는 마지막 자리의 값을 믿지 말도록 하고, 
     실수끼리는 = 등의 '같다' 비교를 하지 않도록 하자. 
     만약 여러분이 좀더 높은 정밀도를 필요로 한다면 
     <link linkend="ref.bc">arbitrary precision math functions</link> 이나 
     <link linkend="ref.gmp">gmp</link>에 있는 함수들을 사용하기 바란다.
    </para>
		</warning>
	</sect1>
	<sect1 id="language.types.string">
		<title>문자열 (Strings)</title>
		<para>
    문자열은 두 개의 delimiters를 사용해 나타낸다.
   </para>
		<para>
	문자열을 큰 따옴표(")로 둘러 싸게 되며, 특수 문자들은 다음과 같이 표시하여 포함시킨다.
	C나 Perl에서처럼 백슬래시(\)를 사용하여 특수 기호를 표시하게 된다.
    <table>
				<title>Escaped characters</title>
				<tgroup cols="2">
					<thead>
						<row>
							<entry>sequence</entry>
							<entry>meaning</entry>
						</row>
					</thead>
					<tbody>
						<row>
							<entry>
								<literal>\n</literal>
							</entry>
							<entry>linefeed (LF or 0x0A in ASCII)</entry>
						</row>
						<row>
							<entry>
								<literal>\r</literal>
							</entry>
							<entry>carriage return (CR or 0x0D in ASCII)</entry>
						</row>
						<row>
							<entry>
								<literal>\t</literal>
							</entry>
							<entry>horizontal tab (HT or 0x09 in ASCII)</entry>
						</row>
						<row>
							<entry>
								<literal>\\</literal>
							</entry>
							<entry>backslash</entry>
						</row>
						<row>
							<entry>
								<literal>\$</literal>
							</entry>
							<entry>dollar sign</entry>
						</row>
						<row>
							<entry>
								<literal>\"</literal>
							</entry>
							<entry>double-quote</entry>
						</row>
						<row>
							<entry>
								<literal>\[0-7]{1,3}</literal>
							</entry>
							<entry>
         the sequence of characters matching the regular
         expression is a character in octal notation
        </entry>
						</row>
						<row>
							<entry>
								<literal>\x[0-9A-Fa-f]{1,2}</literal>
							</entry>
							<entry>
         the sequence of characters matching the regular
         expression is a character in hexadecimal notation
        </entry>
						</row>
					</tbody>
				</tgroup>
			</table>
		</para>
		<para>
	위에 나온 것 외의 다른 문자도 escape를 할 수 있지만, warning이 발생하게 된다.
   </para>
		<para>
	문자열을 표현하는 또 다른 방법은 큰 따옴표(") 대신 작은 따옴표(')를 사용하는 것이다. 
	이것은 \\과 \'의 두 개만을 백슬래시 처리하고 나머지는 그냥 둔다. 
	작은 따옴표를 사용하는 경우에는 변수를 문자열 안에 두어 
	그 변수의 내용을 문자열에 삽입하는 기능을 사용할 수 <emphasis>없다</emphasis>.
   </para>
		<simpara>
	문자열을 선언하는 다른 방법은  here doc 구문("<<<")을 사용하는 것이다. 
	<literal><<<</literal> 뒤에 적당한 identifier를 적어주고, 원하는 문자열의 내용을 적은 후에, 
	앞에 적은 identifier로 문자열을 끝맷으면 된다. 
	끝맷는 identifier는 <emphasis>반드시</emphasis> 해당 라인의 첫번째 칸에서 시작해야 한다.
	해당 레이블의 이름은 PHP의 다른 레이블과 동일한 방식으로 지으면 된다. 
	영문자와 숫자, 밑줄(_)만을 사용하여야 하고, 첫글자로 숫자는 안된다.
   </simpara>
		<para>
	Here doc 문자열은 닫는 큰따옴표를 사용하지 않고 여는 큰따옴표로만 묶인 문자열과 동일하게 취급된다.
	이것은 Here doc 문자열내에서는 큰따옴표를 escape 할 필요가 없고,
	위에 적힌 다른 escape 코드는 사용할 수 있다는 것을 의미한다.
	문자열내에 변수를 사용하여 그 변수의 내용을 문자열에 삽입하는 기능을 사용할 수 있지만,
	변수가 들어가는 식이 복잡할 경우 주의해서 사용하자.
    <example>
				<title>doc string 예제</title>
				<programlisting>
<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;
/* 변수도 사용된 좀더 복잡한 예제. */
class foo {
    var $foo;
    var $bar;
    function foo() {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}
$foo = new foo();
$name = 'MyName';
echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
?>
     </programlisting>
			</example>
		</para>
		<note>
			<para>
     Here doc은 PHP 4에서부터 지원된다
    </para>
		</note>
		<para>
	문자열은 '.' (점) 연산자로 연결할 수 있다. 
	'+' (더하기) 연산자는 사용할 수 없다. 
	자세한 정보는 <link linkend="language.operators.string">문자열 연산자(String operators)</link> 부분을 참조하기 바란다.
   </para>
		<para>
	문자열내의 개개의 문자는, C 언어에서의 문자의 배열로된 문자열처럼 
	배열에 숫자 인덱스를 통해 접근이 가능하다. 아래 그 예가 있다.
   </para>
		<para>
			<example>
				<title>문자열 예제</title>
				<programlisting role="php">
<?php
/* 문자열을 대입한다. */
$str = "This is a string";
/* 문자열 추가. */
$str = $str . " with some more text";
/* newline까지 포함해서 문자열 추가하는 다른방법. */
$str .= " and a newline at the end.\n";
/* This string will end up being '<p>Number: 9</p>' */
$num = 9;
$str = "<p>Number: $num</p>";
/* '<p>Number: $num</p>' 자체가 문자열이 된다 */
$num = 9;
$str = '<p>Number: $num</p>';
/* 문자열의 첫번째 문자 얻기  */
$str = 'This is a test.';
$first = $str[0];
/* 문자열의 마지막 문자 얻기. */
$str = 'This is still a test.';
$last = $str[strlen($str)-1];
?>	  
     </programlisting>
			</example>
		</para>
		<sect2 id="language.types.string.conversion">
			<title>문자열 변환 (String conversion)</title>
			<simpara>
	문자열이 숫자값로 다루어질 때, 결과 값과 type은 다음과 같이 결정된다.
    </simpara>
			<simpara>
	만약 문자열 안에 '.' 이나 'e', 'E'의 문자가 있을 경우 
	그 type은 double이 된다. 그렇지 않다면 정수 값이다 
    </simpara>
			<para>
	해당하는 값은 문자열의 처음에서 시작해서 가능한 부분까지만 사용된다. 
	문자열이 올바른 숫자 데이터로 시작하지 않으면 그 값은 0이다. 
	올바른 숫자 데이터는 '+'/'-', '0'-'9','.'과 숫자 뒤의 'e'나 'E' 표시이다
    </para>
			<simpara>
	첫 번째 표현식이 string인 경우, 변수의 type은 첫 번째가 아닌 두 번째 표현식에 의해 결정된다.
    </simpara>
			<informalexample>
				<programlisting role="php">
$foo = 1 + "10.5";              // $foo 는 double형 (11.5)
$foo = 1 + "-1.3e3";            // $foo 는 double형 (-1299)
$foo = 1 + "bob-1.3e3";         // $foo 는 정수형 (1)
$foo = 1 + "bob3";              // $foo 는 정수형 (1)
$foo = 1 + "10 Small Pigs";     // $foo 는 정수형 (11)
$foo = 1 + "10 Little Piggies"; // $foo 는 정수형 (11)
$foo = "10.0 pigs " + 1;        // $foo 는 정수형 (11)
$foo = "10.0 pigs " + 1.0;      // $foo 는 double형 (11)     
     </programlisting>
			</informalexample>
			<simpara>
	이 변환에 대한 자세한 설명은Unix manual page의 strtod(3)을 보아라. 
    </simpara>
			<para>
	만약 여러분이 위의 예제를 실제 실험하고자 한다면, 위의 예제를 잘라 붙인 후에, 
	어떤 일이 일어났는 가를 알기 위해 아래의 줄을 삽입한다.
     <informalexample>
					<programlisting role="php">
echo "\$foo==$foo; type is " . gettype ($foo) . "<br>\n";
      </programlisting>
				</informalexample>
			</para>
		</sect2>
	</sect1>
	<sect1 id="language.types.array">
		<title>배열(Arrays)</title>
		<para>
	배열을 실제로 hash tables (associative arrays) 과 indexed arrays (vectors)의 두가지로 동시에 사용된다.
   </para>
		<sect2 id="language.types.array.single-dim">
			<title>일차원 배열 (Single Dimension Arrays)</title>
			<para>
	PHP는 scalar 배열과 associative 배열의 두 가지를 지원한다. 
	사실 두 가지의 차이는 없다. 여러분은 <function>list</function> 나<function>array</function>
	함수를 사용하여 배열을 만들거나, 각 원소의 값을 정해 주어 배열을 만들 수 있다. 
     <informalexample>
					<programlisting role="php"> 
$a[0] = "abc"; 
$a[1] = "def"; 
$b["foo"] = 13;
      </programlisting>
				</informalexample>
			</para>
			<para>
	또한 다음과 같이 변수에 값을 더해주는 것만으로 배열을 만들 수도 있다.
	배열 변수에 빈 대괄호([])를 붙이고 값을 지정하면,
	해당 배열의 맨뒤에 한 원소가 추가되고 그 값이 이 추가된 원소에 저장된다.
     <informalexample>
					<programlisting role="php"> 
$a[] = "hello"; // $a[2] == "hello"
$a[] = "world"; // $a[3] == "world" 
      </programlisting>
				</informalexample>
			</para>
			<para>
	배열은 정렬을 원하는 형식에 따라 <function>asort</function>,
     <function>arsort</function>, <function>ksort</function>,
     <function>rsort</function>, <function>sort</function>,
     <function>uasort</function>, <function>usort</function>, 
     <function>uksort</function> 함수들을 이용해 순서대로 정렬할 수 있다. 
    </para>
			<para>
				<function>count</function> 함수를 사용하면 배열의 원소 개수를 셀 수 있다. 
    </para>
			<para>
				<function>next</function>와 <function>prev</function>함수를 이용하여 배열의 내용을 탐색할 수 있다. 
	배열의 내용을 탐색하는 방법으로 <function>each</function>함수를 사용할 수도 있다.
    </para>
		</sect2>
		<sect2 id="language.types.array.multi-dim">
			<title>다차원 배열 (Multi-Dimensional Arrays)</title>
			<para>
	다차원 배열도 실제로 매우 간단한다. 배열의 각 차원에 대하여 단지 [key]값을 뒤에 붙여주면 된다.:
     <informalexample>
					<programlisting role="php"> 
$a[1]      = $f;               # 일차원 배열의 예제
$a["foo"]  = $f;   
$a[1][0]     = $f;             # 이차원 배열의 예제
$a["foo"][2] = $f;             # (배열 지시자를 숫자와 문자로 혼합할수 있다)
$a[3]["bar"] = $f;             # (배열 지시자를 숫자와 문자로 혼합할수 있다)
$a["foo"][4]["bar"][0] = $f;   # 4차원배열!
      </programlisting>
				</informalexample>
			</para>
			<para>
	PHP3에서, 문자열 내에서 다차원 배열의 값을 직접 접근하는 것은 불가능하다. 
	예를들어 다음과 같은 문장은 원하는 결과를 얻지 못할 것이다.:
     <informalexample>
					<programlisting role="php"> 
$a[3]['bar'] = 'Bob';
echo "This won't work: $a[3][bar]";
      </programlisting>
				</informalexample>
	PHP3에서 위의 출력은 <computeroutput>This won't work: Array[bar]</computeroutput> 일 것이다. 
	원하는 결과를 얻으려면 문자열 연결 연산자(.)를 사용하여야 할 것이다. :
     <informalexample>
					<programlisting role="php">
$a[3]['bar'] = 'Bob';
echo "This will work: " . $a[3][bar];
      </programlisting>
				</informalexample>
			</para>
			<para>
	PHP4에서는 접근하려는 배열식을 중괄호({})로 둘러쌈으로써 이것이 가능하다.:
     <informalexample>
					<programlisting role="php">
$a[3]['bar'] = 'Bob';
echo "This will work: {$a[3][bar]}";
      </programlisting>
				</informalexample>
			</para>
			<para>
	여러 가지 방법으로 이 다차원 배열에 값을 넣을 수 있으나, 
	associative 배열에 값을 저장하는 간단한 방법으로 <function>array</function> 명령을 사용하는 방법이 있다. 
	우선 다음의 두가지 코드는 일차원 배열에 값을 저장하는 방법으로 결과는 동일하다.:
     <informalexample>
					<programlisting role="php"> 
# Example 1:
$a["color"]	= "red";
$a["taste"]	= "sweet";
$a["shape"]	= "round";
$a["name"]	= "apple";
$a[3]		= 4;
# Example 2:
$a = array(
     "color" => "red",
     "taste" => "sweet",
     "shape" => "round",
     "name"  => "apple",
     3       => 4
);
      </programlisting>
				</informalexample>
			</para>
			<para>
				<function>array</function> 함수는 다차원 배열에 대해서도 다음과 같이 사용할 수 있다. :
     <informalexample>
					<programlisting role="php"> 
<?php
$a = array(
     "apple"  => array(
          "color"  => "red",
          "taste"  => "sweet",
          "shape"  => "round"
     ),
     "orange"  => array(
          "color"  => "orange",
          "taste"  => "tart",
          "shape"  => "round"
     ),
     "banana"  => array(
          "color"  => "yellow",
          "taste"  => "paste-y",
          "shape"  => "banana-shaped"
     )
);
echo $a["apple"]["taste"];    # will output "sweet"
?>
      </programlisting>
				</informalexample>
			</para>
		</sect2>
	</sect1>
	<sect1 id="language.types.object">
		<title>객체 (Objects)</title>
		<sect2 id="language.types.object.init">
			<title>객체 초기화 (Object Initialization)</title>
			<para>
	객체(Object)를 초기화하는 방법은 <literal>new</literal> 명령을 사용하여 object를 변수에 인스턴스 시키는 것이다. 
     <informalexample>
					<programlisting role="php">
<?php
class foo {
    function do_foo() { 
        echo "Doing foo."; 
    }
}
$bar = new foo;
$bar->do_foo();
?>
      </programlisting>
				</informalexample>
			</para>
			<simpara>
	자세한 논의는 <link linkend="language.oop">클래스와 객체(Classes and Objects)</link> 절을 읽어보기 바란다.
    </simpara>
		</sect2>
	</sect1>
	<sect1 id="language.types.type-juggling">
		<title>뱐수형 다루기 (Type juggling)</title>
		<simpara>
    PHP에서는 변수형을 명확하게 선언할 필요도 없고, 변수형 선언이
    제공되지도 않는다. 변수의 type은 구문내에서 사용되어질때 결정된다.
    다시말해 변수<parameter>var</parameter>에 문자열을 대입하면, 변수
    <parameter>var</parameter> 의 형은 문자열이 되고, 변수
    <parameter>var</parameter>에 정수값을 대입하면 정수형 변수가 된다
</simpara>
		<para>   PHP의 자동형변환에 대한 예는 '+'연산자에 대한 역활을 보면 알수 있다.
   '+'연산자가 사용된 연산 중에 하나의 피연산자가 double형이라면 다른 피연산자들도
   double형으로 계산되어 결과는 double형이 된다. 마찬가지로 하나의 피연산자가 
   정수형이라면 그 결과도 정수형이 된다. 여기서 주의해야 할 것은 어떤 피연자에 의해
   다른 피연산자의 형이 바뀌는 것이 아니라, 단지 그 결과값의 형을 결정하는 데에만 영향을 미친다는 것이다.
    <informalexample>
				<programlisting role="php">
$foo = "0";  // $foo 는 문자열 변수 (ASCII 48)
$foo++;      // $foo 는 문자열 변수 "1" (ASCII 49)
$foo += 1;   // $foo 는 정수형 변수로 변환되었다. (2)
$foo = $foo + 1.3;  // $foo 는 double형 변수로 변환되었다. (3.3)
$foo = 5 + "10 Little Piggies"; // $foo 는 정수형 변수 (15)
$foo = 5 + "10 Small Pigs";     // $foo 는 정수형 변수 (15)
     </programlisting>
			</informalexample>
		</para>
		<simpara>    위의 예들 중 마지막 두 예가 이해가 되지 않는다면 
<link linkend="language.types.string.conversion">문자열 변환(String
    conversion)</link>을 참조하기 바란다.
   </simpara>
		<simpara>    변수를 특정한 형(type)으로 취급되도록 하고자 할 경우
<link linkend="language.types.typecasting">Type
    casting</link>을 참조하고, 변수의 형을 변환시키려고 한다면
    <function>settype</function>을 참조하기 바란다.
   </simpara>
		<para>
    만약 위의 예제를 실제 실험하고자 한다면, 
    위의 예제를 잘라 붙인 후에, 어떤 일이 일어났는 가를 알기 위해 
    아래의 문장을 삽입하여 살펴볼 수 있다.
    <informalexample>
				<programlisting role="php">
echo "\$foo==$foo; type is " . gettype ($foo) . "<br>\n";
     </programlisting>
			</informalexample>
		</para>
		<note>
			<para>
     배열로의 자동 형변환은 일반적으로 정의되어 있지 않다.
     <informalexample>
					<programlisting role="php">
$a = 1;       // $a 는 정수형이다
$a[0] = "f";  // $a 는 $a[0]가 "f"의 값을 가진 배열이다.      </programlisting>
				</informalexample>
			</para>
			<para>
     위의 예는 $a가 첫번째 요소로 'f'를 가지는 배열로 형변환 되는게 명확하게 보이지만,
     아래의 경우를 생각해 보자
     <informalexample>
					<programlisting role="php">
$a = "1";     // $a는 문자열이다
$a[0] = "f";  // 첨자 0이 문자열에 대한 오프셋(offset)인가? 여기서는 어떤일이 일어날 것인가?
      </programlisting>
				</informalexample>
			</para>
			<para>
     PHP에서는 배열의 인덱스(index)와 동일한 형태를 사용하여, 
     문자열 변수에 오프셋(offset)을 이용한 인덱스(index)를 사용할 수 있다. 
     따라서 위의 예는 다음과 같은 문제를 안고 있다.:
     $a가 첫번째 요소가 "f"인 배열인가?
     "f"가 문자열 변수 $a의 첫번째 문자가 되어야 하는가?
    </para>
			<para>
     이러한 이유로, PHP 3.0.12 와 PHP 4.0b3-RC4에서 위와 같은 경우의 
     자동 형 변환은 정의되어 있지 않다고 한다. 이에 대한 정확한 정의는 논의 되어 질것이다.
    </para>
		</note>
		<sect2 id="language.types.typecasting">
			<title>변수형 적용(Type Casting)</title>
			<para>
     PHP에서 변수형 적용(type casting)은 C language에서와 매우 유사하다.
     원하는 타입을 적용(casting)되어지는 변수앞에 괄호로 묶어서 써 주기만 하면 된다.
     <informalexample>
					<programlisting role="php">
$foo = 10;   // $foo는 정수형이다.
$bar = (double) $foo;   // $bar는 type casting으로 double형이다
      </programlisting>
				</informalexample>
			</para>
			<para>
     아래와 같은 경우를 적용할 수 있다:
     <itemizedlist>
					<listitem>
						<simpara>(int), (integer) - 정수로 cast</simpara>
					</listitem>
					<listitem>
						<simpara>(real), (double), (float) - double형으로 cast</simpara>
					</listitem>
					<listitem>
						<simpara>(string) - 문자열로 cast</simpara>
					</listitem>
					<listitem>
						<simpara>(array) - 배열로 cast</simpara>
					</listitem>
					<listitem>
						<simpara>(object) - 객체(object)로 cast</simpara>
					</listitem>
				</itemizedlist>
			</para>
			<para>
     괄호안에 tab이나 공백문자는 허용되므로 아래의 두 문장은 같이 취급된다.
     <informalexample>
					<programlisting role="php">
$foo = (int) $bar;
$foo = ( int ) $bar;
      </programlisting>
				</informalexample>
			</para>
			<para>
     특정한 타입으로 casting될때의 결과는 명확하지 않다.
     예를 들어 다음과 같은 경우 주의를 요한다.
    </para>
			<para>
     스칼라(scalar)변수나 문자열 변수가 배열로 casting될때 그 변수는
     배열의 첫번째 요소가 된다.
     <informalexample>
					<programlisting role="php">
$var = 'ciao';
$arr = (array) $var;
echo $arr[0];  // 결과값은 'ciao'  이 된다
      </programlisting>
				</informalexample>
			</para>
			<para>
     스칼라(scalar)변수나 문자열 변수가 객체로 casting될때 그 변수는
     'scalar'라는 객체의 속성값이 된다.     
     <informalexample>
					<programlisting role="php">
$var = 'ciao';
$obj = (object) $var;
echo $obj->scalar;  // 결과값은 'ciao' 이 된다
      </programlisting>
				</informalexample>
			</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:
-->
 |