[Powered by Google Translate] [Seção 8] [menos confortável] [Nate Hardison] [Harvard University] [Esta é CS50.] [CS50.TV] Bem-vindo ao nosso segundo a última seção. Nesta semana vamos falar sobre PHP, e então na próxima semana vamos fazer uma pequena revisão para Quiz 1. Nós vamos começar na página 3 do problema define pacote, e vamos trabalhar através da seção de perguntas rapidamente. Na página 3, nós começamos a falar sobre essa diferença entre C e PHP no sentido de que o PHP é uma linguagem de tipagem dinâmica, enquanto C é tipagem estática, e tem alguém realmente feito rapidamente qualquer codificação em algo como PHP ou Python ou Ruby antes, JavaScript? Totalmente novo? Okay. Todas essas línguas que eu acabei de mencionar são muito diferentes linguagens como C e C + + e Java no sentido de que quando você declara uma variável que você não tem que declarar que tipo de variável é, por isso, C foram preso ter que sempre digo isso vai ser uma variável int, ou isso vai ser uma variável char *, enquanto que com PHP, com o Python, com Ruby, com um monte de línguas mais modernas você não tem que fazer isso em tudo. Você acabou de declarar sua variável, e, no caso do PHP você declarar que é uma variável prefixando-lo com um sinal de $, e, em seguida, o tipo da variável é determinada por qualquer valor que está segurando, que é legal. Para brincar com isso um pouco, temos código de exemplo PHP aqui entre as tags de início e fim. Estamos usando este tipo de como HTML no sentido de que temos estes colchetes aqui para abrir e fechar. Você vai ver isso com HTML. Você vai ver o mesmo tipo de sintaxe com XML também. Isto indica o início de um bloco PHP. Este php? É específico para PHP. Fechamos tudo com um> também. Vamos abrir um arquivo no nosso aparelho com o que você gostaria. Neste pacote que diz chamar dynamic.php. Na verdade, você pode chamá-lo de tudo o que gostaria, mas o nome do arquivo vai aparecer e ser importante mais tarde, então lembre-se que você chamá-lo. Eu vou passar para o aparelho, e eu vou fazer um diretório para secção 9 Eu creio que estamos agora. E vamos para a secção 9, e eu vou usar o gedit. Vamos ver, gedit, e eu vou chamar dynamic.php meu. Boom. Dentro dynamic.php, já que este é um arquivo PHP e eu quero executar este através do intérprete PHP Eu preciso começar tudo com as tags abertas, então eu vou começar os imediatamente, me dar um pouco de espaço entre as tags, e então o ponto deste exercício foi de brincar com esta função chamada gettype, assim gettype, esta função aqui. Observe que não há espaço ou sublinhado ou hífen ou qualquer coisa assim separando as duas palavras, começar e escrever, apenas uma palavra completamente. Mas o que isto vai fazer é se eu passar em uma variável para gettype, dizer $ var ou $ x, isso vai me dizer o tipo de em um formato de depuração que o nome de que tipo é. Nós vamos experimentar aqui. Em particular, se você olhar para trás, a especificação pset temos algumas linhas diferentes do código aqui. Na primeira linha de código que inicializar esta variável, $ var, ser igual a 7, e, em seguida, temos esta linha printf que diz hey, var printf está em branco. Printf é uma das muitas maneiras de imprimir coisas em PHP. Muitas vezes você vai ver a função eco usado em vez de printf, printf mas estamos todos familiarizados com tendo sido codificação em C por um tempo. O que você pode realmente fazer é deixar de ver obras se copiar e colar. Eu vou dar a este uma tentativa. Vamos voltar para o aparelho. Ok, e lá vamos nós. E espaçamento é um pouco descolados, mas aqui vamos nós. Temos esse código aqui. [Estudante] É estilo não é bom para a guia-lo? Desculpe? [Estudante] É convencional para guia-lo? Certo, então Sam pergunta se é convenção para guia-lo ou não. Normalmente sim. Neste caso, eu escolhi não fazer isso. Honestamente, você vai ver coisas diferentes entre os programadores diferentes. PHP é normalmente usado muitas vezes em combinação com HTML e outras línguas, e por isso às vezes a impressão vai ficar um pouco descolados se você recuar no PHP início e tags de fim. Ela realmente depende. Neste caso, o copiar e colar não colar as abas para mim, mas definitivamente não, como você disse, torná-lo mais claro. Tudo bem, se você salvar este código em dynamic.php então o que você pode fazer é vir para baixo a sua janela de terminal onde estou aqui em baixo no gedit, e para fazer o equivalente a compilação com make e depois executar o código em C tudo que você tem a ver com o arquivo PHP é iniciar o interpretador PHP, que é um pequeno programa chamado PHP, eo argumento que você dá para o intérprete é o arquivo que você deseja interpretar. Neste caso dynamic.php,. Opa, onde foi que eu colocá-lo? Oh, eu colocá-lo na seção 9, e aqui estou eu. É por isso. Agora, se eu correr de novo vemos que em minha primeira chamada função gettype var é um inteiro. Na var próximo é uma string, e depois no var terceiro é um boolean. O que é interessante sobre isso é se deslocar de volta, vemos que estes são tipos semelhantes aos que tínhamos em C. Tivemos ints em C. Nós meio que tinha cordas em C, assim cordas não eram um tipo totalmente legit no sentido de que nossa string CS50 era realmente o que? Desculpe? Missy? [Missy] Char *. Sim, foi esse char * usamos. No início do semestre nós utilizando o tipo string, mas era realmente um char * sob o capô. Nós só tipo definido que, enquanto em PHP essas cadeias são um tipo real. Não há mais dessas coisas do tipo char *. Você vai ver que nós podemos fazer muito mais coisas com cordas muito mais facilmente em PHP do que poderíamos em C, e, finalmente, temos este tipo boolean, e a grande diferença aqui é que se deslocar de volta para baixo, vemos que o nome desses tipos agora são string, inteiro, e ao invés de boolean, int e bool e como você pegar diferentes linguagens de programação, assumindo que em algum momento de suas vidas, irá entrar em contato com os diferentes você vai notar pequenas peculiaridades como esta onde C chama ints inteiros. Alguns chamam-lhe números inteiros. Existem outros termos que você vai correr em. Int grande que vimos hoje em SQL. Há também o número e, em seguida, bool, boolean, todos os tipos de diferenças lá. Isso não é muito interessante, mas agora eu estou indo dar-lhe um pouco de tempo se o zoom-out para trabalhar através deste exercício, na parte inferior da página 3 onde ele pede que tipos correspondem a esses valores aqui no fundo. Temos 3.50. Nós temos esta coisa aqui, o que é interessante. Nós não vimos isso antes, mas se você estiver seguindo ao longo de palestra você provavelmente já sabe o que é. Então nós temos isso, que este é o tipo de funky. Você reconhece isso. O que é isso em C? Sam? O que isso lhe dar em C? Seria abrir um arquivo chamado dynamic.php e torná-lo legível. Sim, e qual seria o tipo de variável que seria atribuir isso? Estrela do arquivo. >> Exatamente, seria atribuir isso a uma estrela de arquivo. Este é PHP legítimo também. Executar isso. Veja o que acontece quando você passar isso para gettype. E também verificar o que é nula, o que poderia ser em PHP. Eu vou te dar um par de minutos. Você pode literalmente copiar e colar esses valores, e então vamos fazer uma chamada pouco aleatório em você e ver o que você tem. [Estudante] Eu tenho uma pergunta. << Yeah. Em uma das palestras David disse que há algo que você pode colocar no topo de seu arquivo de modo que você não precisa digitar no PHP cada vez. O que foi isso? Ele foi, provavelmente, a falar sobre o estrondo libra, o estrondo de hash. É uma directiva que se você marcar o arquivo como executável então o que ele faz é quando você executar o arquivo ele vai dizer o programa shell para usar o intérprete PHP para interpretar o conteúdo do arquivo. A questão de ser o que era esta linha especial que poderíamos incluir no topo de nossos arquivos PHP para não ter de incluir esta linha PHP ou PHP este comando sempre que quiser executar o arquivo? E você pode realmente fazer isso com um monte de arquivos diferentes. Eu acredito que depende de onde o binário do PHP é armazenado, mas muitas vezes usr / bin / php é um bom lugar para começar. Você pode descobrir isso exatamente, indo de volta para o seu aparelho e digitando que php. O comando que calcula quando você está executando binário ou um comando de onde o arquivo correspondente. Isso me diz que o PHP é realmente aliasing este arquivo binário que está armazenado em usr / bin, que é onde muitos dos binários do sistema estão instaladas. Por exemplo, se eu rolar até o topo, agora que eu coloquei essa #! linha aqui Eu posso rolar para baixo, e eu posso tentar executar dynamic.php, mas eu recebo este erro sobre a permissão que está sendo negado, eo que isso significa é que este arquivo não está dando permissões executáveis. Não é marcado como um arquivo que alguém possa ser executado. Quando você executou fazer ou Clang e você tem um executável a partir dele o compilador foi inteligente o suficiente para saber que, ei, eu estou construindo um executável. Você provavelmente vai querer executá-lo, de modo que seria configurar automaticamente as permissões para você. Este não é o caso, porém, quando você cria um arquivo normal a partir do zero, A razão é normalmente você não quer ter qualquer arquivo no seu sistema seja executável, para que você realmente tem que ir e fazê-lo manualmente. A maneira mais fácil de fazer isso é com o comando chmod, e chmod + x diz adicionar o bit executável porque não é o pouco de leitura, o bit de gravação eo pouco executável, r, w e x, e dizendo chmod + x irá ligar o bit executável para, em seguida, o arquivo que nós especificamos, que neste caso será dynamic.php. [Estudante] é que ligado para todos? Vamos verificar isso, assim como eu verifique as permissões? Você sabe como eu verifique as permissões de um arquivo? [Resposta do aluno inaudível] Desculpe? >> [Estudante] XSD. XSD dá-nos o arquivo em hacks. Listando todos os arquivos,-L, vai me mostrar todos os arquivos no meu diretório tipo de em sua longa lista detalhada, e assim por aqui vemos que este arquivo dynamic.php foi modificada pela última vez em 05 de novembro 04:21 PM. O proprietário deste arquivo é jharvard. Esse é o usuário que está logado pol Esse é o usuário que eu estou trabalhando como, e se você também está no aparelho que você está trabalhando também como jharvard usuário. Você está no grupo de alunos, e estas são as coisas que você vai ver muitas vezes o suficiente. Podemos entrar em muitos detalhes aqui, mas na maior parte o que você quer olhar para quando você está olhando para ver se ou não um arquivo é executável é primariamente o usuário que possui o arquivo, o proprietário, assim jharvard isso, e então nós temos os bits de permissões por aqui à esquerda, e da forma de ler esta é que o último bit tipicamente é usado para a marcação ou pelo menos não-menos neste caso essa última, muitas vezes, ser definido para anúncio para indicar que o arquivo é um diretório e não apenas um arquivo normal. Então, os seguintes 3 bits aqui mesmo determinar as permissões que o proprietário do arquivo tem, portanto, neste caso jharvard, como o proprietário do arquivo, pode ler e escrever neste arquivo, mas há um traço dizendo que jharvard não pode executar esse arquivo. Os próximos três bits são para o grupo, de modo que este é o grupo de alunos, por isso, se havia vários usuários no meu aparelho, e tivemos vários usuários como parte do grupo de alunos, então eles podem ler este arquivo, mas não pode escrever, e também qualquer outra pessoa, o mundo só pode ler este arquivo também. Há um writeup, bom tempo sobre isso, assim você pode ler online. Na especificação do conjunto de problemas que vão para isso com mais detalhe. [Estudante] é o 218 referindo-se ao mundo? O 218 é-em cima da minha cabeça, eu estou esquecendo, mas não. Vamos ver. Estou cega nisso agora. Volta para o que estávamos prestes a fazer com este chmod + x onde queríamos dar permissões executáveis ​​dynamic.php, ea pergunta era se isso iria dar permissões executáveis ​​para todos ou apenas jharvard, e podemos ver isso executar os comandos e digitando ls-l, e agora vemos que ela é marcada como executável. Você vê que houve uma mudança de cor. Agora dynamic.php está listada de verde, e parece que a resposta para a questão é que, Charlotte? [Charlotte] Só jharvard. >> Jharvard Apenas, sim. Se queria virar a pouco executável em para todos como podemos fazer isso? Quaisquer pensamentos? >> A + x? Sim, exatamente. Charlotte disse que podemos fazer chmod + x de um dos dynamic.php, e agora, se executar ls-l, vemos que os bits executáveis são de fato ligado para todos. E você pode realmente fazer o inverso deste, de modo que você pode desligá-lo para todos usando menos. Agora ele está desligado, e agora podemos ligá-lo novamente para jharvard para que possamos realmente executá-lo agora, e agora você vê quando executa o código presente especial #! linha na parte superior, #! linha, disse o shell, disse o nosso terminal hey, quando esse arquivo é executado, usar / usr / bin / php para interpretar este arquivo e, em seguida, imprimir a saída. [Pergunta estudante inaudível] Claro, deixe-me ir para cima. Assim como este. Você vai ver todas essas directivas começar com este libra e, em seguida, o ponto de exclamação, às vezes chamado de um estrondo, shebang hash. [Estudante] Como podemos executá-lo com dynamic.php php antes de torná-lo executável? A questão era como podemos executar isso usando o binário do PHP enquanto dynamic.php não é executável? Isso é super importante, porque é exatamente como ele está indo para o trabalho quando você escreve conjunto de problemas 7. A maioria dos arquivos de tempo do PHP não são diretamente executável. A maneira que funciona é porque é o binário PHP que é executável. O intérprete é a coisa que está sendo executado, e assim o que está fazendo é, literalmente, chupando em todo o conteúdo do nosso arquivo dynamic.php e linha por linha vai e executar os comandos, por isso é usando o nosso arquivo PHP como uma lista de instruções. Não está diretamente executá-lo. É aí que dizemos que esses arquivos são interpretados em tempo de execução. É uma linguagem tempo de execução, em vez de algo que é determinado em tempo de compilação, não uma linguagem compilada como C. Existe uma maneira de obter uma linguagem tempo de execução de agir como se fosse uma linguagem tempo de compilação, Como se você tiver todo o corredor feito no servidor em vez de, você sabe o que quero dizer? Sim, então a questão é há uma maneira de obter línguas tempo de execução para agir mais como os tipos de tempo de compilação de linguagens? E lá estão, quer dizer, que é uma área ativa de pesquisa para muitas dessas empresas. Acredito que o Facebook tem feito um grande trabalho com PHP e compilá-lo para baixo, tornando-o mais rápido, otimizando-o desde o seu site é construído em PHP. Se você estiver seguindo Node.js em tudo, que é uma espécie de um interpretador de JavaScript para ser capaz de executar JavaScript fora do navegador, fora de seu navegador, porque tradicionalmente JavaScript seria apenas correr dentro do Firefox ou Chrome, e seria usado para fazer animações legais acontecer em uma página da Web e fazer a sua página web dinâmica. Que foi construída sobre um monte de trabalho que o Google fez que ter o JavaScript e C + + se unem, então não há muita pesquisa ativa para obter essas línguas para interagir e otimizá-los, principalmente porque muitas pessoas podem codificar em PHP e JavaScript porque é muito mais fácil. É muito mais agradável. Você não tem ponteiros. Você não tem tipos flutuando. Eles queriam ganhar os benefícios de línguas em tempo de compilação com todo o tipo de controlo e a velocidade e o uso de memória inferior e tudo isso mantendo ainda a flexibilidade e a facilidade de utilização destas novas. De volta ao nosso plano original de ataque. Temos algumas dessas perguntas aqui na nossa especificação conjunto de problemas. Vamos passar por eles muito rapidamente, e nós vamos dar a volta ao quarto. Charlotte, que tipo é 3,50? [Charlotte] Isso é um duplo. >> É uma dupla. Jimmy, o que é esse próximo? >> Uma matriz. Uma matriz, impressionante, e Jared, o que é o fopen? [Jared] É um recurso. >> É um recurso. Esse é um tipo de um novo, não uma estrela de arquivo, não um arquivo. É um recurso é o tipo em PHP, e eu sinto muito, Ella, o nulo último é o que? Nulo. Nulo, como é escrito em PHP? >> A mesma forma. Da mesma forma, capitais? >> Sim. Sim, tudo bem. Aqui vamos nós, temos um duplo, temos uma matriz, temos um recurso, e depois temos nulo. Vamos ver agora você viu- Vamos ver, então agora eu acho que eu também quero fazer é puxar para cima esta página web aqui, este php.net / manual, por isso, se vocês que copiar e abrir um navegador. Eu vou puxar o Chrome, que colocou dentro Quero mostrar que isso não só porque podemos falar todos os dias sobre os tipos e todas as coisas que a diversão mas porque este é o manual do PHP, e há um monte de programadores PHP lá fora. Há um monte de sites PHP lá fora, e, como resultado, há uma grande quantidade de documentação em PHP, e do manual, este php.net, é um bom lugar para ir sempre que você estiver com dúvidas sobre o que é a melhor maneira de fazê-X em PHP ou o que é que uma função se parece? Apenas o tipo de se familiarizar com o que isso parece porque você vai vir aqui muitas vezes, um pouco de conjunto de problemas 7. Se você acaba fazendo um projeto final que usa PHP este será um lugar que você vai tornar-se muito bem familiarizado. Muitas vezes, a forma como as pessoas fazer isso é que eles usam o Google para pesquisar o local, e não usar a caixa de pesquisa que está aqui em cima no canto superior direito, que é uma espécie de minúsculo. Se você está pesquisando em torno de algo para fazer com PHP e você vê um dos links manuais aparecer normalmente você pode confiar em que como um recurso bastante bom. Incríveis, portanto, fora desses tipos, só por curiosidade, quais não temos visto? Qualquer coisa que nós não vimos aqui? [Estudante] >> Recursos. Vimos de recursos com a chamada fopen. [Estudante] objetos. >> Objetos que não temos visto, com certeza. Callbacks não vimos. Há alguns desses pseudo-tipos. Nós definitivamente só vi inteiro e de casal. Nós não ver alguns dos outros, por isso, se clicar em números inteiros podemos ver existem quaisquer outros inteiros que eles têm aqui? São todos tão inteiro, inteiro, inteiro. Algumas línguas têm maiores tipos inteiros, como vimos no MySQL hoje houve int e int grande. Cool. Então, manual do PHP. Vamos voltar para a nossa especificação conjunto de problemas, e agora vamos rolar a página 4. Uma das coisas que acontece quando você começa línguas que não têm esta tipagem estática, portanto, essas línguas, onde você tem de declarar o tipo de uma variável de frente para cima é que você começa casos em que você pode começar a ter variáveis ​​de tipos diferentes interagindo uns com os outros, e PHP faz essa coisa que ele tenta fazer o que considera ser a coisa mais sensata a fazer quando você tem dois tipos diferentes interagem uns com os outros. Por exemplo, se olharmos para estas linhas de código aqui você vê que nós temos o que acontece quando nós tentamos e adicionar a seqüência 1 para o número inteiro 2. O que acontece se tentar e adicionar uma seqüência que não é um valor numérico mas sim personagens reais, CS com o número 50? Então vamos ver há alguma coisa diferente que acontece quando em vez de adicionar uma string para um número que está adicionando um número a uma string, e assim por diante e assim por diante até o ponto em que estamos recebendo algum tipo de coisas estranhas aqui, onde temos 7 + verdade. O que diabos isso significa? Se vocês vão em frente e colar alguns este código em seu aparelho. Você pode mantê-lo em dynamic.php. Vamos ver o que acontece. [Estudante] Basta usar impressão não, printf? Sim, então você verá que de impressão também é uma função válida para a impressão em PHP. Há muitas maneiras diferentes de fazer isso. Vamos ver com um par dos exemplos mais tarde, uma vez que começa a falar sobre o único problema que nós estamos indo para escrever e então o problema concentrações que vamos escrever que mesmo que temos fopen e fclose que muitas vezes não é a maneira mais simples de ler o conteúdo de um arquivo. O PHP tem um monte desses remanescentes C-like. [Estudante] Quando eu coloquei em todas as 6 daquelas coisas que eu só obter um número como uma saída. [Nate H.] Quando você coloca em todas as 6 dessas coisas. Vamos ver o que é, porque é possivelmente- uma coisa é que essas chamadas de impressão não estão terminados no final com novas linhas. Não há como nova linha que separa cada uma dessas chamadas de impressão, talvez por isso que você está recebendo um grande número, e ele é realmente apenas amálgama de novos caracteres de linha. [Estudante] Ok, como posso ter certeza de- Bem, há um monte de maneiras diferentes. Você poderia colocar manualmente em uma cópia de um caractere de nova linha, um eco de um caractere de nova linha, imprimir de nova linha. [Estudante] Então eco é a mesma coisa que printf? Printf é como C printf onde você estiver imprimindo uma seqüência formatada. Você está fornecendo-lhe a seqüência de formato e todas as variáveis ​​de espaço reservado. É algo que muitas vezes não é utilizado- vamos ver, como um aviso, Estou menos familiarizado com PHP do que eu com linguagens da web, e quando eu tiver programado em PHP eu normalmente não usam printf porque acho que é mais rápido para usar os recursos de interpolação de strings que tem, que nós vamos entrar e eu vou lhe mostrar em apenas um segundo, enquanto que em C nós meio que temos para fazer esta coisa hacky para obtê-lo para imprimir corretamente. Você realmente pode colocar variáveis ​​diretamente em strings em PHP. Printf é uma espécie de excessivamente longo para o que eu costumo fazer. Sim, Ella. [Ella] Geralmente, se você conseguir um erro de interpretação é que isso significa- como em C não dizer exatamente onde está o erro e que é, Então, isso significa olhar através de seu código inteiro e descobrir isso? É tipicamente mais segmentado do que isso. Eu acho que nesse caso foi um pouco fora, então eu acho que, nesse caso, que estava faltando um ponto e vírgula. Ele estava tentando fazer sentido de tudo, assim como essas linguagens interpretadas, o intérprete vai tentar e fazer o seu melhor para que tudo funcione adequadamente. Você vai ver, por exemplo, em JavaScript Você muitas vezes linha de declarações finais com um ponto e vírgula como o fazem em PHP, assim como fazem em C. Em JavaScript alguns dos intérpretes de JavaScript em muitos dos navegadores irá colocar em ponto e vírgula para você se acontecer de você estar faltando eles. Eles vão tentar acomodar por algum desleixo de sua parte. É onde ele pode estar tentando e tentando e tentando fazer as coisas de trabalho, e, finalmente, vai chegar a um ponto onde ele diz que está bem, Eu não posso fazer as coisas funcionarem em fiando, e é aí que você vai ter um número de linha que pode parecer um pouco fora do lugar exato. Ok, então vamos passar por isso muito rapidamente. Paramos com Ella, então vamos passar para Missy, e Missy, o que faz impressão de corda 1 mais o número 2 lhe dar? [Missy] 3. >> 3. Isso faz sentido? Mais ou menos? Dá-lhe um número? Dá-lhe uma corda? [Missy] Um número. >> É um número. Mas é imprimi-lo, por isso vai dar-lhe algum tipo de corda. Uma coisa que podemos fazer para verificar isso é se fizermos $ var = 1 + 2 e então dizemos eco de gettype, por isso estamos usando um terceiro tipo de impressão aqui. Agora podemos ver o que acontece aqui. Aqui o que temos é que temos um número inteiro fora disso. Mesmo que estavam adicionando esta string para um número, nós não conseguimos uma seqüência de fora, assim como Missy disse. Estávamos recebendo um número inteiro. Ok, então vamos ver, junto-se, Kevin. CS + 50? >> [Kevin] 50. [Nate H.] 50. Isso faz sentido? [Kevin] Yeah. [Nate H.] Por quê? Por que faz sentido para você? [Kevin], porque é só ter a corda, tendo valor zero número. Sim, ótimo. Tipo de situações ambíguas, mas é bom saber o que acontece. Stella, o que acontece com o número 1 + seqüência 2? [Stella] 3. >> 3 novamente. E, neste caso, podemos obter uma string ou um número? Vamos tentar dar um presente. Alguém mais rápido que eu obter a resposta? Charlotte? Ah, eu didn't-tudo bem, vamos ver, vamos fazer o mesmo tipo de coisa onde nós temos um número de mais uma cadeia, e nós estamos indo para ecoar o tipo, ver o que temos. Nós também obter um número inteiro. Não importa qual é a cadeia, que é o número um. Nós ainda estamos indo para obter um número inteiro. Ele ainda vai fazer o que poderíamos esperar. Tudo bem, então Sam, que cerca de 90 + 9 garrafas de cerveja na parede? [Sam] 99. >> 99. Não garrafas de cerveja na parede, no entanto. Isso nos dá um pouco mais informações sobre o que está acontecendo. [Sam] Se você tivesse escrito em letras 9 então você teria 90, certo? [Nate H.] Yeah. A questão era se tivéssemos escrito 9 como N-I-N-E teríamos obtido 99 ou 90? Teríamos 90. É literalmente olhando apenas para personagens de dois dígitos. Não é suficientemente inteligente para reconhecer palavras para números e essas coisas. Sim. [Estudante] Existe tal coisa como typecasting em PHP? Não há, e é exatamente do jeito que você faria em C. O que cerca de 10/7, Charlotte? [Charlotte] 1,4285. [Nate H.] Sim, então o que pode ser surpreendente sobre isso? O que aconteceria se você fez esse mesmo tipo de coisa em C, se você fez 10/7 em C? [Charlotte] É só dar-lhe-dependendo de como você typecasted eu acho que lhe daria apenas um número limitado de dígitos depois da vírgula. Sim, então um número limitado de dígitos depois da vírgula. O que mais poderia ser-se-ia que lhe dar quaisquer dígitos depois da vírgula? Muitas vezes, não tão novo, dependendo de como você está se typecasting ele pode ou não pode convertê-lo em um número de ponto flutuante. Aqui era uma espécie de bom que ele fez. Se tivéssemos mostrado que você esta de volta quando começamos a fazer esse tipo de coisa em C ele provavelmente teria feito sentido um pouco mais que não basta ir a um. E então, finalmente, Jamie, o que dizer de 7 + verdade? [Jamie] 8. >> 8. O que significa isso? Eu acho que só dá certo o valor de 1. Sim. O que acontece se mudar isso para false? [Estudante] 7. Sim, para lembrar onde falamos sobre esses valores binários, Sendo 1 em diante, sendo 0 fora? Agora temos verdadeiro é 1, 0 é falso, e você não pode ter visto isso nos exemplos C que fizemos neste semestre passado, mas historicamente o tipo bool em C não tem sido um tipo de real, para que as pessoas têm usado 0 e 1 no lugar de verdadeiro e falso. Esta é uma manifestação disso. Ok, então por um lado importante de tudo isso é que temos estes tipos diferentes. Eles podem interagir uns com os outros. Muitas vezes podem interagir uns com os outros de maneiras que são agradáveis, como vimos aqui. É bom ser capaz de ter uma corda eo número 2, adicioná-los juntos e obter 3. Isso faz sentido. No entanto, quando você está escrevendo sites, e especialmente quando você está processando entrada do usuário, para dizer que você tenha escrito um formulário web que coleta informações do usuário e, em seguida, vai para processá-lo na extremidade traseira, no lado do servidor em seu código PHP se você está esperando que o valor que o usuário digitou e submetidos ao seu formulário para ser um inteiro ou ser um número de ponto flutuante, ou algo assim você precisa explicitamente lançá-lo e depois fazer alguma verificação de tipo. Você não quer apenas contar com este sistema de malabarismo tipo para fazer as coisas funcionarem, especialmente por razões de segurança e apenas para a robustez do seu site. Apenas algo para se manter em mente que quando você está lidando com dados do formulário, qualquer coisa que vem na mensagem ou as superglobais get certifique-se que você sempre validá-lo e convertê-lo e typecast-lo. E, assim como nós estávamos falando sobre um momento atrás que typecasting em PHP é exatamente o mesmo que no C, onde você tem os parênteses e, em seguida, o tipo. Tenha isso em mente. Uma função que vai vir a calhar quando você está fazendo isso é que estamos usando e este é o tipo de como um aparte- estamos usando esta função gettype aqui para descobrir o tipo de uma variável, e enquanto isso é útil para depuração e para ver que tipo de uma variável é você não quer usar isso, por exemplo, em uma condição em que você está verificando para ver se gettype de $ var = inteiro fazer alguma coisa. Isso é ruim, ruim, ruim. Em vez disso, são essas funções chamadas é inteiro, é string, é matriz que você deseja usar no lugar, portanto, neste caso o que eu gostaria de fazer, em vez de esse cara aqui se utilizar o var é número inteiro. E eles são muitas vezes referido é * is_ no sentido de que você poderia substituir o * com número inteiro, string, et cetera, e apenas para ter certeza realmente rápido é isso é int php. Parece que você pode fazer ou é int ou se existe inteiro também? Sim, alias, tão int aliases inteiros. Cool. Como estamos indo? Vamos pegar o ritmo um pouco. Agora vamos falar sobre matrizes, assim como você pode ver na próxima parte da especificação falamos sobre como arrays em PHP são um pouco diferentes do que são na C. Na verdade, eles são uma espécie de amálgama de as matrizes que você já conhece e ama na C onde tudo é do mesmo tipo armazenadas consecutivamente e de forma contígua na memória, e você tem esses índices numéricos. Você tem índice 0, o índice 1, índice 2, e armazenar valores nesses índices. Você também em C, quando você escreveu Speller, um monte de você fez a abordagem tabela hash, e você viu que não tivemos um tipo diferente de armazenamento onde estávamos mapeando uma chave para um valor, por isso, quando você tentou armazenar algo em tabela hash você teve que especificar que você queria guardá-lo com uma chave específica, e que a chave determinada a localização do valor e onde seria armazenado. Você tem tipo de ambos os conceitos acontecendo ao mesmo tempo em um array PHP, e, como resultado, muitas vezes chamamos essas matrizes associativas onde estamos associando uma chave em um valor. Nesta próxima parte falamos de uma matriz PHP simples onde temos teclas a, b, e c, todas as cordas, o mapeamento para os inteiros 1, 2 e 3. E você pode ter chaves de diferentes tipos. Você pode ter algumas chaves que são cordas, algumas chaves que são inteiros. Pode ter valores de tipos diferentes. Você pode ter um valor que é uma cadeia, um valor que é um número inteiro, um valor que é um objeto ou outro array, por exemplo, tudo no objeto mesma matriz, que é meio estranho. Você não tem que ter uma matriz que só tem um tipo de elemento nele. Você pode ter muitas coisas diferentes acontecendo lá dentro. A outra coisa a notar é que quando você ver algo como isso no seu código, que é PHP válido para declarar uma matriz como esta, 0, 1, 2, 3, 4, 5, que vai declarar um inicializado $ arr ser esta matriz. Mas o que você está realmente começando sob o capô é este tipo de implícito geração de chaves onde temos 0-0, 1-1, 2-2, 3-3. E acontece que, mesmo se você tem uma matriz como esse cara aqui onde tem a, b e c como as teclas e depois de começar a usar o método push matriz para começar a usar este conjunto como uma pilha, assim você pode ver que este objeto de matriz, essa matriz é realmente fique sobrecarregado. Podemos usá-lo como uma matriz. Podemos usá-lo como uma tabela de hash. Podemos usá-lo como uma pilha. Quando você começar a empurrar as coisas para esta matriz a primeira coisa que você empurra para isso será o índice 0 e então o índice 1 e índice 2. Você pode obter este tipo de geração implícita de chaves a menos que você especifique-los explicitamente. A maneira como você especificar chaves explicitamente, é claro, é usando esta notação de colchetes, que é semelhante a matrizes, excepto em vez de apenas permitir índices inteiros aqui, agora vamos permitir que qualquer coisa. Se você quiser que a chave para ser uma seqüência, você especificá-lo como este. Se você quer que ele seja um int, você especifica com a int você deseja usar. Perguntas sobre o que até agora? Uma das coisas agradáveis ​​sobre esta ideia é que você só pode ter um valor armazenado com uma chave especial. Se voltarmos para o nosso aparelho, deixe-me excluir algumas dessas coisas. E digamos que eu inicializar um array para ser 0, 1, 2, feito. Se eu agora sei que, por exemplo, se eu echo $ arr [0] Eu estou indo para obter o valor 0 impressos, e uma vez que só pode ser sempre um valor armazenado para uma determinada chave se eu armazenar algo em $ arr [0], digamos, um, então eu sei que quando eu echo $ arr [0] de novo Eu não estou indo para obter 0 impressos como antes. Eu só estou indo para obter um. Portanto, este é basicamente dizendo que eu não posso ter $ arr [0] armazenar dois valores diferentes. Não pode armazenar 0 ea seqüência de um, como este, literalmente substitui o que estava em $ arr [0] anteriormente. A razão de eu trazer isso é executá-lo, ver o que acontece. Veja aqui que eu tenho 0 impressos e em seguida, uma aqui. Não há nova linha lá porque eu era preguiçoso e não colocar isso dentro O que é legal sobre isso é que podemos usar isso como uma forma para capturar essa idéia de um conjunto onde não podemos ter várias chaves dentro de uma matriz. Nós não podemos ter chaves idênticas dentro de uma matriz. Eu não posso ter tecla 0 eo valor 1 e 0 chave e um valor ou tecla 0 e verdadeiro valor. As teclas são todos só há uma chave na matriz. Mesmo que você pode ter o mesmo valor armazenado várias vezes na matriz sob diferentes chaves não é possível ter chaves idênticas várias vezes em sua matriz PHP. Se olharmos para este problema seguinte, unique.php, onde queremos abrir um arquivo PHP contendo uma lista de strings, uma string por linha, e queremos encontrar todas as seqüências únicas em que o arquivo tudo o que temos a fazer é usar uma dessas matrizes PHP e usar as cordas no arquivo como as chaves para essa matriz e manter a actualizar a nossa matriz como armazenar essas novas chaves. Como podemos ler cada linha fora do arquivo podemos armazená-lo na matriz, e no final teremos como nossas chaves em nossa matriz todas as cordas originais dentro do arquivo. Isso faz sentido? Vamos ver como isso funciona. Vamos abrir, de acordo com a especificação, um novo arquivo chamado unique.php. Abra. Opa, desculpe, novo arquivo. Nós vamos começar-a com as tags do mesmo início e fim. Nós estamos indo para salvá-lo na seção 9, e vamos chamá-lo de unique.php. Ok, agora zoom in A idéia aqui é abrir um arquivo, ler em arquivo linha por linha. Para cada linha no arquivo vamos ter uma matriz onde temos  a linha como a nossa chave. E então, quando chegarmos ao fim aqui Chaves $ arr são as linhas exclusivas a partir do arquivo, pois sabemos que se eu colocar em linha esta matriz várias vezes ele vai apenas manter substituindo o valor de idade, e nós podemos realmente colocar linha matriz como em si apenas como aquele. Isso é meio estranho. Nós estamos armazenando o mesmo valor de chave par mais e mais e mais uma vez, mas já que está garantido que haverá apenas uma tecla chamada linha Então, se temos um arquivo que diz-um arquivo de sons de animais e tem au, au, miau miau, moo, moo, e cada vez que lemos um ruído animal para fora como trama e armazená-lo em nossa matriz temos trama, e depois a segunda vez armazenamos trama que vai substituir a primeira vez que o guardou. No final, vamos ter apenas uma entrada na matriz para cada um dos ruídos de animais em nosso arquivo de ruídos animal. Vocês se sentem confiantes de que você pode resolver a abertura de um arquivo em PHP? Uma maneira de fazê-lo, vamos por este caminho rapidamente, de fazê-lo é com fopen, como vimos anteriormente. Você pode fopen some_file.txt. Você pode abri-lo em modo de leitura, assim como em C. Essa é uma maneira perfeitamente boa para fazê-lo. Você também, em seguida, para leitura no arquivo linha por linha têm as mesmas funções, muitos deles, que você fez em C. Você tem fgets. Você tem feof, embora não gosto de usar que porque, lembre-se, que não era grande na C. Você pode fazê-lo da mesma forma, mas aqui é uma coisa muito legal. Desculpe, eu não quero fazer $ arquivo, mas não há uma função chamada de arquivo em PHP, e esta função aqui é legal porque ele lê todo o conteúdo do arquivo que você especificar, de forma some_file.txt, lê todo o conteúdo desse arquivo em um array e então permite percorrer, o que é muito bacana. Se formos, por exemplo, para o nosso navegador e olhamos para o Google para o arquivo PHP você pode ver aqui que o nosso manual diz que lê arquivo arquivo inteiro em uma matriz, e podemos file_get_contents para retornar o conteúdo de um arquivo como uma string, mas normalmente apenas recebendo-o como uma matriz é muito bom porque o que ele faz é quebra-lo para que cada elemento na matriz é uma linha do arquivo, por isso, se olharmos para arquivo 0, que é a primeira linha do arquivo. Ficheiro de uma linha, em segundo lugar, lima 2, a terceira linha, e assim por diante e assim por diante. Não seria bom se isso era tudo o que tinha a fazer em C? Muito bacana. David mostrou isso na palestra, eo idioma que ele mostrou foi que, além de nosso padrão de loop em PHP tivemos que for ($ i = 0; i <10, i + +), e você pode fazer isso em PHP também, mesma coisa nós também temos essa construção legal chamado foreach. Foreach é realmente útil quando iterando arrays ou estas estruturas de dados porque ele permite que você retire cada elemento da matriz sem ter que fazer manualmente a indexação mesmo, sem ter que criar manualmente uma variável de índice, incrementa-o, puxe o valor na matriz nesse ponto, porque isso é uma coisa muito comum de se fazer. Você provavelmente já fez isso toneladas de vezes em que você estava fazendo coisas C ao longo do semestre, assim com este foreach podemos varrer essa matriz arquivo, ea sintaxe é que nós queremos agora loop sobre esta matriz e especificar que a variável que vamos usar para armazenar o elemento de matriz neste local, local para o âmbito deste loop foreach, é vamos chamá-lo de linha. Se for um arquivo de apenas palavras e não há uma palavra em uma linha poderíamos chamá-lo de palavra, bem como, realmente só você dar a este um nome, o que você quiser chamá-lo, e depois dentro do loop, você pode fazer o que quiser com esta linha variável. Se não é o suficiente para obter o valor da matriz e você também quiser obter o índice junto com ele você pode especificar um nome para o índice bem como o valor, e agora você tem acesso a duas variáveis. Você tem $ i e linha onde $ i é o índice na matriz, e linha é a linha que você recuperou do arquivo. Por exemplo, se quiséssemos imprimir echo 0 linha do arquivo como este, podemos fazê-lo apenas como este, "Linha $ i do arquivo é de R $ linha", e aqui é algo que também não vi ainda quer onde eu apenas totalmente ignorados durante este% s% d todo negócio que tivemos de lidar com a C, e, em vez eu fui direto para o escrever as variáveis ​​em linha na minha string. Isso é chamado de interpolação de variáveis, string interpolação onde você está enchendo as variáveis ​​na direita, eo intérprete PHP é inteligente o suficiente quando se está lendo através de uma cadeia que começa com a dupla cita- não aspas simples, com uma string entre apóstrofos você não pode fazer isso- mas com o dobro de strings entre aspas como se lê por ele está a olhar para as variáveis. É caçá-los, e se vê variáveis ​​que levará o valor da variável e enchê-lo para a cadeia se ele pode convertê-lo em uma representação de cadeia, o que é muito bacana. Por agora, vamos comentar o resto de tudo, salvar este, eo que podemos fazer agora é que podemos abrir um arquivo que podemos chamar de some_file.txt-vamos criar um novo arquivo e podemos colocar em um monte de coisas sem sentido aqui apenas para testar tudo para fora, salvá-lo, chamá-lo some_file.txt, como eu estou fazendo aqui em cima no topo, e agora, se eu diminuir o zoom apenas para se certificar que tudo está no mesmo diretório parece que eu tenho unique.php e some_file.txt no mesmo diretório. Se eu executar unique.php php ver como ele imprime cada linha no meu arquivo e que a linha é? Isso é muito poderoso, certo? Olha, que levou 3 linhas de código para abrir um arquivo. Bem, quatro linhas de código. Eu não posso contar, hoje, claramente. Mas realmente apenas duas linhas interessantes de código, porque os outros 2 foram as chaves, mas neste código muito fomos capazes de abrir um arquivo, percorrer-lo, puxe o número da linha e da própria linha e imprimi-lo. Coisas legais. Charlotte. [Charlotte] Eu tenho uma pergunta sobre a sintaxe. Então foreach lida com cada linha do arquivo que você abrir, e então, quando você quer fazer as coisas com cada linha que você acabou de fazê-lo como e, então, associar o valor. [Nate H.] O que você pode fazer aqui, a questão foi o foreach tem a ver com a matriz, de modo a sintaxe foreach é realmente foreach, e observe que não há espaço ou qualquer coisa entre a ea para cada. Eles têm de ir ao lado uns dos outros, e isso leva em uma matriz, e então você tem esta outra palavra-chave chamada como que tem que estar lá, e depois o que você pode colocar um nome de variável, caso em que você vai estar retirando os valores da matriz, não os índices, ou se você fizer isso, como temos escrito abaixo você pegar as chaves e os valores. Você tem elemento foreach da matriz ou par da matriz como introduzido ao valor ou apenas como valor. Dependendo do que você precisa, se você não precisa de chaves, então você pode ir com o valor. Se você quiser as teclas que você pode ir com eles também. [Charlotte] Eu também percebi que nunca declarou o i ou linha. Como ela mesmo sabe o que são? [Nate H.] O que você quer dizer com declarar? [Charlotte] Nós nunca disse a eles o que eu ou linha de meio. [Nate H.] Nós nunca disse o computador que eu ou linha significa em termos de- [Charlotte] de que eles estão indexadas ou que-eles [Nate H.] Nós nunca contou que este é suposto ser o índice ou a chave eo valor, e isso é porque esse é o interpretador PHP. Isto serve como declaração e diz que está bem, a chave vai ser uma variável chamada i armazenado em uma variável chamada i. O valor que vai ser armazenado em uma linha variável chamada, de modo que este serve como declaração dessas variáveis e diz $ i é uma chave, e US $ linha é um valor. Sim, Ella. [Ella] Se as chaves não são feitas numericamente como é que decidirá qual ordem que vai imprimir tudo? É exatamente como a ordem em que entrou em? [Nate H.] Vamos dar-lhe uma tentativa. Vamos criar uma variável chamada arr, e podemos fazer um vai para o 7. Vamos dizer que 0 vai para outra matriz com 1, 2 ou maçã. Digamos 7 vai para 1, b vai para 2, e 3 vai para 4. Este é um tipo de exemplo louco procurando porque estamos misturando strings e inteiros em todo o lugar. Não há nenhuma ordem real a essa matriz. Quero dizer, nós pode pedir tudo em ordem alfabética por as chaves. Poderíamos pedir tudo em ordem alfabética pelo valor. Poderíamos tentar e ter em conta que alguns são cordas, alguns são ints, e nós poderíamos tentar convertê-los todos para o mesmo tipo e ver o que acontece, ou poderíamos considerá-los no valor em que já foram digitados onde vamos colocar esse cara no primeiro, esse cara na segunda, esse cara em terceiro, esse cara na quarta, et cetera. Vamos ver o que acontece quando executamos este código. Se rolar para baixo e fazer o mesmo tipo de coisa, e aqui não é imprimir as novas linhas. Quando se ler coisas fora do arquivo que foi incluindo as novas linhas nos valores, que foi por isso que imprimiu bem, enquanto aqui isso não aconteceu, é por isso que tudo é esmagado juntos. Vamos acrescentar nessa nova linha só para fazer coisas boas. Vamos executar novamente, e então aqui olhar para o que aconteceu. É impresso tudo em ordem em que colocá-lo na matriz. Ele faz preservar a ordem nesse sentido. Voltando a este problema de únicos onde queremos ser capaz de iterar sobre um arquivo, e nós vamos dar-lhe some_file.txt, e vamos iterar sobre ele como este. Nós dissemos que queríamos usar uma matriz para ter certeza de que nós temos todo o linhas exclusivas de lá, e nós poderíamos fazer isso muito facilmente por apenas armazenar em uma matriz que nós, naturalmente, declarar fora do âmbito de um ciclo, e disse que, se nós usamos as linhas no arquivo como as chaves em nossa matriz se entramos em uma linha duplicada estaríamos substituindo o valor anterior. Não é sempre possível ter duas chaves que são idênticos na mesma matriz. Nós podemos fazer isso. Nós vamos nos livrar dessa declaração eco aqui. Aqui estamos armazenando a linha no arquivo em nossa matriz utilizando-se como a chave. Nada para ele, e verifica-se que não precisa mesmo de esta chave. Nós não precisamos que eu variável. Neste ponto, se fosse fazer outro laço foreach e nós para loop sobre cada arr e linha agora se eco-oops, desculpe. Nós não podemos usar a vírgula. Temos que usar isso como palavra-chave. Agora, se nós echo linha devemos obter todas as palavras originais em arquivo. Se formos até some_file.txt, e digamos que fazemos maçã, banana, maçã, maçã, banana, se estamos a imprimir todas as palavras únicas neste arquivo que só deve começar maçã e banana para imprimir. Se salvar este, agora aqui vamos zoom in, php unique.php, e ta-da. Nós sucesso uniqued o arquivo. A parte final deste problema está lhe pedindo para classificar essa matriz antes de você imprimiu porque neste exemplo simples que nós acabamos de fazer tivemos sorte no sentido de que o arquivo- fizemos este exemplo fictício com maçãs e bananas. Ele já estava classificada. Mas usando a função de classificação simples que você pode classificar uma matriz, que é muito bacana. A última coisa que eu queria falar com vocês sobre realmente rapidamente é que este tipo de PHP é tudo muito bem, e é super acessível saber como fazer, se você precisar de fazer pequenas, coisas rápidas de programação. Por exemplo, se eu preciso escrever um programa que, digamos, coloca todos em seções eu não estou indo para ir e escrever em C. Vai ser longa. Vai ser uma espécie de dor, especialmente se existem arquivos envolvidos, assim como vocês têm visto. É tão bom que com apenas este código muito bem aqui fomos capazes de rasgar através de um arquivo, retire todos os valores exclusivos e imprimi-los de volta. No entanto, para as suas atribuições, para seus projetos, se você está construindo sites com PHP é que o poder estamos executando nossos arquivos PHP através deste intérprete, eo intérprete está processando tudo dentro das tags PHP, deixando tudo mais intocada e cuspindo os resultados. Nós podemos fazer isso para construir HTML programaticamente. Agora, se voltar para a especificação, o último problema na especificação fala sobre essa idéia de concentrações e criação de um menu drop-down, que você pode ou não quer fazer, dependendo do que o seu projeto final está fazendo, que permite ao usuário selecionar a partir de uma lista de todos os possíveis concentrações uma sua concentração. Agora, este é um tipo de dor que digitar isso e tem que fazer tudo isso manualmente, especialmente quando você está tendo para se certificar que você tem todos os colchetes no lugar certo e todas as aspas no lugar certo, assim com o PHP, você pode fazer isso programaticamente, e você pode fazer isso muito rapidamente. Vamos ver como fazer isso. Nós vamos abrir um novo arquivo. Vamos colocar em nossas tags do PHP. Vamos chamá-lo de concentrations.php, e agora, quando você está fazendo isso, uma espécie de coisa boa para pensar quando você está tentando misturar e combinar seu PHP e HTML é descobrir, ok, o que é a parte que eu quero gerar programaticamente? Qual é a parte que eu possa gerar programaticamente? É verdade que você pode fazer tudo do seu HTML dentro de blocos de PHP. Você pode repetir todo o HTML como strings. Por exemplo, se eu quero começar a fazer as marcas selecionadas dentro de PHP Posso dizer eco, dizem selecionar concentração = nome, e depois lá embaixo Eu poderia ter outro tag eco ou outro eco chamado perto a seleção. Esta é uma maneira de fazê-lo porque o que este é, literalmente, vai fazer é imprimir essa string quando é executado através do intérprete PHP, portanto, o resultado será HTML. Se eu salvar este arquivo como é agora e eu corro concentrations.php php olha o que eu tenho. Eu tenho essa tag fechar abrir seleção. Se eu fosse fazer isso e eu fosse para salvar este resultado para um arquivo, dizer, concentrations.html espera, parece que o l passou para o outro lado agora se eu abrir aqui concentrations.html vedes que eu tenho um arquivo HTML válido. É que tipo de estranho? Estamos usando PHP para criar HTML, criar HTML válido. A maneira que nós estamos fazendo é que estamos apenas ter a impressão PHP o HTML que queremos imprimir. Este é, literalmente, como sites PHP estão funcionando. Quando você visita um site que envia para algo como alguma coisa, alguma coisa, alguma coisa ponto com barra index.php o computador é literalmente chamar index.php, executá-lo através do intérprete PHP, e qualquer lixo sai ele está enviando de volta para o navegador e dizendo ei, navegador, interpretar isso como HTML. O bom é que ele pode ser uma dor de escrever constantemente eco, eco, eco, eco e coloque tudo em citações como esta, por isso, se você quer escrever o HTML que vai ser estático-se que você pode fazê-lo assim, colocá-lo fora, fechá-lo, e aqui você só colocar dentro das tags PHP que você conhece você quer gerar programaticamente e, neste caso, é opção de tags que são uma dor de gerar. Por exemplo, poderíamos gerar uma opção tags mil fazendo algo parecido com isso, $ i <1000, i + + e dizendo o valor da opção de eco-= $ gritos, eu não posso fazer isso. Bem, vamos tentar e ver o que acontece. $ I e então dizer $ i