[Powered by Google Translate] [Seção 8 - Mais Confortável] [Rob Bowden - Harvard University] [Esta é CS50. - CS50.TV] Estas notas de secção semanas vão ser muito curto, então eu só vou continuar a falar, vocês vão continuar a fazer perguntas, e vamos tentar preencher o tempo, tanto quanto possível. Muitas pessoas pensam que este pset não é necessariamente difícil, mas é muito longo. A especificação pset si leva uma hora para ler. Nós damos-lhe um monte de SQL que você poderia possivelmente necessidade de usar. Nós levá-lo através de um monte de que, por isso não deve ser muito ruim. Alguém já começou ou terminou? É o pset passado. Oh, meu Deus. Normalmente há um JavaScript um depois, mas as coisas mudam calendário torna tudo uma semana mais curta, e não temos mais um pset JavaScript. Eu não sei como isso afeta se o JavaScript está indo para aparecer no exame ou Questionário 1. Imagino que será algo como que você precisa saber coisas de alto nível sobre JavaScript, mas duvido que tinha acabado de dar-lhe diretamente o código JavaScript já que não tinha um pset nele. Mas isso vai ser o material para análise teste na próxima semana. Seção de perguntas. Uma grande quantidade deste material é um pouco mal formulada, mas vamos discutir o porquê. Ao contrário de C, PHP é uma "dinamicamente tipada" idioma. O que isso significa, você pergunta? Bem, diga adeus a todos aqueles float, char, int e outras palavras-chave que você precisa para usar ao declarar variáveis ​​e funções em C. No PHP, tipo de uma variável é determinado pelo valor que está actualmente detém. Assim, antes de digitar esse código em um arquivo chamado dynamic.php, PHP é dinamicamente digitado. Isso é verdade. Eu discordo com o fato de que isso significa que estamos dizendo adeus a char, int, float, e outras palavras-chave. A diferença exata entre tipagem dinâmica e alternativa, que é digitado estaticamente, é que tipagem dinâmica, toda a sua verificação de tipo e material acontece em tempo de execução, enquanto que tipagem estática acontece em tempo de compilação. A palavra estática em geral parece significar coisas tempo de compilação. Eu acho que existem outros usos para ele, mas em C quando você declara uma variável estática, seu armazenamento é alocado em tempo de compilação. Aqui, tipagem dinâmica significa apenas que - Em C, se você tentar adicionar uma string e um inteiro, quando você compilar, ele vai reclamar, porque vai dizer que você não pode adicionar um int e um ponteiro. Não é apenas uma operação válida. Essa é outra coisa que nós vamos chegar a um segundo. Mas esse tipo de verificação, o fato de que ele se queixa em tempo de compilação, é a verificação de tipo estático. Há línguas em que você não precisa dizer float, char, int, e todas essas coisas, mas a linguagem pode dizer a partir do contexto da coisa que tipo que é suposto ser, mas ainda tipagem estática. Então, se você tomar 51, OCaml, nunca você precisa usar qualquer um desses tipos, mas ainda vai a tempo de compilação dizer que você não pode fazer isso porque você está misturando um int e uma corda. Dinamicamente digitado apenas significa que em algum momento durante o tempo de execução que você está indo para obter uma reclamação. Se você também usado Java antes de, em geral, quase todas as línguas do tipo C vai ser digitado estaticamente, de modo C, C + +, Java, todos estes são geralmente digitado estaticamente. Em Java, quando você compilar algo e você está dizendo string s equivale a algo novo que não é uma string, que vai reclamar porque esses tipos simplesmente não combinam. Que vai reclamar em tempo de compilação. Mas ele também tem algum tempo dinâmica coisas como se você tentar lançar alguma coisa para um tipo que é mais específico do que o seu tipo de corrente, não há nada que ele pode fazer em tempo de compilação para verificar se que o elenco está indo para ter sucesso. Java também tem algum tipo dinâmico verificar que, logo que se chega a esta linha de código quando ele é, na verdade, a execução, ele vai fazer o elenco, verificar se aquele elenco era válido, em primeiro lugar, e se não estiver, então ele vai reclamar que você tem um tipo inválido. Tipo dinâmico verificação. Digite isso em um arquivo chamado dynamic.php. Dynamic.php. Eu vou descompactar que a formatação. Nós temos uma variável, defina-o inteiro 7, então vamos imprimi-lo e s% - Ah, estamos imprimindo o tipo dele, de modo gettype vai retornar o tipo da variável. Estamos apenas a impressão do tipo de uma e outra vez. Nós apenas php.dynamic.php. Vamos ver o que ele muda de inteiro para string para Boolean como nós passamos. Em C não há nenhum tipo de dados Boolean, não há tipo de dados. Há char * e Boolean só tende a ser int ou char ou algo assim. No PHP estes tipos não existem, e isso é uma das grandes vantagens do PHP sobre C - seqüência de operações que são infinitamente mais fácil do que em PHP C. Eles só trabalhar. Assim, voltamos aqui. Corremos dynamic.php. Isto diz o intérprete PHP, chamado php, para executar o código PHP em dynamic.php. Se você tiver qualquer erro no arquivo, o intérprete irá dizer-lhe! O intérprete, esta é outra grande diferença entre PHP e C. Em C você tem que compilar algo em seguida, executar o arquivo compilado. No PHP você nunca compilar nada. Assim, o interpretador do PHP é, basicamente, apenas lendo esta linha por linha. Ela atinge var = 7, em seguida, ela atinge printf então ela atinge var então ela atinge printf e assim por diante. Há um pouco de compilar que faz, e ele armazena em cache os resultados por isso, se você executar o script mais tarde você pode fazer alguns, mas basicamente é uma linha por linha tipo de coisa. Isso significa que um monte de otimizações que nós começamos em C, como a compilação, é apenas geralmente o compilador pode fazer um monte de truques para você. Ele pode tirar as variáveis ​​utilizadas, pode fazer todos esses tipos de coisas, ele pode fazer recursão de cauda. No PHP você não está indo para obter essa vantagem porque só vai começar a executar linha por linha por linha, e ele realmente não se reconhecer essas coisas tão facilmente já que não é um passo de compilação de grande sobre a coisa e, em seguida, a execução; é só linha por linha. Então esse é o intérprete. Voltar para a nossa tipagem dinâmica: muito legal, né? Você definitivamente não poderia fazer isso em C! Agora, veja se você consegue descobrir o tipo de cada um dos seguintes valores. Veja este para referência. Então, 3,50. Que tipo você acha que vai ser? Aqui estão os tipos que temos. Temos bools, inteiros, pontos flutuantes, strings, arrays, objetos, e recursos, que é uma espécie de vaga. Eu acho que há, na verdade, um exemplo aqui. Então há NULL. NULL é um tipo especial. Ao contrário de C onde NULL é apenas um ponteiro com o endereço 0, em PHP, NULL é o seu próprio tipo, onde a única coisa válida de que tipo é NULL. Isso é muito mais útil para verificação de erros. Em C, onde tivemos esta questão onde se você retornar NULL, isso significa que você está retornando um ponteiro NULL ou usar NULL para indicar erro ou toda essa confusão que teve em um ponto. Aqui, retornando NULL geralmente significa erro. Um monte de coisas também retornar false para erro. Mas o ponto é o tipo NULL, a única coisa do tipo NULL é NULL. Então callback é como você pode definir algumas funções anônimas. Você não tem que dar a função de um nome, mas você não terá que lidar com isso aqui. Olhando para os tipos que eles esperam que a gente sabe, o que você acha do tipo de 3,50 é? >> [Aluno] Float. Sim. Então aqui, o que você acha do tipo de que é isso? >> [Aluno] Array. Sim. A primeira foi a bóia, a segunda é uma matriz. Observe que essa matriz não é como uma matriz C onde você tem índice 0 tem algum valor, índice 1 tem algum valor. Aqui, os índices são a, b, e c, e os valores são 1, 2, e 3. No PHP, não há diferença entre uma matriz associativa e apenas uma matriz comum como seria de pensar nisso em C. Não é apenas isso, e debaixo do capô uma matriz regular é apenas uma matriz associativa onde 0 mapas para algum valor da mesma maneira uma mapas para algum valor. Por este motivo, o PHP pode ser muito ruim para realmente rápidos / code aferição coisas já que em C, quando você estiver usando uma matriz que você sabe que o acesso a um membro é tempo constante. No PHP acessando um membro é quem sabe quanto tempo? Provavelmente é constante se hashes corretamente. Quem sabe o que ele está realmente fazendo debaixo do capô? Você realmente precisa de olhar para a implementação para ver como ele vai lidar com isso. Então fopen. Eu acho que aqui vamos apenas PHP fopen manual para olhar para o tipo de retorno. Vemos aqui que você pode olhar para cima praticamente qualquer função no manual do PHP e este é o tipo de homem a página do PHP. O tipo de retorno vai ser de recursos. É por isso que eu olhei para cima, porque nós realmente não definir recursos. A idéia de recurso, em C você tem um tipo de arquivo * ou o que quer; em PHP o recurso é o seu arquivo *. É o que você vai estar lendo, é o que você vai ser escrevendo. É geralmente externo, por isso é um recurso que você pode puxar coisas e atirar coisas para. E, finalmente, qual é o tipo de NULL? >> [Aluno] NULL. Sim. Então a única coisa que é NULL é NULL. NULL é NULL. Uma característica do sistema PHP tipo (para melhor ou para pior) é a sua capacidade de fazer malabarismos tipos. Quando você escrever uma linha de código PHP que combina valores de diferentes tipos, PHP vai tentar fazer a coisa sensata. Experimente cada uma das seguintes linhas de código PHP. O que está impresso? É o que você esperava? Por que ou por que não? Este fato sobre o PHP é o que faz o que chamamos de fracamente tipada. Fracamente digitado e rigidez, existem usos diferentes para esses termos, mas a maioria das pessoas usam fracamente digitado e rigidez para dizer esse tipo de coisa onde ("1" + 2), que funciona. Em C que não iria funcionar. Você pode imaginar isso não funciona. Um monte de gente misturar tipagem dinâmica e tipagem fraca e tipagem estática e tipagem forte. Python é outro exemplo de uma linguagem que é dinamicamente digitado. Você pode jogar em torno de tipos de variáveis ​​e que vai determinar em tempo de execução quaisquer verificações de erro. Em Python vai executar isso e vai ver ("1" + 2); e isso vai falhar porque ele diz que você não pode adicionar uma string e um inteiro. No PHP, que é tão tipagem dinâmica, isso não vai falhar. Tipagem fraca tem a ver com o fato de que ele faz coisas com tipos que realmente não faz sentido necessariamente. Então ("1" + 2), eu posso imaginar que ser o de 12 cordas, eu posso imaginar que seja a seqüência de três, Eu posso imaginar que seja o 3 inteiro. Não é necessariamente bem definido, e nós provavelmente vamos ver aqui que quando imprimir ("1" + 2), que provavelmente vai acabar por ser diferente de impressão (1 + "2"). E isso tende a ser, na minha opinião, para pior. Aqui podemos experimentar estes. Outro truque pouco sobre PHP é que você não precisa realmente gravar o arquivo. Ele tem de executar este modo de comando. Então php-r, então podemos jogar no comando aqui: "Print ('1 '+ 2);" e eu vou lançar uma nova linha. Este impresso 3. Parece que ele imprime 3 e é o 3 inteiro. Então, agora vamos tentar o contrário: "Print (1 + 2"); Nós temos 3, e é isso também vai ser inteiro 3? Sinceramente, não tenho idéia. Parece que é consistente. Nunca há qualquer chance de ele ser o 12 cordas ou qualquer coisa assim porque o PHP, ao contrário de JavaScript e Java também, tem um operador separado para concatenação. Concatenação em PHP é ponto. Assim, a impressão (1 '2 '.); Vai dar-nos 12. Isso tende a levar a uma confusão onde as pessoas tentam fazer algo como str + = alguma outra coisa que eles querem adicionar para o fim de sua corda, e que vai falhar. Você precisa fazer str. = Então não se esqueça de concatenação em PHP é um ponto. Outras coisas para tentar: print ("CS" + 50); Eu já lhe disse que não há esperança de que isto resulte na CS50 desde que não é a concatenação +. O que você acha que isso vai acabar sendo? Eu sinceramente não tenho absolutamente nenhuma idéia. Parece que é apenas 50. Ele vê a corda, e eu aposto que se colocarmos 123CS - Ele vê a primeira corda, ele tenta ler um número inteiro de que ou um número a partir dele. Neste caso, vê 123CS. "Isso não faz sentido como um número inteiro, então eu só vou pensar em 123." Então 123 + 50 vai ser 173. E aqui começa a ler isso como um número inteiro. Ele não vê nada, por isso só trata como 0. Então 0 + 50 vai ser 50. Isto que eu estou supondo que vai fazer algo semelhante. Estou pensando 99. Sim, porque vai levar a primeira - Então, 99. Aqui (10/7), se este fosse C, o que teria que voltar? [Estudante] 1. >> Sim, seria um porque 10/7 é dividir 2 números inteiros. Um inteiro dividido por um número inteiro vai retornar um inteiro. Ele não pode retornar um qualquer ponto que seria, por isso só vai retornar 1. Aqui impressão (10/7), que vai realmente interpretar isso. E isso significa que se você realmente quer fazer arredondamento inteiro e coisas assim, você precisa fazer impressão (piso (10/7)); Em C é provavelmente estranho que você pode confiar em truncamento inteiro regularmente, mas em PHP você não pode porque ele será automaticamente transformá-lo em um carro alegórico. E depois (7 + true), o que você acha que vai ser? Eu estou supondo que 8 se ele vai interpretar como uma verdadeira. Parece que é 8. Então, qualquer coisa que fizemos nos últimos 10 minutos que você nunca deve fazer absolutamente. Você vai ver o código que faz isso. Ela não tem de ser tão simples como este. Você pode ter duas variáveis, e uma variável passa a ser uma string e outra variável passa a ser um int, e depois de adicionar essas variáveis ​​juntas. Desde o PHP é tipada dinamicamente e não vai fazer qualquer tipo de verificação para você E já que é fracamente digitados e, uma vez que só irá automaticamente jogar essas coisas juntos e tudo vai funcionar, é difícil até mesmo saber que esta variável deve ser uma seqüência de agora, por isso não deve adicionar a essa variável, que é um inteiro. A melhor prática é se uma variável é uma string, mantê-lo como uma string para sempre. Se a variável é um int, mantê-lo como um int para sempre. Se você quer lidar com números inteiros e strings, você pode usar varsint - que é JavaScript. Intval. Eu faço isso o tempo todo. PHP e JavaScript eu misturo tudo. Então intval vai retornar o valor inteiro de uma variável. Se passar em "print (intval ('123 ')), você começa 123. Intval si só não vai fazer o cheque para nós que é exclusivamente um inteiro. O manual do PHP, existem apenas funções tantas disponível, então aqui eu acho que o que eu usaria é is_numeric primeiro. Eu estou supondo que retornou falso. Isso é outra coisa que temos que passar por cima é. === Então is_numeric ('123df '), você não pensaria que, como is_numeric. Em C, você teria que iterar sobre todos os personagens e verificar para ver se cada personagem é o dígito ou o que quer. Aqui is_numeric vai fazer isso por nós, e ele está retornando falso. Então, quando eu impressa, é impresso nada, então aqui estou comparando-o a ver, se acontecer de você ser falsa? E agora ele está imprimindo um. Aparentemente, ele imprime um como verdadeiro em vez de imprimir verdadeiro como verdadeiro. Gostaria de saber se posso fazer print_r. Não, ele ainda faz um. Voltando ao ===, == ainda existe, e se você falar com Tommy ele vai dizer == é perfeitamente bem. Eu vou dizer que == é terrível e você nunca deve usar. == A diferença é que as coisas == compara onde pode ser verdadeiro mesmo se eles não são do mesmo tipo, Considerando === compara coisas e primeiro, verifica são eles mesmo tipo? Sim. Ok, agora eu vou ver se eles realmente comparar a ser igual. Você começa coisas estranhas como 10 é igual a - vamos ver o que diz. Então ('10 '== '1 e1'); Isso retorna verdadeiro. Alguém tem algum palpite porque este retorna verdade? Não é apenas sobre isso. Talvez esta seja uma dica. Mas se eu mudar isso para um f - Droga! Eu continuo usando aspas duplas. A razão das aspas estão gritando comigo é porque eu coloquei isso em aspas. Então, eu poderia escapar as aspas aqui, mas aspas simples torná-lo mais fácil. Então ('10 '== '1 f1'); não imprime verdade. ('10 '== '1 E1'); imprime verdade. [Estudante] É hexa? >> Não é hexa, mas está perto que é como - Notação, 1e1 científica. Ele reconhece como 1e1 1 * 10 ^ 1, ou o que seja. Esses são números inteiros iguais. Se fizermos === então vai ser falsa. Eu realmente não tenho idéia se nós fazemos o que dizer == (10 e '10abc ');? Tudo bem. Então, isso é verdade. Assim como quando você fez (10 + '10abc '), e que seria 20, aqui (10 == '10abc '); é verdadeiro. Pior ainda são coisas como (falsa == NULL); é verdade ou (falso == 0); é verdadeira, (falso == []); Há casos estranhos de - Isso é um daqueles casos estranhos. Observe que (false == []); é verdade. ('0 '== False); é verdade. ('0 '== []); É falso. Então == não é de forma transitiva. um pode ser igual a um e b pode ser igual a c, mas b pode não ser igual a c. Isso é uma abominação para mim, e você deve sempre usar. === [Aluno] Podemos fazer! == Também? >> [Bowden] Sim. O equivalente seria! = E! ==. Isto é, na verdade, trouxe-se na especificação pset onde um monte de retorno funções - O manual do PHP é bom sobre isso. Ela coloca em uma grande caixa vermelha "Isso irá retornar falso se não há um erro." Mas retornando 0 é uma coisa perfeitamente razoável para voltar. Pense em qualquer função que é esperado para retornar um inteiro. Vamos dizer que esta função deve contar o número de linhas em um arquivo ou algo assim. Em circunstâncias normais, você passa esta função um arquivo e que vai retornar um inteiro que representa o número de linhas. Então, 0 é um número perfeitamente razoável se o arquivo é apenas vazio. Mas o que se você passar um arquivo inválido ea função acontece a retornar falso se você passar um arquivo inválido? Se você acabou de fazer == você não está diferenciando o caso entre arquivo inválido e arquivo vazio. Usar sempre. === Isso é tudo isso. No PHP, o tipo de matriz é diferente do que você está acostumado em C. Na verdade, você já deve ter notado esta acima de quando você viu que este é do tipo Array. A sintaxe suporte é novo no PHP 5.4, que é a mais nova versão do PHP. Antes isso, você sempre tinha que escrever array ('a' -> 1, 'b' -> 2. Esse foi o construtor para uma matriz. Agora PHP finalmente chegou perto para a sintaxe agradável de apenas colchetes, que é apenas muito melhor do array. Mas, considerando o PHP 5.4 é a versão mais recente, você pode encontrar lugares que não têm sequer PHP 5.3. Durante o verão, corri para este problema em PHP 5.3 era o que tínhamos no aparelho, mas o servidor que implantado todo o livro o nosso grau e enviar e todas as coisas que a era PHP 5.4. Não sabendo disso, desenvolvemos em 5,3, empurrou para 5,4, e agora, de repente nenhum de nosso código funciona porque não aconteceu ter sido mudanças entre 5,3 e 5,4 que não são compatíveis, e nós temos que ir e corrigir todas as nossas coisas que não funcionam para PHP 5.4. Para esta classe, uma vez que o aparelho tem PHP 5.4, é perfeitamente possível usar colchetes. Mas se você está olhando para as coisas ao redor da Internet, se você está procurando algum tipo de material matriz, o mais provável é que você vai ver o feitiço fora sintaxe construtor de matriz desde que existe desde o PHP nasceu e sintaxe de colchetes tem sido em torno dos últimos dois meses ou sempre que 5,4 veio ao redor. Isto é como índice de você. Assim como em C como se fosse o índice por colchetes como $ array [0], array $ [1], array $ [2], você índice da mesma forma se acontecer de você ter seus índices sendo cordas. Matriz para array $ ['a'] e $ ['b']. $ Array [b]. Por que isso seria errado? Ele provavelmente irá gerar um aviso, mas ainda funciona. PHP tende a fazer isso. Ela tende a apenas: "Eu estou indo para avisá-lo sobre isso, mas eu só vou continuar "E fazer o que eu puder." Ele provavelmente irá traduzir isso para uma string, , mas é possível que, em algum ponto no passado alguém disse definir b ser 'OLÁ MUNDO ". Então, agora b poderia ser uma constante de matriz e US $ [b] vai ser realmente fazendo "OLÁ MUNDO". Eu acho que neste momento, ou pelo menos nossas configurações PHP, se você tentar índice em uma matriz e essa chave não existe, ele irá falhar. Eu não acho que isso só vai te avisar. Ou pelo menos, você pode configurá-lo para que ele não apenas adverti-lo, apenas em linha reta até falhar. A maneira como você verificar para ver se há realmente um tal índice é isset. Então isset ($ array ['OLÁ MUNDO']) retornará falso. isset ($ array ['b']) retornará true. Você pode misturar essas sintaxes. Tenho certeza de que essa matriz acabaria sendo é - Nós podemos testá-lo. Oh, eu preciso de PHPWord. Este é misturar a sintaxe onde você especificar o que é a chave e você não especificar o que está a chave. Então 3 aqui é um valor. Você não disse explicitamente que a sua chave é que vai ser. O que você acha de sua chave vai ser? [Estudante] 0. >> Eu estou supondo 0 só porque é o primeiro que não especificou. Nós podemos realmente fazer um par desses casos. Então print_r é imprimir recursiva. Ele irá imprimir toda a matriz. Seria imprimir subarrays da matriz, se houvesse algum. Então print_r ($ array); php.test.php. Ele se parece com ele deu 0. Na verdade, há algo a ter em mente aqui, mas vamos voltar a ele em um segundo. Mas o que se acontecer de eu fazer este índice 1? PHP não faz diferença entre os índices de cordas e índices inteiros, por isso neste momento tenho apenas definido um índice 1 e eu posso fazer tanto a matriz $ [1] e $ array ['1 '] e será o mesmo índice e a mesma chave. Então agora o que você acha 3 vai ser? >> [Aluno] 2. >> [Bowden] Eu estou supondo 2. Sim. É 2. O que se fizéssemos isso é 10, é 4? O que você acha que o índice de 3 vai ser? Estou pensando 11. Meu palpite sobre o que o PHP faz - e eu acho que já vi isso antes - É só se mantém informado do que o maior índice numérico que é usado até agora é. Isso nunca vai atribuir um índice de seqüência para 3. Será sempre um índice numérico. Por isso, mantém o controle do mais alto é atribuído até agora, que passa a ser 10, e vai dar 11-3. O que eu disse antes, observe a forma como ele está a imprimir essa matriz. Ela imprime 10, tecla 4, chave 11, chave d. Ou mesmo vamos fazer - Eu acho que eu não coloquei a 0, mas é a impressão 1, 2, 3, 4. E se eu mudar aqui? Ou vamos realmente mudar esses 2. Agora que imprime 2, 1, 3, 4. Matrizes do PHP não são como a sua tabela regular de hash. É perfeitamente razoável pensar neles como tabelas de hash de 99% do tempo. Mas em suas tabelas de hash não há sentido da ordem em que as coisas estavam inseridos. Assim, logo que você inserir na tabela hash, assumir que não há lista de ligações e você pode julgar dentro de uma lista ligada a qual foi inserida em primeiro lugar. Mas aqui estamos inseridos dois primeiro e sabe quando é imprimir essa matriz que 2 vem em primeiro lugar. Não imprimi-lo em apenas um fim qualquer. A estrutura de dados técnicos que ele está usando é um mapa ordenado, assim que mapeia chaves para valores e recorda a ordem em que as chaves foram inseridas. Basicamente é para algumas complicações em que é chato para realmente - Vamos dizer que você tem uma matriz 0, 1, 2, 3, 4, 5 e você quer tirar índice 2. Uma maneira de fazê-lo, vamos ver o que parece. 0, 2, 1, 3, 4. Unset acontece para remover as duas variáveis ​​e índices da matriz. Então unset ($ array [2]); Agora, o que isso vai parecer? 2 é apenas ido embora, de modo que é perfeitamente bem. Mais irritante é se você quer que as coisas realmente ser como uma matriz. Vou colocar números aleatórios. Agora, observe os meus índices. Eu quero que seja apenas como uma matriz C, onde ele vai de 0 a duração - 1 e eu posso iterar sobre ele como tal. Mas assim que eu remover o segundo índice, que estava no índice 3 não agora se tornou índice 2. Em vez disso, apenas remove esse índice e agora você vai de 0, 1, 3, 4. Isto é perfeitamente razoável. É apenas irritante e você tem que fazer coisas como emenda matriz. Sim. [Aluno] O que aconteceria se você tivesse um loop e você queria passar por cima de todos os elementos? Quando bateu dois, seria render sempre? Iteração sobre uma matriz. Há duas maneiras de fazer isso. Você pode usar um regular para loop. Esta é uma outra complexidade do PHP. A maioria das linguagens, eu diria, têm algum tipo de comprimento ou len ou algo indica o comprimento de uma matriz. No PHP é contagem. Então count ($ array); $ i + +) Vamos apenas impressão ($ array [$ i]); Aviso: Undefined offset: 2. Ele só vai falhar. Esta é a razão que, para a maior parte, você nunca precisa iterar sobre uma matriz como este. Pode ser um exagero, mas você nunca precisa iterar sobre uma matriz como esta porque o PHP fornece sua sintaxe foreach onde foreach (array $ quanto $ item). Agora, se nós imprimir ($ item); - nós discutir isso em um segundo - que funciona perfeitamente bem. A maneira que foreach está trabalhando é o primeiro argumento é a matriz que você está iterando. E o segundo argumento, item, através de cada passagem do loop que vai assumir a próxima coisa na matriz. Então lembre-se a matriz tem uma ordem. A primeira vez através do loop for, o item vai ser 123 , então ele irá ser de 12, em seguida, ela será de 13, então ele irá ser de 23, então será 213. As coisas ficam realmente estranho quando você faz algo como foreach. Vamos ver o que acontece, porque você nunca deve fazer isso. E se nós unset ($ array [1]); Que provavelmente foi o esperado. Você está interagindo sobre essa matriz, e cada vez que você está desconfigurar o primeiro índice. Então, para o índice 0, a primeira coisa item, assume valor 0, por isso vai ser 123. Mas dentro do loop que unset índice 1, o que significa 12 está desaparecido. Assim imprimir. PHP_EOL. PHP_EOL é apenas mudança de linha, mas é tecnicamente mais portátil desde novas linhas no Windows é diferente de novas linhas no Mac e UNIX. No Windows nova linha é \ r \ n, enquanto que em qualquer outro lugar que tende apenas para ser \ n. PHP_EOL é configurado para que ele usa o que quer que a nova linha do seu sistema é. Assim que imprimir. Não vamos print_r ($ array) no final. Eu não tinha idéia de que isso seria o comportamento. Item ainda assume o valor de 12 mesmo que unset 12 antes de nós sempre tem para ele a partir da matriz. Não tome minha palavra sobre isso, mas parece que foreach cria uma cópia da matriz e então o item assume todos os valores de que a cópia. Assim, mesmo se você modificar a matriz dentro do loop for, ele não vai se importar. Item será assumir os valores originais. Vamos tentar desarmar-lo. E se este é de R $ array [1] = "Olá"; Mesmo que colocar "Olá" para a matriz, nunca item leva nesse valor. Há uma outra sintaxe para foreach laços onde você colocar duas variáveis ​​separadas por uma flecha. Esta primeira variável vai ser a chave deste valor, e esta segunda variável vai ser o mesmo item exato. Isso não é interessante aqui, mas se voltarmos ao nosso caso original de 'a' -> 1, 'B' -> 1, aqui se apenas iterar para cada matriz como item, o item vai ser uma cada vez. Mas se nós também queremos saber a chave associada com esse item depois fazemos as $ chave -> item $. Então agora podemos fazer impressão (tecla $. ':'. Agora está iterando e impressão de cada chave e seu valor associado. Uma coisa adicional que podemos fazer em foreach loops é que você pode ver esta sintaxe. E comercial antes de nomes de variáveis ​​tendem a ser como o PHP faz referências. Onde as referências são muito semelhantes aos ponteiros, você não tem ponteiros, então você nunca lidar com a memória diretamente. Mas você tem referências onde uma variável refere-se a mesma coisa que outra variável. Aqui dentro, vamos fazer $ item. Vamos voltar a 1, 10. Vamos fazer $ item + +; que ainda existe em PHP. Você ainda pode fazer + +. php.test.php. Eu tenho que imprimi-lo. print_r ($ array); Nós imprimir 2, 11. Se eu tivesse feito foreach (array $ quanto $ item) então o item será o valor 1 pela primeira vez através do loop. Ele irá incrementar 1-2 e depois estamos a fazer. Então ele vai passar a segunda passagem do laço e esse item é de 10. É item de incrementos a 11, e depois que acabou jogado fora. Então nós print_r ($ array), e vamos ver o que este é apenas um de 10. Assim, o incremento que fizemos foi perdido. Mas foreach (array $ a & $ item) agora esse item é o mesmo item como este aqui. É a mesma coisa. Então item de R $ + + está modificando matriz 0. Basicamente, você também pode fazer $ k -> array $ item e você pode fazer [$ k] + +; Assim, uma outra maneira de fazer isso, nós somos livres para modificar item, mas isso não vai modificar a nossa matriz original. Mas se usarmos k, que é a nossa chave, então podemos apenas o índice em nossa matriz usando a chave e incrementar isso. Esta mais diretamente modifica nossa matriz original. Você pode até fazer isso se por algum motivo você queria que a capacidade de modificar - Na verdade, isso é perfeitamente razoável. Você não queria ter que escrever $ array [$ k] + +, você só queria escrever $ item + +, mas você ainda queria dizer if ($ k === 'a') então incrementar item e, em seguida, imprimir a nossa matriz. Então agora o que nós esperamos print_r fazer? Que valores devem ser impressos? [Estudante] 2 e 10. >> [Bowden] Só se a chave era 'a' nós realmente imprimir isso. Você, provavelmente, muito raramente, ou nunca, será necessário definir funções em PHP, mas você pode ver algo semelhante, onde você define uma função como qualquer função. Normalmente você diria ($ foo, $ bar) e, então, definir que ele seja o que for. Mas se eu fizer isso, então isso significa que o que chama de qualquer coisa, qualquer que chama baz, de modo que o primeiro argumento passado para baz pode ser alterado. Vamos fazer $ foo + +; e aqui dentro, vamos fazer baz ($ item); Agora nós estamos chamando uma função. O argumento é tomado por referência, o que significa que, se modificá-lo estamos modificando a coisa que foi passado dentro E a impressão desse esperamos - a menos que eu errei sintaxe - temos 2, 11, assim foi, na verdade, incrementado. Observe que precisamos referências em dois lugares. E se eu fiz isso? O que isso significa? [Aluno] vai mudar. Sim >>. Item é apenas uma cópia do valor na matriz. Assim, o item irá mudar a 2, mas a matriz ['a'] ainda será 1. Ou o que se eu fizer isso? Agora item é enviado como cópia de Baz. Portanto, a cópia do argumento será incrementado para 2, mas o item em si nunca foi incrementado para 2. E item é a mesma coisa que o suporte de matriz que seja, de modo que a matriz nunca foi incrementado. Assim, ambos os lugares precisam. PHP é geralmente muito inteligente sobre isso. Você pode pensar que eu quero passar por referência - Esta foi realmente uma pergunta sobre uma das Série de Exercícios. Foi uma coisa questions.txt onde disse: Por que você quer passar essa estrutura por referência? Qual foi a resposta? [Aluno] Então você não tem que copiar algo grande. Sim >>. Uma estrutura pode ser arbitrariamente grande, e quando você passar a estrutura como um argumento ele precisa copiar a estrutura inteira para passá-lo para a função, enquanto que se você apenas passar a estrutura por referência então ele só precisa copiar um endereço de 4 bytes como argumento para a função. PHP é um pouco mais inteligente do que isso. Se eu tiver alguma função e eu passar para ele uma série de coisas 1000, isso significa que ele vai ter que copiar todo 1.000 dessas coisas para passar para a função? Ele não tem que fazer isso imediatamente. Se dentro desta função nunca realmente modifica foo, por isso, se ($ foo === 'Olá') return true.; Observe que na verdade nunca modificou o interior argumento dessa função, o que significa que tudo o que foi passado como nunca foo precisa ser copiado porque não é modificá-lo. Assim, a maneira PHP obras é os argumentos são sempre passados ​​por referência até que você realmente tentar modificá-lo. Agora, se eu digo $ foo + +, que vai agora fazer uma cópia do foo original e modificar a cópia. Isso economiza algum tempo. Se você nunca está tocando esta enorme variedade, você nunca realmente modificá-lo, ele não precisa para fazer a cópia, enquanto que se nós só colocamos esse comercial que significa que nem mesmo copiá-lo mesmo se você modificá-lo. Esse comportamento é chamado de cópia na gravação. Você vai vê-lo em outros lugares, especialmente se você tirar um curso de sistema operacional. Copy-on-write é um padrão bastante usual em que você não precisa fazer uma cópia de algo a menos que seja realmente mudando. Sim. [Aluno] E se você tivesse o incremento dentro do teste, tão somente o elemento 1 de 1000 terá de ser mudado? Não tenho a certeza. Eu acho que seria copiar a coisa toda, mas é possível que ele é inteligente o suficiente para que - Na verdade, o que eu estou pensando é imaginar que tínhamos uma matriz que fica assim: $ array2 = [ Então índice de 'a' é uma matriz de [1 2 3 4], índice e 'b' é uma matriz de qualquer coisa. Eu preciso de vírgulas entre todos esses. Imagine que há vírgulas. Em seguida, 'c' é o 3 valor. Okay. Agora vamos dizer que temos $ baz ($ array2); onde baz não tomar esta referência. Então $ foo ['c'] + +; Este é um exemplo onde estamos passando array2 como um argumento e em seguida, é a modificação de um índice específico da matriz, incrementando-lo. Eu honestamente não tenho idéia do que o PHP vai fazer. Ele pode facilmente fazer uma cópia de toda a coisa, mas se ele é inteligente, ele vai fazer uma cópia destas chaves, onde esta terá seu valor distinto mas esta ainda pode apontar para a mesma matriz 1,2,3,4 e isto pode ainda apontar para a mesma matriz. Vou iPad lo. Passamos essa matriz onde esse cara pontos a 3, isso aponta para cara [1,2,3,4], esse cara aponta para [34, ...] Agora que estamos passando para baz, estamos modificando isso. Se o PHP é inteligente, ele pode apenas fazer - Nós ainda tinha que copiar alguma memória, mas se houvesse essas subarrays enormes aninhadas nós não precisamos copiar os. Eu não sei se é isso que ele faz, mas posso imaginar que ele está fazendo isso. Esta também é uma vantagem muito grande de C sobre PHP. PHP torna a vida muito mais fácil para um monte de coisas, mas você meio que tem absolutamente nenhuma idéia de como ele irá executar porque eu não tenho nenhuma idéia debaixo do capô quando se está a fazer estas cópias de coisas, oh, é que vai ser uma cópia de tempo constante, É só vai mudar um ponteiro, é que vai ser uma cópia ridiculamente difícil linear? E se não pode encontrar espaço? Será que precisa então para executar a coleta de lixo para conseguir espaço um pouco mais? E coleta de lixo pode tomar arbitrariamente longo. Em C você não tem que se preocupar com essas coisas. Cada linha que você escreve você pode raciocinar muito bonita sobre como vai executar. Vamos olhar para estes. Que bom é que você não tem que lidar com funções de hash, listas ligadas, ou qualquer coisa assim? Desde que trabalho com tabelas de hash é tão fácil agora, aqui está um quebra-cabeça divertido para trabalhar. Abrir um arquivo chamado unique.php e nela escrever um programa PHP (Também conhecido como um "script"). Nós tendemos a chamá-los de scripts se eles são coisas pequenas que você executa na linha de comando. Basicamente, qualquer linguagem que você não compilar, mas você está indo para executar o arquivo executável na linha de comando, você pode chamar esse script executável. Eu poderia muito bem escrever um programa em C que faz isso, mas eu não chamá-lo de um script desde que eu compilar e executar o binário. Mas este programa PHP vamos chamar um script. Ou se escreveu em Python ou Perl ou Node.js ou qualquer uma dessas coisas, nós chamá-los de todos os scripts porque você executá-los na linha de comando mas não compilá-los. Nós poderíamos fazer isso muito rapidamente. Nós não estamos indo para usar argv. Vamos apenas explodir por isso. Chame-o único, escrever um programa. Você pode assumir que a entrada irá conter uma palavra por linha. Na verdade, argv será bem simples de se usar. unique.php. Primeiro de tudo, queremos verificar se foram passados ​​um argumento de linha de comando. Assim como seria de esperar argc e argv em C, ainda temos aqueles em PHP. Então, se ($ argc! == 2) então eu não vou lidar com a impressão de uma mensagem ou qualquer coisa. Eu só vou sair, código de erro de 1. Eu também poderia retornar 1. Raramente em PHP você está neste estado onde estamos - Normalmente, você está em uma função chamada por uma função chamada por uma função chamada por uma função. E se algo der errado e você só quer sair tudo inteiramente, saída apenas encerra o programa. Isto também existe em C. Se você estiver em uma função em uma função em uma função em uma função e você quer apenas matar o programa, você pode chamar de saída e ele vai sair. Mas em PHP é ainda mais raro que estamos neste nível superior. Normalmente estamos dentro de algum tipo de função, por isso chamamos de saída de modo que não temos de voltar-se uma coisa que, então, percebe que há um erro assim que retorna-se se reconhece que houve um erro. Nós não querem lidar com isso, então sair (1); retorno (1), neste caso, seria equivalente. Então, o que nós queremos abrir queremos fopen. Os argumentos vão olhar bastante semelhantes. Queremos fopen ($ argv [1], e queremos abri-lo para leitura. Que retorna um recurso que nós vamos chamar f. Isso parece muito semelhante à forma como C faz isso, exceto que não temos a dizer * FILE. Em vez disso, apenas dizer $ f. Okay. Na verdade, eu acho que isso ainda nos dá uma dica de PHP função chamada arquivo. Arquivo PHP. O que é que isto vai fazer é ler um arquivo inteiro em uma matriz. Você não precisa mesmo de fopen-lo. Ele vai fazer isso por você. Então $ linhas = file ($ argv [1]); Agora, todas as linhas do arquivo são em linhas. Agora queremos classificar as linhas. Como podemos classificar as linhas? Nós classificar as linhas. E agora podemos imprimi-los ou o que seja. Provavelmente a maneira mais fácil é foreach ($ lines as $ linha) echo $ linha; [Aluno] não seria mesmo de cruzar as linhas, fazendo referência a algo em espécie? Este é o lugar onde tipo pode ser definido como uma espécie de função (& $ array). Quando você chama a função que você não passe por referência. É a função que define como tomá-lo como referência. Este é, na verdade, exatamente o que deu errado quando colocamos tudo em nossos servidores quando fomos 5,3-5,4. Até 5.4, isso era perfeitamente razoável. Uma função não espera para levá-lo como referência, mas você pode passar isso como referência por isso, se a função não acontece para modificá-lo, ainda é modificado. A partir de 5.4, você não deveria fazer isso. Então, agora a única maneira de você passar por referência é se a função explicitamente o faz. Se você não quer que ele para modificá-lo, então você precisa fazer copy = $ $ linhas e cópia passe. Então, agora as linhas serão preservados e cópia será alterado. php.unique.php. Eu poderia ter sujado alguma coisa. 'Tipo' inesperado. Não vai ser algo que faz isso para nós. Ele não está lá. Observe que quando você ler o manual que o primeiro argumento é esperado para ser um array e é tomado por referência. Por que isso está reclamando comigo? Porque eu tenho esse tipo de função ainda aqui que eu não quero. Ok, php.unique.php. Eu não passar um argumento, porque eu não tenho um arquivo. É php.unique.php em test.php. Aqui está test.php todos impressos em uma ordem legal classificados. Observe que ordem de classificação é meio estranho para um arquivo de código porque todas as nossas linhas em branco vão vir em primeiro lugar então vão vir todos os nossos recortes de nível 1 depois vêm todos os nossos recortes não. Sim. >> [Aluno] Portanto, para o código-fonte não foi passado por referência? É que geralmente passados ​​por valor? [Bowden] Quando você chamar uma função, ele nunca determina se ele foi passado por referência. É a definição da função que determina se ele foi passado por referência. E olhando para a definição da função de classificação ou apenas olhando para isso, que leva o argumento por referência. Portanto, independentemente de se você quer tomar por referência, toma por referência. Ele modifica a matriz no local. Este não é apenas permitido. Você não tem permissão para fazer isso. >> [Aluno] Ah, ok. [Bowden] Isso, tipo vai ter linhas de referência e modificá-lo. E, novamente, se você não quer que ele faça isso, você pode fazer uma cópia do tipo. Mesmo neste caso, a cópia não é, na verdade, uma cópia de linhas. Ele só aponta para a mesma coisa, até que primeiro é modificado, onde está primeiro vai ser modificado na função de classificação, onde, porque é cópia na gravação, agora uma cópia do exemplar vai ser feita. Você também pode fazer isso. Esse é o lugar que você pode ver e comercial. Você vê isso em loops foreach, você vê-lo em declarações de função, e você vê-lo quando apenas a atribuição de variáveis. Agora nós não realizamos nada, fazendo isso porque cópia e linhas são literalmente a mesma coisa. Você pode usar linhas e copiar alternadamente. Você pode fazer unset (cópia $) e que não faz linhas unset, você acabou de perder sua referência para a mesma coisa. Então, a partir deste ponto, agora linhas é a única maneira que você pode acessar linhas. Perguntas? Sim. [Aluno] Completamente off topic, mas você não tem que fechar com o PHP - >> Você não. Okay. [Bowden] Eu iria tão longe a ponto de dizer que é uma má prática para fechá-las. Isso é provavelmente um exagero, especialmente em um script, mas vamos ver o que acontece se eu fazer isso. Que não fez nada. E se eu queria - [suspira] Eu preciso passar um argumento. Shoot. Eu chamei-o errado. Então php.unique.php com um argumento. Agora eu nem preciso disso. Vou passar para ele um argumento válido. Este impresso o que é impressão. Eu estou imprimindo cópia e cópia não existe. Assim linhas. É impresso tudo, e então perceber todo esse lixo aqui, porque em nada PHP que está fora das tags PHP é só ir para ser impresso literalmente. É por isso que o HTML, é tão bom que eu posso fazer div blá, blá, blá de classe ou o que seja, blá, blá, blá e depois fazer algum código PHP e depois fazer div final. E agora a impressão isso eu recebo minha div agradável em cima, tudo que o PHP impresso, div na parte inferior. Desastroso quando algo assim acontece, o que é bastante comum, apenas uma nova linha perdida no fundo do arquivo. Você não acha que seria a de um grande negócio até você considerar o fato de que com navegadores - Como redireciona trabalho ou, basicamente, a obra de cabeçalhos, quando você faz a sua ligação a um site e envia de volta todos esses cabeçalhos e coisas como resposta 200 ou resposta redirecionar ou o que seja, cabeçalhos são válidos apenas até o primeiro byte de dados é enviado. Pode redireccionar milhares de vezes, mas, logo que o primeiro byte de dados é enviado você não deveria redirecionar novamente. Se tiver uma nova linha estática na parte inferior de um ficheiro e digamos que você use essa função e então você quer - Vamos dizer que é outro arquivo que é index.php e você require_once algo - Eu não consigo pensar em um bom exemplo disso. O problema acontece quando esta linha na parte inferior fica ecoou. Você não quer nada ter sido ecoado ainda. Mesmo que você não tinha a intenção de ficar ecoou nada, algo que se repetiu e agora você não deve enviar cabeçalhos mais nenhuma e você está indo para obter queixas. Você só não precisa dessas tags de fechamento. Se você está pensando em fazer algo com HTML - e é perfeitamente razoável a fazer aqui o que div e então, neste ponto você pode ou não pode incluí-los. Isso realmente não importa. Mas em scripts PHP é raro para a fechar. Quando tudo é PHP, absolutamente tudo, você realmente não precisa fechá-lo / você não deve fechá-lo. Lidar com cordas é muito mais agradável do que em C. No PHP, você pode especificar uma string com aspas simples ou duplas. Com aspas simples você não pode usar "escape" sequências. Constantemente escapar, blá, blá, blá. Então printf é muito raro em PHP. Eu acho que eu iria usar printf se eu queria fazer um tipo de coisa - em que você usou pset 5 sprintf ou o que quer. Mas você quer fazer 001.jpg 002.jpg e. Assim, para esse tipo de coisa em que eu realmente quero formatar o texto que eu iria usar printf. Mas caso contrário, eu iria usar apenas concatenação. Eu nunca realmente usar printf. Estamos apenas diferenciar os detalhes entre aspas simples e aspas duplas. A maior diferença é que aspas simples, ele será impresso literalmente. Não há nenhum tipo de dados char em PHP, ao contrário de C, de modo que este é equivalente a este. Eles são duas cordas. E a coisa agradável sobre cordas aspas simples é que eu poderia dizer 'Olá mundo!' blá, blá, blá, $ $ Wooo. O que acontece quando eu imprimir esta é que vai imprimi-lo literalmente. Vamos nos livrar de todas as nossas coisas. Então echo $ str1; É, literalmente, impresso todas essas coisas: Sinais de dólar, barra invertida n, qual você acha que seria newlines - todas essas coisas ele imprime literalmente. A única coisa que você precisa escapar são aspas simples porque caso contrário, poderia pensar que está fechando as aspas simples. Aspas, completamente diferentes. Nós já vemos o destaque da sintaxe é cluing-nos para o que está prestes a ir terrivelmente errado. php.unique. Indefinido variável: wooo porque esta é interpretada como uma variável chamada wooo. Aspas duplas permitem que você inserir variáveis ​​- Digamos $ name = "Rob"; Então echo "Olá, meu nome é $ nome!"; Ela reconhece esta como uma variável. Quando eu executo isso - e vou inserir uma nova linha - Oi, meu nome é Rob! e Olá mundo! Isto é porque nunca tirei a impressão de wooo acima. Há um passo a mais que você pode fazer. $ Array = [1, 2, 3]; E se eu quiser imprimir o primeiro índice de matriz? Você faz $ array [0]. O realce de sintaxe é uma pista. O que é que isto vai fazer? php.unique. Oi, meu nome é 1! o que não é o que eu queria. O destaque da sintaxe mentiu para mim. Vamos tentar 'a' -> 1, 'b' -> 2. É assim que eu teria que escrever. Aspas simples inesperado (T_ENCAPSED blá, blá, blá, blá, blá). A ideia é a de que ele não está reconhecendo isto como parte da matriz. Não está reconhecendo isso como matriz indexada por uma carta. Você quer fazer isso cercado por chaves, e agora o que está neste chaveta serão interpoladas, que é a palavra que usamos para magicamente inserção dessas variáveis ​​para os lugares certos. Agora fazer isso, php.unique, e Oi, meu nome é 1! como esperado ou Oi, meu nome é Rob! Uma coisa que é uma espécie de bom sobre aspas simples é que - Há algum custo para interpolação. Se você usar aspas duplas, o intérprete tem que passar por cima essa seqüência, certificando-se de que, "Oh, aqui está uma variável. Agora eu preciso ir buscar essa variável e inseri-lo aqui." Mesmo se você não usar todas as variáveis, nada dentro destas aspas precisa ser interpolados, mas ainda vai ser mais lento porque ele precisa passar por cima das aspas à procura de coisas que precisam ser interpolados. Então citações individuais podem ser um pouco mais rápido se nada precisa ser interpolados, e eu ainda tendem a usar aspas simples para "Oi, meu nome é '. $ Array ['a'] de qualquer maneira. Isso vai ser equivalente ao que tínhamos antes. Mas é uma questão de preferência. Se você estiver usando PHP, você provavelmente não se importa com a diferença de velocidade. Não é o suficiente para raciocinar-los para começar. Todas as perguntas finais? Na verdade, nem sequer passar por tudo isso, mas este material era chato. A última coisa que é uma espécie de bom no PHP é quando você está lidando com HTML, você vai usá-lo um pouco, então a sintaxe bom atalho para a impressão de uma variável. Sem colocar PHP aqui, isso é chamado de tags curtas. Oficialmente a partir do PHP 5.4, que é depreciada. Recomenda-se colocar php. Este ainda é suportado, tags para curtas com o