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
|
<?xml version="1.0" encoding="iso-8859-1"?>
<chapter id="language.types">
<title>Tipos</title>
<para>
O PHP suporta os seguintes tipos:
<itemizedlist>
<listitem>
<simpara>
<link linkend="language.types.array">matriz</link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="language.types.float">nmeros de ponto flutuante
</link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="language.types.integer">inteiro</link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="language.types.object">objeto</link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="language.types.string">string</link>
</simpara>
</listitem>
</itemizedlist>
</para>
<simpara>
O tipo da varivel geralmente no setado pelo programador; em vez disso,
decidido em tempo de execuo pelo PHP, dependendo do contexto no qual a
varivel usada.
</simpara>
<simpara>
Se voc gostaria de forar uma varivel a ser convertida para um certo tipo,
voc pode <link linkend="language.types.typecasting">moldar</link> a varivel
ou usar a funo <function>settype</function> nela.
</simpara>
<simpara>
Note que uma varivel pode se comportar de maneiras diferentes em certas
situaes, dependendo de qual tipo ela no momento. Para mais informaes,
veja a seo <link linkend="language.types.type-juggling">Manipulao de tipos</link>.
</simpara>
<sect1 id="language.types.integer">
<title>Inteiros</title>
<para>
Inteiros podem ser especificados usando-se qualquer uma das seguintes sintaxes:
<informalexample>
<programlisting role="php">
$a = 1234; # nmero decimal
$a = -123; # um nmero negativo
$a = 0123; # nmero octal (equivalente a 83 decimal)
$a = 0x12; # nmero hexadecimal (equivalente a 18 decimal)
</programlisting>
</informalexample>
</para>
</sect1>
<sect1 id="language.types.float">
<title>Nmeros de ponto flutuante</title>
<para>
Nmeros de ponto flutuante ("doubles") podem ser especificados usando-se qualquer
uma das seguintes sintaxes:
<informalexample>
<programlisting role="php">
$a = 1.234; $a = 1.2e3;
</programlisting>
</informalexample>
</para>
</sect1>
<sect1 id="language.types.string">
<title>Strings</title>
<para>
Strings podem ser especificadas usando-se um dos dois conjuntos de delimitadores.
</para>
<para>
Se a string est englobada entre aspas ("), as variveis dentro da string sero
expandidas (sujeitas a algumas limitaes de anlise). Como em C e em Perl, a
barra invertida ("\") pode ser usada para especificar caracteres especiais:
<table>
<title>Caracteres de escape</title>
<tgroup cols="2">
<thead>
<row>
<entry>sequence</entry>
<entry>meaning</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>\n</literal></entry>
<entry>nova linha</entry>
</row>
<row>
<entry><literal>\r</literal></entry>
<entry>retorno de carro</entry>
</row>
<row>
<entry><literal>\t</literal></entry>
<entry>tabulao horizontal</entry>
</row>
<row>
<entry><literal>\\</literal></entry>
<entry>barra invertida</entry>
</row>
<row>
<entry><literal>\$</literal></entry>
<entry>cifro</entry>
</row>
<row>
<entry><literal>\"</literal></entry>
<entry>aspas</entry>
</row>
<row>
<entry><literal>\[0-7]{1,3}</literal></entry>
<entry>
a sequncia de caracteres que casa com a expresso regular um
caractere na notao octal
</entry>
</row>
<row>
<entry><literal>\x[0-9A-Fa-f]{1,2}</literal></entry>
<entry>
a sequncia de caracteres que casa com a expresso regular um
caractere na notao hexadecimal
</entry>
</row>
</tbody>
</tgroup>
</table></para>
<para>
Voc pode escapar qualquer outro caractere, mas um alerta ser emitido
no nvel mais alto de alertas.
</para>
<para>
A segunda maneira de delimitar uma string usa o apstrofe ("'"). Quando uma
string englobada por apstrofes, os nicos escapes que sero entendidos so
"\\" e "\'". Isto por convenincia, de forma que voc tenha apstrofes e
barras invertidas em uma string com apstrofes. As variveis
<emphasis>no</emphasis> sero expandidas dentro de uma string com apstrofes.
</para>
<para>
Outra maneira de delimitar strings pelo uso da sintaxe 'here doc'
("<<<"). Algum deve fornecer um identificador depois de
<literal><<<</literal>, depois a string, e ento o mesmo
identificador para fechar a citao. O identificador de fechamento
<emphasis>precisa</emphasis> comear na primeira coluna da linha.
<example>
<title>Exemplo de citao de string 'here doc'</title>
<programlisting>
$str = <<<EOD
Exemplo de string
dividida em mltiplas linhas
usando a sintaxe 'heredoc'.
EOD;
</programlisting>
</example>
</para>
<note>
<para>
Suporte a 'here doc' foi acrescentado no PHP 4.
</para>
</note>
<para>
Strings podem ser concatenadas usando-se o operador '.' (ponto). Note
que o operador '+' (adio) no funcionar para isso. Por favor veja
<link linkend="language.operators.string">Operadores de string
</link> para mais informaes.
</para>
<para>
Caracteres dentro de strings podem ser acessados pelo tratamento da string
como uma matriz de caracteres indexadas numericamente, usando a sintaxe
no estilo C. Veja alguns exemplos abaixo.
</para>
<para>
<example>
<title>Alguns exemplos de string</title>
<programlisting role="php">
<?php
/* Atribuindo uma string. */
$str = "Isto uma string";
/* Acrescentando a ela. */
$str = $str . " com mais um pouco de texto";
/* Outra maneira de acrescentar, inclui uma nova linha com escape. */
$str .= " e uma nova linha no fim.\n";
/* Esta string terminar sendo '<p>Nmero: 9</p>' */
$num = 9;
$str = "<p>Nmero: $num</p>";
/* Esta ser '<p>Nmero: $num</p>' */
$num = 9;
$str = '<p>Number: $num</p>';
/* Obtm o primeiro caractere da string */
$str = 'Isto um teste.';
$first = $str[0];
/* Obtm o ltimo caractere de uma string. */
$str = 'Isto ainda um teste.';
$last = $str[strlen($str)-1];
?>
</programlisting>
</example>
</para>
<sect2 id="language.types.string.conversion">
<title>Converso de String</title>
<simpara>
Quando uma string avaliada como um valor numrico, o valor resultante
e o tipo so determinados como se segue.
</simpara>
<simpara>
A string ser avaliada como um 'double' se contiver qualquer um dos caracteres
'.', 'e', ou 'E'. Caso contrrio, ser avaliada como um inteiro.
</simpara>
<para>
O valor dado pela poro inicial da string. Se a string comea com dados
numricos vlidos, estes sero o valor usado. Caso contrrio, o valor ser 0
(zero). Dados numricos vlidos so um sinal opcional, seguido por um ou mais
dgitos (opcionalmente contendo um ponto decimal), seguido por um expoente
opcional. O expoente um 'e' ou 'E' seguido por um ou mais dgitos.
</para>
<simpara>
Quando a primeira expresso uma string, o tipo de varivel depender da
segunda expresso.
</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 inteiro (1)
$foo = 1 + "bob3"; // $foo inteiro (1)
$foo = 1 + "10 porquinhos"; // $foo inteiro (11)
$foo = 1 + "10 porquinhos"; // $foo inteiro (11)
$foo = "10.0 porcos " + 1; // $foo inteiro (11)
$foo = "10.0 porcos " + 1.0; // $foo 'double' (11)
</programlisting>
</informalexample>
<simpara>
Para mais informaes sobre esta converso, veja a pgina de manual de strtod(3).
</simpara>
<para>
Se voc gostaria de testar qualquer um dos exemplos desta seo, voc pode cortar
e colar os exemplos e inserir a seguinte linha para ver, por voc mesmo, o que
est acontecendo:
<informalexample>
<programlisting role="php">
echo "o tipo de \$foo==$foo; " . gettype ($foo) . "<br>\n";
</programlisting>
</informalexample>
</para>
</sect2>
</sect1>
<sect1 id="language.types.array">
<title>Matrizes</title>
<para>
Matrizes agem atualmente como tabelas de 'hashing' (matrizes associativas) e matrizes
indexadas (vetores).
</para>
<sect2 id="language.types.array.single-dim">
<title>Matrizes de Uma Dimenso</title>
<para>
O PHP suporta matrizes escalares e associativas. De fato, no h diferena entre as duas.
Voc pode criar uma matriz usando as funes
<function>list</function> ou <function>array</function>, ou voc pode setar cada valor dos
elementos da matriz explicitamente.
<informalexample>
<programlisting role="php">
$a[0] = "abc";
$a[1] = "def";
$b["foo"] = 13;
</programlisting>
</informalexample>
</para>
<para>
Voc tambm pode criar uma matriz simplesmente acrescentando valores matriz.
Quando voc atribui um valor a uma varivel de matriz usando colchetes vazios,
o valor ser acrescentado ao final da matriz.
<informalexample>
<programlisting role="php">
$a[] = "ol"; // $a[2] == "ol"
$a[] = "mundo"; // $a[3] == "mundo"
</programlisting>
</informalexample>
</para>
<para>
As matrizes podem ser ordenadas usando-se as funes <function>asort</function>,
<function>arsort</function>, <function>ksort</function>,
<function>rsort</function>, <function>sort</function>,
<function>uasort</function>, <function>usort</function>, e
<function>uksort</function>, dependendo do tipo de ordenao que voc quer.
</para>
<para>
Voc pode contar o nmero de itens em uma matriz usando a funo
<function>count</function>.
</para>
<para>
Voc pode atravessar uma matriz usando as funes <function>next</function> e
<function>prev</function>. Uma outra maneira comum de atravessar uma matriz com
o uso da funo <function>each</function>.
</para>
</sect2>
<sect2 id="language.types.array.multi-dim">
<title>Matrizes Multi-Dimensionais</title>
<para>
Matrizes multi-dimensionais so bem simples atualmente. Para cada dimenso da matriz,
voc acrescenta outro valor [chave] no final:
<informalexample>
<programlisting role="php">
$a[1] = $f; # exemplos de uma dimenso
$a["foo"] = $f;
$a[1][0] = $f; # duas dimenses
$a["foo"][2] = $f; # (voc pode misturar ndices numricos e associativos)
$a[3]["bar"] = $f; # (voc pode misturar ndices numricos e associativos)
$a["foo"][4]["bar"][0] = $f; # quatro dimenses!
</programlisting>
</informalexample>
</para>
<para>
Em PHP3 no possvel referenciar matrizes multidimensionais diretamente dentro de
strings. Por exemplo, o que vem a seguir no ter o resultado desejado:
<informalexample>
<programlisting role="php">
$a[3]['bar'] = 'Bob';
echo "Isto no vai funcionar: $a[3][bar]";
</programlisting>
</informalexample>
Em PHP3, o impresso acima ser <computeroutput>Isto no vai funcionar:
Array[bar]</computeroutput>. O operador de concatenao de string, porm, pode ser
usado para sobrepr isto:
<informalexample>
<programlisting role="php">
$a[3]['bar'] = 'Bob';
echo "Isto no vai funcionar: " . $a[3][bar];
</programlisting>
</informalexample>
</para>
<para>
Em PHP4, porm, o problema todo pode ser acobertado englobando a referncia da
matriz (dentro da string) entre chaves:
<informalexample>
<programlisting role="php">
$a[3]['bar'] = 'Bob';
echo "Isto vai funcionar: {$a[3][bar]}";
</programlisting>
</informalexample>
</para>
<para>
Voc pode "preencher" matrizes multidimensionais de muitas formas, mas a mais fcil de
entender como usar o comando <function>array</function> para matrizes associativas.
Estes dois trechos de cdigo preenchem a matriz unidimensional da mesma forma:
<informalexample>
<programlisting role="php">
# Exemplo 1:
$a["cor"] = "vermelho";
$a["sabor"] = "doce";
$a["forma"] = "redondo";
$a["nome"] = "ma";
$a[3] = 4;
# Exemplo 2:
$a = array(
"cor" => "vermelho",
"sabor" => "doce",
"forma" => "redondo",
"nome" => "ma",
3 => 4
);
</programlisting>
</informalexample>
</para>
<para>
A funo <function>array</function> pode ser aninhada para matrizes multidimensionais:
<informalexample>
<programlisting role="php">
<?
$a = array(
"ma" => array(
"cor" => "vermelho",
"sabor" => "doce",
"forma" => "redondo"
),
"laranja" => array(
"cor" => "laranja",
"sabor" => "azedo",
"forma" => "redondo"
),
"banana" => array(
"cor" => "amarelo",
"sabor" => "pastoso",
"forma" => "cilndrico"
)
);
echo $a["ma"]["sabor"]; # imprimir "doce"
?>
</programlisting>
</informalexample>
</para>
</sect2>
</sect1>
<sect1 id="language.types.object">
<title>Objetos</title>
<sect2 id="language.types.object.init">
<title>Inicializao de Objeto</title>
<para>
Para inicializar um objeto, voc usa o comando <literal>new</literal> para
instanciar o objeto para uma varivel.
<informalexample>
<programlisting role="php">
<?php
class foo {
function do_foo() {
echo "Fazendo foo.";
}
}
$bar = new foo;
$bar->do_foo();
?>
</programlisting>
</informalexample>
</para>
<simpara>
Para uma discusso completa, por favor leia a seo <link
linkend="language.oop">Classes e Objetos</link>.
</simpara>
</sect2>
</sect1>
<sect1 id="language.types.type-juggling">
<title>Type Juggling</title>
<simpara>
O PHP no requer (ou suporta) a definio explcita de tipo na declarao
da varivel; um tipo de varivel determinado pelo contexto na qual a varivel
usada. Quer dizer, se voc atribui um valor de string a uma varivel
<parameter>var</parameter>, <parameter>var</parameter> se torna uma string. Se voc
ento atribui um valor inteiro a <parameter>var</parameter>, ela se torna inteira.
</simpara>
<para>
Um exemplo de converso automtica de tipo no PHP o operador de adio '+'. Se
qualquer um dos operandos um 'double', ento todos os operandos so avaliados como
'doubles', e o resultado ser um 'double'. Caso contrrio, os operandos sero
interpretados como inteiros, e o resultado tambm ser um inteiro. Note que isto NO
muda os tipos dos prprios operandos; a nica mudana em como os operandos so
avaliados.
<informalexample>
<programlisting role="php">
$foo = "0"; // $foo string (ASCII 48)
$foo++; // $foo a string "1" (ASCII 49)
$foo += 1; // $foo agora um inteiro (2)
$foo = $foo + 1.3; // $foo agora um double (3.3)
$foo = 5 + "10 Porquinhos"; // $foo inteiro (15)
$foo = 5 + "10 Porquinhos"; // $foo inteiro (15)
</programlisting>
</informalexample>
</para>
<simpara>
Se os ltimos dois exemplos acima parecem incomuns, veja <link
linkend="language.types.string.conversion">Converso de Strings</link>.
</simpara>
<simpara>
Se voc deseja forar uma varivel a ser avaliada como um certo tipo, veja a seo
sobre<link linkend="language.types.typecasting">Moldagem de tipo</link>. Se voc deseja
mudar o tipo de uma varivel, veja <function>settype</function>.
</simpara>
<para>
Se voc gostaria de testar qualquer um dos exemplos desta seo, voc pode cortar e colar
os exemplos e inserir a seguinte linha para ver, por voc mesmo, o que est acontecendo:
<informalexample>
<programlisting role="php">
echo "o tipo de \$foo==$foo; " . gettype ($foo) . "<br>\n";
</programlisting>
</informalexample>
</para>
<note>
<para>
O comportamento de uma converso automtica para matriz no definida no momento.
<informalexample>
<programlisting role="php">
$a = 1; // $a um inteiro
$a[0] = "f"; // $a se torna uma matriz, com $a[0] mantendo "f"
</programlisting>
</informalexample>
</para>
<para>
Enquanto o exemplo acima pode parecer que vai claramente resultar em $a se tornar uma
matriz, do qual o primeiro elemento 'f', considere isto:
<informalexample>
<programlisting role="php">
$a = "1"; // $a uma string
$a[0] = "f"; // E as compensaes de string? O que acontece?
</programlisting>
</informalexample>
</para>
<para>
Como o PHP suporta indexao para strings atravs de compensaes usando a mesma sintaxe
que a indexao de matrizes, o exemplo acima conduz a um problema: $a deveria se tornar
uma matriz com seu primeiro elemento sendo
"f", ou "f" deveria se tornar o primeiro caractere da string $a?
</para>
<para>
Por esta razo, como no PHP 3.0.12 e no PHP 4.0b3-RC4, o resultado desta converso
automtica considerado indefinido. Correes esto, portanto, sendo discutidas.
</para>
</note>
<sect2 id="language.types.typecasting">
<title>Moldagem de tipo</title>
<para>
Moldagem de tipo no PHP funciona de forma semelhante ao C: o nome do tipo desejado escrito
entre parnteses antes da varivel que se quer moldar.
<informalexample>
<programlisting role="php">
$foo = 10; // $foo um inteiro
$bar = (double) $foo; // $bar um double
</programlisting>
</informalexample>
</para>
<para>
As moldagens permitidas so:
<itemizedlist>
<listitem>
<simpara>(int), (integer) - molda para inteiro</simpara>
</listitem>
<listitem>
<simpara>(real), (double), (float) - molda para 'double'</simpara>
</listitem>
<listitem>
<simpara>(string) - molda para string</simpara>
</listitem>
<listitem>
<simpara>(array) - molda para matriz</simpara>
</listitem>
<listitem>
<simpara>(object) - molda para objeto</simpara>
</listitem>
</itemizedlist>
</para>
<para>
Note que tabulaes e espaos so permitidos dentro dos parnteses, assim
os exemplos a seguir so funcionalmente equivalentes:
<informalexample>
<programlisting role="php">
$foo = (int) $bar;
$foo = ( int ) $bar;
</programlisting>
</informalexample>
</para>
<para>
Pode no ser exatamente bvio o que acontece quando ocorre a moldagem
entre certos tipos. Por exemplo, o seguinte deve ser notado.
</para>
<para>
Quando se molda uma varivel escalar ou string para uma matriz,
a varivel se tornar o primeiro elemento da matriz:
<informalexample>
<programlisting role="php">
$var = 'tchau';
$arr = (array) $var;
echo $arr[0]; // imprime 'tchau'
</programlisting>
</informalexample>
</para>
<para>
Quando se molda uma varivel escalar ou string para um objeto, a
varivel se tornar um atributo do objeto; o nome do atributo ser 'scalar':
<informalexample>
<programlisting role="php">
$var = 'tchau';
$obj = (object) $var;
echo $obj->scalar; // imprime '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:
-->
|