[Powered by Google Translate] [Sección 8 - Más Cómodo] [Rob Bowden - Harvard University] [Esta es CS50. - CS50.TV] Estas notas de la sección semanas van a ser muy breve, así que sólo voy a seguir hablando, ustedes van a seguir haciendo preguntas, y vamos a tratar de llenar el tiempo tanto como sea posible. Mucha gente piensa que este conjunto de procesadores no es necesariamente difícil, pero es muy largo. La especificación conjunto de procesadores se toma una hora para leer. Le damos una gran parte del SQL que pueda necesitar para su uso. Le guiará a través de una gran cantidad de la misma, por lo que no debe ser demasiado malo. ¿Alguien ha comenzado o terminado? Es el conjunto de procesadores pasado. Oh, Dios mío. Por lo general, hay un JavaScript, uno tras esto, pero las cosas cambian calendario hace que todo sea una semana más corta, y ya no tenemos un conjunto de procesadores JavaScript. No sé cómo eso afecta si JavaScript se va a aparecer en el examen o Cuestionario 1. Me imagino que será algo parecido a lo que necesita saber cosas de alto nivel acerca de JavaScript, pero dudo que acababa de darle directamente el código JavaScript ya que no han tenido un conjunto de procesadores en el mismo. Pero eso será materia para el examen pregunta de la semana que viene. Sección de preguntas. Muchas de estas cosas son un poco mal redactado, pero vamos a discutir por qué. A diferencia de C, PHP es un "tipo dinámico" del lenguaje. ¿Qué quiere decir esto, te preguntarás? Bueno, decir adiós a todos aquellos flotador char, int, y las palabras clave que usted necesita utilizar al declarar variables y funciones en C. En PHP, el tipo de una variable se determina por el valor que se está llevando a cabo actualmente. Así que antes de escribir el código en un archivo llamado dynamic.php, PHP es tipado dinámico. Esto es cierto. Estoy en desacuerdo con el hecho de que eso significa que estamos diciendo adiós a char, float, int, y otras palabras clave. La diferencia exacta entre los tipos dinámicos y la alternativa, que es estático de tipos, es que el tipado dinámico, toda la comprobación de tipos y otras cosas ocurre en tiempo de ejecución, mientras estático de tipos ocurre en tiempo de compilación. La palabra estática en general parece tener significados tiempo de compilación. Supongo que hay otros usos para ella, pero en C cuando se declara una variable estática, su almacenamiento se asigna en tiempo de compilación. Aquí, tipado dinámico sólo significa que - En C si intenta agregar una cadena y un entero, cuando se compila, se va a quejar porque va a decir que no se puede agregar un entero y un puntero. No es sólo una operación válida. Esa es otra cosa que vamos a llegar a en un segundo. Pero ese tipo de control, el hecho de que se queja en tiempo de compilación, es la comprobación de tipos estáticos. Hay lenguas en las que no necesito decir flotador char, int, y todas esas cosas, pero el lenguaje puede decir del contexto de lo que tipo se supone que debe ser, pero sigue siendo estático de tipos. Así que si usted toma 51, OCaml, no es necesario utilizar ninguno de estos tipos, pero seguirá en tiempo de compilación dice que no puede hacerlo porque va a mezclar un entero y una cadena. Tipos dinámicos sólo significa que en algún momento durante el tiempo de ejecución que va a conseguir una queja. Si también ha utilizado Java antes, en general, casi cualquier lenguaje de tipo C va a ser estático de tipos, por lo que C, C + +, Java, todos los que son generalmente estático de tipos. En Java al compilar algo y estás diciendo cadena s es igual a algo nuevo que no es una cadena, eso va a quejar porque esos tipos simplemente no coinciden. Eso va a quejar en tiempo de compilación. Pero también tiene algo de tiempo dinámico cosas como si trata de lanzar algo a un tipo que es más específico que el tipo actual, no hay nada que puede hacer en tiempo de compilación para comprobar si ese reparto va a tener éxito. Java también tiene algún tipo dinámico comprobar que tan pronto como se pone a la línea de código cuando en realidad está ejecutando, que va a hacer el reparto, asegurarse de que ese reparto era válido, en primer lugar, y si no lo era, entonces va a quejarse de que usted tiene un tipo no válido. Tipo dinámico de cheques. Escribe esto en un archivo llamado dynamic.php. Dynamic.php. Voy a descomprimir ese formato. Tenemos una variable, lo establecido en el entero 7, entonces vamos a imprimirlo y% s - Oh, estamos imprimiendo el tipo de la misma, por lo que gettype va a devolver el tipo de la variable. Sólo estamos imprimiendo el tipo una y otra vez. Acabamos de php.dynamic.php. Veremos que cambia de número entero a cadena a Boolean como los que pasamos. En C no hay ningún tipo de datos Boolean, no hay ningún tipo de datos de cadena. Hay char * y booleanos sólo tiende a ser int o char o algo así. En PHP estos tipos existen, y esa es una de las grandes ventajas de PHP más de C - que las operaciones de cadenas son infinitamente más fácil en PHP que C. Sólo trabajan. Así que volver aquí. Corrimos dynamic.php. Esto le dice al intérprete de PHP, llamado php, para ejecutar el código PHP en dynamic.php. Si usted tiene cualquier error en el archivo, el intérprete le dirá! El intérprete, esta es otra gran diferencia entre PHP y C. En C hay que compilar algo y luego ejecutar ese archivo compilado. En PHP no compila nada. Así que el intérprete PHP es básicamente leyendo esta línea por línea. Se realiza var = 7 entonces se realiza printf entonces se realiza var entonces se realiza printf y así sucesivamente. Hay un poco de compilar lo hace, y lo almacena en caché los resultados por lo que si se ejecuta el script más tarde que puede hacer algo, pero básicamente se trata de una línea por línea especie de cosa. Esto significa que muchas de las optimizaciones que obtenemos en C, como la compilación, es sólo en general el compilador puede hacer un montón de trucos para ti. Puede llevar a cabo las variables utilizadas, se puede hacer todo este tipo de cosas, que puede hacer la recursión de cola. En PHP no vas a conseguir esa ventaja porque sólo va a comenzar a ejecutar línea por línea por línea, y que en realidad no reconocer estas cosas tan fácilmente ya que no es un paso de gran compilación sobre la cosa y la ejecución; es sólo línea por línea. Así que ese es el intérprete. De vuelta a nuestro tipado dinámico: muy bien, ¿eh? Definitivamente no podía hacer eso en C! Ahora, a ver si se puede averiguar el tipo de cada uno de los siguientes valores. Ver la referencia. Así 3,50. ¿Qué tipo crees que va a ser? Estos son los tipos que tenemos. Tenemos Bools, enteros, puntos flotantes, cadenas, matrices, objetos, y recursos, a continuación, que es una especie de vago. Creo que en realidad es un ejemplo aquí. Luego está NULL. NULL es un tipo especial. A diferencia de C, donde NULL es un puntero con la dirección 0, en PHP, NULL es su propio tipo donde lo único válido de ese tipo es NULL. Esto es mucho más útil para la comprobación de errores. En C, donde tuvimos este problema en el que si regresa NULL, ¿significa que usted está devolviendo un puntero NULL o utilizando NULL para indicar error o toda la confusión que había en un punto. En este caso, devuelva NULL significa generalmente error. Un montón de cosas también devolverá false para el error. Pero el punto es el tipo NULL, lo único del tipo NULL es NULL. Luego de devolución de llamada es como se puede definir algunas funciones anónimas. Usted no tiene que proveer la función de un nombre, pero usted no tendrá que lidiar con eso aquí. En cuanto a los tipos que no esperes que sepamos, ¿Qué te parece el tipo de 3,50 es? >> [Estudiante] Float. Si. Así que aquí, ¿qué te parece el tipo de que es esto? >> [Estudiante] Array. Si. La primera fue flotador, el segundo es una matriz. Tenga en cuenta que esta serie no es como una matriz C donde usted tiene el índice 0 tiene algún valor, índice 1 tiene algún valor. Aquí, los índices son a, b, y c, y los valores son 1, 2, y 3. En PHP no hay diferencia entre una matriz asociativa y sólo una matriz regular como se podría pensar de él en C. No sólo esto, y debajo de la capucha de una matriz regular es una matriz asociativa donde 0 mapas a algún valor de la misma manera se asigna a un cierto valor. Por esta razón, PHP puede ser muy malo para realmente rápidos código / evaluación comparativa de las cosas ya que en C cuando se utiliza una matriz que saber que el acceso a un miembro es la constante de tiempo. En PHP para acceder a un miembro es quien sabe cuánto tiempo? Es probable que sea constante si hashes correctamente. ¿Quién sabe lo que está haciendo en realidad por debajo de la capucha? Usted realmente necesidad de examinar la aplicación para ver cómo va a lidiar con eso. Entonces fopen. Creo que aquí vamos a fopen Manual de PHP sólo para mirar el tipo de retorno. Vemos aquí puedes consultar casi cualquier función en el manual de PHP y esto es una especie de la página del manual de PHP. El tipo de cambio se va a requerir muchos recursos. Es por eso que lo busqué, porque en realidad no definir los recursos. La idea de los recursos, en C que tiene un tipo de FILE * o lo que sea; PHP en el recurso es su archivo *. Es lo que vamos a leer, que es lo que vamos a estar escribiendo. Por lo general es externa, por lo que es un recurso que puede tirar cosas desde y tirar cosas a. Y por último, ¿cuál es el tipo de NULL? >> [Estudiante] NULL. Si. Así que la única cosa que es NULL es NULL. NULL es NULL. Una característica del sistema de tipos de PHP (para bien o para mal) es su capacidad de hacer malabares con los tipos. Al escribir una línea de código PHP que combina los valores de diferentes tipos, PHP intentará hacer lo más sensato. Pruebe cada una de las siguientes líneas de código PHP. ¿Qué está impreso? ¿Es lo que esperabas? ¿Por qué o por qué no? Este hecho acerca de PHP es lo que lo hace ser lo que llamamos tipos débiles. Tipos débiles y fuertemente tipado, existen diferentes aplicaciones de estos términos, pero la mayoría de la gente usa tipos débiles y fuertemente tipado en el sentido de este tipo de cosas donde ("1" + 2), que funciona. En C que no iba a funcionar. Usted puede imaginar esto no funciona. Muchas personas mezclan tipado dinámico y tipificación débil y tipos estáticos y tipado fuerte. Python es un ejemplo más de un idioma que se escribe de forma dinámica. Usted puede lanzar en torno a los tipos de las variables y que va a determinar en tiempo de ejecución las comprobaciones de error. En Python se va a ejecutar esto y verá ("1" + 2); y se producirá un error, ya que dice que no se puede agregar una cadena y un entero. En PHP, que es igual de tipado dinámico, esto no va a fallar. Tipificación débil tiene que ver con el hecho de que hace cosas con tipos que en realidad no tiene sentido necesariamente. Así ("1" + 2), puedo imaginar que siendo la cadena 12, me imagino que es la cadena 3, Me imagino que es el número entero 3. No es necesariamente bien definida, y probablemente vamos a ver aquí que al imprimir ("1" + 2), que probablemente va a terminar siendo diferente de impresión (1 + "2"). Y esto tiende a ser, en mi opinión, para peor. Aquí podemos tratar estos. Otro pequeño truco acerca de PHP es que no es necesario escribir realmente el archivo. Sin haber corrido este modo de comando. Así php-r, entonces podemos tirar la orden aquí: "Print ('1 '+ 2)," y voy a lanzar una nueva línea. Este impreso 3. Parece que imprime 3 y es el número entero 3. Así que ahora vamos a tratar al revés: "Letra (1 + '2 '); Tenemos 3, y lo está también va a ser un número entero 3? Honestamente, no tengo idea. Parece que es consistente. Nunca hay alguna posibilidad de que sea el 12 cuerdas ni nada de eso PHP porque, a diferencia de JavaScript y Java también, tiene un operador independiente para la concatenación. Concatenación en PHP es punto. Así impresión (1 '2 '.); Nos va a dar 12. Esto tiende a crear confusión donde la gente trata de hacer algo como str + = otra cosa que desee agregar a la final de la cadena, y eso va a fracasar. Que tiene que hacer str. = Así que no te olvides de concatenación en PHP es un punto. Otras cosas para intentar: print ("CS" + 50); Ya te he dicho que no hay esperanza de que ello implique CS50 desde concatenación no es +. ¿Qué te parece que esto va a terminar siendo? Sinceramente, no tienen absolutamente ninguna idea. Parece que es sólo 50. Ve a la cuerda, y yo apuesto a que si ponemos 123CS - Ve a la primera cadena, se trata de leer un número entero de ella o de un número de la misma. En este caso se ve 123CS. "Eso no tiene sentido como un entero, así que sólo voy a pensar en 123". Así 123 + 50 va a ser 173. Y aquí comienza a leer esto como un entero. No se ve nada, por lo que sólo lo trata como 0. Entonces, 0 + 50 va a ser 50. Esto que estoy asumiendo que va a hacer algo similar. Estoy pensando en 99. Sí, porque va a tomar la primera - Así 99. Aquí (10/7), si esto fuera C, ¿cuál sería volver? [Estudiante] 1. >> Sí, sería una causa 10/7 está dividiendo dos números enteros. Entero dividido por un entero va a devolver un entero. No se puede volver un punto cualquiera que sea, por lo que sólo va a devolver 1. Aquí impresión (10/7), que va a interpretar en realidad eso. Y esto significa que si usted realmente quiere hacer redondeo entero y cosas por el estilo, que tiene que hacer print (piso (10/7)); En C es probablemente raro que usted puede confiar en el truncamiento entero con regularidad, pero en PHP no se puede porque automáticamente se convertirá en un flotador. Y entonces (7 + true); ¿qué te parece que va a ser? Supongo 8 si se va a interpretar como una verdad. Parece que son las 8. Así que todo lo que hemos hecho en los últimos 10 minutos no debe absolutamente hacer. Verá el código que hace esto. No tiene por qué ser tan sencillo como este. Usted podría tener dos variables, y 1 variable pasa a ser una cadena y la otra variable pasa a ser un int, y luego se añaden estas variables. A partir de PHP es tipado dinámico y no va a hacer ninguna comprobación de tipo para usted Y puesto que es tipos débiles y como se acaba de lanzar automáticamente estas cosas juntas y todo se va a trabajar, es difícil saber hasta que esta variable debe ser una cadena ahora, por lo que no debe añadir a esta variable, que es un entero. La mejor práctica es si una variable es una cadena, se mantendrá como una cadena para siempre. Si una variable es un entero, mantenerlo como un int para siempre. Si usted quiere tratar con números enteros y cadenas, puede utilizar varsint - eso es JavaScript. Intval. Lo hago todo el tiempo. PHP y JavaScript mezclo todo. Así intval va a devolver el valor entero de una variable. Si pasamos en "print (intval ('123 ')), se obtiene 123. Intval sí mismo no va a hacer el cheque para nosotros que es exclusivamente un entero. El manual de PHP, hay funciones sólo disponibles para muchos, asique creo que lo que yo usaría es is_numeric primero. Supongo que devuelve false. Esa es otra cosa que tenemos que ir más es. === Así is_numeric ('123df '), no se le ocurriría que a medida que is_numeric. En C tendrías que iterar sobre todos los caracteres y comprobar para ver si cada carácter es el dígito o lo que sea. Aquí is_numeric va a hacer eso por nosotros, y se devuelve false. Así que cuando me impresa, se imprimirá nada, así que aquí estoy comparando a ver, se te ha ocurrido que es falsa? Y por lo que ahora se está imprimiendo 1. Al parecer, se imprime 1 como verdadero lugar de imprimir verdadero como verdadero. Me pregunto si lo hago print_r. No, todavía lo hace 1. Volviendo a ===, == todavía existe, y si usted habla con Tommy dirá == está perfectamente bien. Voy a decir que == es terrible y nunca se debe utilizar. == La diferencia es que == compara cosas donde puede ser cierto incluso si no son del mismo tipo, mientras === compara las cosas y primero se comprueba que son del mismo tipo? Sí. Bien, ahora voy a ver si realmente comparar a ser igual. Usted consigue cosas raras como 10 es igual a - vamos a ver lo que dice. Así que ('10 '== '1 e1'); Esto devuelve true. ¿Alguien tiene alguna idea por qué esto devuelve true? No se trata sólo de eso. Tal vez esto es una indirecta. Pero si puedo cambiar eso a un f - es maldito! Sigo usando comillas dobles. La razón de las comillas dobles están gritando a mí es porque me he puesto esta entre comillas dobles. Así que podría escapar de las comillas dobles en aquí, pero comillas simples hacen que sea más fácil. Así que ('10 '== '1 f1'); no se imprime cierto. ('10 '== '1 E1'); imprime cierto. [Estudiante] ¿Es hexadecimal? >> No es hexagonal, pero casi que es como - Notación 1e1, científico. Se reconoce como un 1e1 * 10 ^ 1 o lo que sea. Esos son números enteros iguales. Si lo hacemos === entonces va a ser falsa. En realidad tengo ni idea de si lo hacemos == ¿qué pasa con (10 y ''10abc); Está bien. Así que eso es cierto. Así como cuando lo hizo (10 + '10abc »), y que sería 20, aquí (10 '10abc == '); es verdad. Peor aún son cosas como (falso == NULL); es cierto o (false == 0); es cierto, (false == []); Hay casos raros de - Ese es uno de esos casos raros. Observe que (false == []); es verdad. ('0 '== False); es verdad. ('0 '== []); Es falso. Así == es de ninguna manera transitiva. una puede ser igual a B y A puede ser igual a c, pero b puede no ser igual a c. Eso es una abominación para mí, y siempre se debe utilizar. === [Estudiante] ¿Podemos hacerlo! == También? >> [Bowden] Sí. El equivalente sería! = Y! ==. Esto es realmente educado en la especificación de conjunto de procesadores donde una gran cantidad de funciones devuelven - El manual de PHP es bueno acerca de esto. Se pone en una caja roja grande "Esto devolverá false si hay un error." Pero volviendo 0 es una cosa perfectamente razonable para volver. Piense en cualquier función que se espera que regrese un número entero. Supongamos que esta función debe contar el número de líneas en un archivo o algo. En circunstancias normales, se pasa a esta función un archivo y que va a devolver un número entero que representa el número de líneas. Así que 0 es un número perfectamente razonable si el archivo es sólo vacío. Pero lo que si se le pasa un archivo no válido y la función pasa a devolver false si se le pasa un archivo no válido? Si usted acaba de hacer == no está diferenciando así entre el archivo inválido y archivo vacío. Utilice siempre. === Eso es todo de ellos. En PHP, el tipo de matriz es diferente de lo que estamos acostumbrados en C. De hecho, es posible que ya han dado cuenta de esto anteriormente, cuando se dio cuenta de que esto es de tipo array. La sintaxis de soporte es nuevo a partir de PHP 5.4, que es la nueva versión de PHP. Antes de esto, siempre tenía que escribir array ('a' -> 1, 'b' -> 2. Ese fue el constructor de una matriz. Ahora PHP por fin se decidió a la sintaxis agradable de apenas entre corchetes, que es simplemente mucho mejor que la matriz. Pero teniendo en cuenta PHP 5.4 es la versión más reciente, puede encontrar lugares que no tienen ni siquiera PHP 5.3. Durante el verano nos encontramos con este problema en el PHP 5.3 era lo que teníamos en el aparato, pero el servidor que desplegamos toda nuestra libreta de calificaciones y presentar y todas esas cosas a PHP fue 5,4. Sin saber esto, se desarrolló en el 5,3, empujó a 5,4, y ahora, de repente nada de nuestro código funciona porque allí pasó a haber sido los cambios entre 5,3 y 5,4 que no son compatibles, y tenemos que ir a arreglar todas nuestras cosas que no funcionan para PHP 5.4. Para esta clase, ya que el aparato tiene PHP 5.4, es perfectamente posible utilizar corchetes. Pero si usted está mirando las cosas en la Internet, si usted está buscando algún tipo de material de matriz, más probable es que usted va a ver el hechizo fuera sintaxis array constructor desde que ha existido desde PHP nació y la sintaxis de corchetes ha sido durante los últimos dos meses o cuando se acercó 5,4. Esta es la forma de índice. Al igual que en C como lo haría con índice entre corchetes como $ array [0], $ array [1], $ array [2], que el índice de la misma manera si le sucede que tiene sus índices ser cadenas. Así que $ array ['a'] y $ array ['b']. $ Array [b]. ¿Por qué sería malo? Probablemente va a generar una advertencia, pero todavía funcionan. PHP tiende a hacer eso. Tiende a poco: "Yo te voy a advertir sobre esto, pero yo sólo voy a seguir adelante "Y hacer todo lo que pueda". Es probable que traducir esto a una cadena, pero es posible que en algún momento en el pasado alguien dijo b definir como 'Hola Mundo'. Así que ahora b podría ser una constante de matriz y $ [b] en realidad va a hacer 'hola mundo'. Creo que en este punto, o al menos nuestra configuración de PHP, si tratas de índice en una matriz y que la clave no existe, se producirá un error. Yo no creo que sea sólo una advertencia. O por lo menos usted puede configurarlo para que no sólo te advierto que no sólo hacia arriba. La forma de comprobar si realmente existe tal índice es isset. Así isset ($ array ['hola mundo']) devuelve falso. isset ($ array ['b']) devuelve verdadero. Usted puede mezclar estas sintaxis. Estoy bastante seguro de lo que esta matriz terminaría siendo es - Podemos probarlo. Oh, necesito PHPWord. Esto es mezclar la sintaxis donde se especifica cuál es la clave y no se especifica cuál es la clave. Así que aquí 3 es un valor. No ha dicho explícitamente cuál es su clave va a ser. ¿Qué te parece la clave va a ser? [Estudiante] 0. >> Supongo 0 sólo porque es la primera que no se ha especificado. De hecho, podemos hacer un par de estos casos. Así es print_r imprimir recursiva. Se imprimirá toda la matriz. Sería imprimir submatrices de la matriz si los hubiera. Así print_r ($ array); php.test.php. Se parece a ella le daba 0. De hecho, hay algo a tener en cuenta aquí, pero nos pondremos en contacto con él en un segundo. Pero lo que si se me ocurre hacer este índice 1? PHP no hace diferencia entre los índices de cadenas e índices enteros, lo que en este momento me acaba de definir un índice 1 y puedo hacer las dos cosas array $ [1] y $ array [1 "] y será el mismo índice y la misma clave. ¿Y ahora qué cree usted que 3 va a ser? >> [Estudiante] 2. >> [Bowden] Estoy adivinando 2. Si. Son las 2. ¿Qué pasaría si hiciéramos esto es 10, esto es 4? ¿Qué te parece el índice de 3 va a ser? Estoy pensando en 11. Mi conjetura en cuanto a lo que hace PHP - y creo que lo he visto antes - se trata simplemente de un seguimiento de lo que el mayor índice numérico que ha utilizado hasta ahora es. Nunca va a asignar un índice de la cadena a 3. Siempre será un índice numérico. Por lo tanto, sigue la pista de la más alta está asignada hasta el momento, que pasa a ser 10, y que va a dar 11 a 3. Lo que dije antes, observe la forma en que se está imprimiendo esta matriz. Imprime clave 10, clave 4, clave 11, tecla d. Ni siquiera vamos a hacer - Supongo que no puso un 0, pero es la impresión 1, 2, 3, 4. ¿Qué pasa si me cambio aquí? ¿O vamos a cambiar realmente estos 2. Ahora se imprime 2, 1, 3, 4. Arrays de PHP no son como tu tabla hash regular. Es perfectamente razonable pensar en ellos como tablas hash 99% de las veces. Pero en las tablas de hash no tiene sentido del orden en el que las cosas se insertaron. Así que tan pronto como se inserta en la tabla hash, asumir que no hay lista enlazada y se podía juzgar dentro de una lista enlazada que se insertó primero. Pero aquí insertamos 2 primero y sabe cuando está imprimiendo esta matriz que 2 es lo primero. No imprimirlo en cualquier orden. La estructura de datos técnicos que se está utilizando es un mapa ordenado, por lo que mapea claves a los valores y recuerda el orden en el que las claves se insertan. Básicamente se trata de que algunas de las complicaciones en las que es realmente molesto - Digamos que usted tiene una matriz 0, 1, 2, 3, 4, 5 y quiere sacar índice 2. Una forma de hacerlo, vamos a ver lo que parece. 0, 2, 1, 3, 4. Desactivar pasa a desarmar ambas variables e índices de matriz. Así unset ($ array [2]); Ahora, ¿qué es esto va a parecer? 2 es sólo pasado, por lo que está perfectamente bien. Más molesto es que si quieres que las cosas sean realmente como una matriz. Voy a poner números al azar. Ahora fíjese en mis índices. Yo quiero que sea igual que un array C, donde se pasa de 0 a length - 1 y puedo iterar sobre ella como tal. Pero tan pronto como desarmar el segundo índice, lo que había en el índice 3 no convertido índice 2. En su lugar, sólo elimina ese índice y ahora te vas 0, 1, 3, 4. Esto es perfectamente razonable. Es sólo una molestia y hay que hacer cosas como empalme matriz. Si. [Estudiante] ¿Qué pasaría si tuvieras un bucle for y que quería revisar todos los elementos? Cuando golpeó dos, ¿sería ceder nunca? Iteración sobre una matriz. Hay dos maneras en que puede hacerlo. Puede utilizar un bucle for normal. Esta es otra complejidad de PHP. La mayoría de los idiomas, yo diría, tener algún tipo de longitud o len o algo indica la longitud de una matriz. En PHP es conde. Así count ($ array); $ i +) + Vamos a print ($ array [$ i]); Notice: Undefined offset: 2. Es sólo va a fallar. Esta es la razón por la que, en su mayor parte, no es necesario para iterar sobre una matriz de esta manera. Puede ser que sea una exageración, pero que nunca necesidad de iterar sobre un arreglo como este debido a que PHP ofrece una sintaxis foreach donde foreach ($ array como $ item). Ahora bien, si imprimir ($ item); - nos volveremos hablar de ello en un segundo - que funciona perfectamente bien. La forma en que está trabajando foreach es el primer argumento es la matriz que se está interactuando sobre. Y el segundo argumento, tema, a través de cada paso del bucle for que va a tomar el siguiente paso en la matriz. Así que recuerda que la matriz tiene una orden. La primera vez que el bucle for, el punto va a ser 123 entonces será 12 entonces será 13 entonces será 23 entonces será 213. Las cosas se ponen realmente extraño cuando haces algo como foreach. Vamos a ver qué pasa, porque usted nunca debe hacer esto. ¿Qué pasaría si unset ($ array [1]); Eso probablemente se esperaba. Estás iterar sobre esta matriz, y cada vez que estés desarmado el primer índice. Así que para el índice 0, lo primero elemento, toma el valor 0, así que va a ser 123. Pero dentro del bucle for nos unset índice 1, lo que significa que 12 se han ido. Así imprimir. PHP_EOL. PHP_EOL es solo salto de línea, pero es técnicamente más fáciles de transportar desde saltos de línea en Windows es diferente de saltos de línea en Mac y UNIX. En Windows nueva línea es \ r \ n, mientras que en todas partes se tiende para estar \ n. PHP_EOL está configurado para que utilice cualquiera que sea la nueva línea de su sistema. Así que imprimir. No hay que print_r ($ array) al final. No tenía ni idea de que ese sería el comportamiento. Artículo todavía toma el valor 12 a pesar de que desarmar 12 antes de que alguna vez llegó a él desde la matriz. No tome mi palabra en esto, pero parece que foreach crea una copia de la matriz y artículo asume todos los valores de esa copia. Así que incluso si se modifica la matriz dentro del bucle for, no le importará. El artículo será enfrentarse a los valores originales. Vamos a tratar de desarmar la misma. ¿Y si esto es $ array [1] = "hola"; A pesar de que poner "hola" en la matriz, nunca tema se tiene en ese valor. Hay otra sintaxis para foreach bucles donde pones 2 variables separadas por una flecha. Esta primera variable va a ser la clave de ese valor, y esta segunda variable va a ser el artículo exacto mismo. Esto no es interesante aquí, pero si volvemos a nuestro caso original de 'a' - 1>, 'B' -> 1, aquí si simplemente iterar para cada matriz como elemento, elemento que va a ser una cada vez. Pero si además queremos que conozcan la clave asociada a ese tema entonces hacemos como $ key -> $ item. Así que ahora podemos hacer print ($ key. ':'. Ahora se está iterando sobre e imprimir cada clave y su valor asociado. Una cosa adicional que podemos hacer en bucles foreach es que usted puede ver esta sintaxis. Ampersands antes de los nombres de variables tienden a ser como PHP hace referencias. Donde las referencias son muy similares a los punteros, usted no tiene punteros, por lo que nunca ocuparse de memoria directamente. Pero tenemos referencias donde 1 variable se refiere a la misma cosa como otra variable. Dentro de aquí que vamos a hacer $ item. Volvamos a 1, 10. Hagamos $ item + +; Que todavía existe en PHP. Usted todavía puede hacer + +. php.test.php. Tengo que imprimir. print_r ($ array); Se imprimen 2, 11. Si yo acababa de hacer foreach ($ array como $ item) entonces ítem será el valor 1 la primera vez a través del bucle. Se incrementará 1 a 2 y luego ya está. Así que entonces pasará a través de la segunda pasada del bucle y que el tema es de 10. Se incrementa el artículo a la 11, y luego que acaba de tirar. Luego print_r ($ array), y los vamos a ver que esto es sólo una de 10. Así, el incremento que hicimos fue perdido. Pero foreach ($ array como & $ item) ahora este artículo es el mismo artículo como este aquí. Es la misma cosa. Entonces, $ item + + es la modificación de matriz 0. Básicamente, usted también puede hacer $ k -> array $ item y usted puede hacer $ [$ k] + +; Así que otra manera de hacer eso, tenemos la libertad de modificar el punto, pero eso no va a modificar nuestra matriz original. Pero si utilizamos k, que es la llave, entonces podemos simplemente índice en nuestro array usando esa clave y que incrementar. Esto más directamente modifica nuestra matriz original. Usted puede incluso hacer que si por alguna razón usted quería que la capacidad de modificar - En realidad, esto es perfectamente razonable. Usted no quiere tener que escribir $ array [$ k] + +, que sólo quería escribir $ item + + pero todavía quería decir if ($ k === 'a') luego incrementar artículo y luego imprimir nuestra matriz. ¿Y ahora qué es lo que esperamos print_r hacer? ¿Qué valores se deben imprimir? [Estudiante] 2 y 10. >> [Bowden] Sólo si la clave era 'a' es lo que realmente imprimir eso. Es probable que muy rara vez, o nunca, se necesita definir funciones en PHP, pero es posible que vea algo similar en el que se define una función como cualquier función. Por lo general, usted diría ($ foo, $ bar) y luego definir que sea lo que sea. Pero si hago esto, entonces eso significa que todo lo que pide lo que sea, lo llama baz, por lo que el primer argumento pasado al baz se puede cambiar. Hagamos $ foo + +; y en el interior de aquí vamos a hacer baz ($ item); Ahora estamos llamando a una función. El argumento se toma como referencia, lo que significa que si lo modificar estamos modificando lo que se ha pasado pulg Y esta impresión se espera - a menos que metí la pata sintaxis - nos dieron 2, 11, por lo que se incrementa realmente. Notificación necesitamos referencias en 2 lugares. ¿Qué pasa si lo hizo? ¿Qué quiere decir esto? [Estudiante] Se va a cambiar. Sí >>. El artículo es simplemente una copia del valor de la matriz. Así elemento cambia a 2, pero la matriz ['a'] todavía será 1. ¿O qué si lo hago? Ahora elemento se envía una copia a baz. Así que la copia del argumento se incrementa a 2, pero el tema en sí mismo nunca fue incrementado a 2. Y el tema es lo mismo que la matriz de soporte que sea, de modo que nunca matriz se incrementó. Así que esos dos lugares que necesite. PHP es por lo general bastante inteligente sobre esto. Se podría pensar que quiero pasar por referencia - Esto era realmente una pregunta de uno de los conjuntos de procesadores. Era una cosa Questions.txt donde dice: ¿Por qué querría pasar esta estructura por referencia? ¿Cuál fue la respuesta? [Estudiante] Así que usted no tiene que copiar algo grande. Sí >>. Una estructura puede ser arbitrariamente grande, y cuando se pasa la estructura como argumento tiene que copiar esa estructura entera para pasarla a la función, mientras que si usted sólo tiene que pasar la estructura por referencia a continuación, sólo tiene que copiar una dirección de 4 bytes como argumento a la función. PHP es un poco más inteligente que eso. Si tengo alguna función y paso a un conjunto de 1.000 las cosas, ¿eso significa que va a tener que copiar todos 1.000 de esas cosas para pasar a la función? No tiene que hacerlo inmediatamente. Si dentro de esta función en realidad nunca modifica foo, así if ($ foo === 'hola') devolverá true.; Tenga en cuenta que en realidad nunca modificó el interior argumento de esta función, lo que significa que todo lo que se pasa como nunca foo debe copiarse porque no se lo está modificando. Así que la forma PHP obras son los argumentos se pasan siempre por referencia hasta que realmente tratar de modificarlo. Ahora bien, si por ejemplo $ foo + + y pasará a hacer una copia del original foo y modificar la copia. Esto ahorra algún tiempo. Si nunca estás tocando este arsenal masivo, nunca en realidad lo modifica, no es necesario para hacer la copia, mientras que si sólo hay que poner este signo que significa que ni siquiera copiarlo incluso si usted lo modifica. Este comportamiento se llama copy-on-write. Lo verá en otros lugares, sobre todo si usted toma un curso del sistema operativo. Copy-on-write es un patrón bastante usual en los que no es necesario hacer una copia de algo a menos que se haya cambiado realmente. Si. [Estudiante] ¿Qué pasa si usted tenía el incremento dentro de la prueba, tan sólo 1 elemento de 1.000 tendría que ser cambiado? No estoy seguro. Creo que sería copiar toda la cosa, pero es posible que es lo suficientemente inteligente como eso - En realidad, lo que estoy pensando es imaginar que tenía una serie que se parece a esto: $ matriz2 = [ Entonces 'a' índice es una matriz de [1 2 3 4], y el índice de 'b' es una matriz de lo que sea. Necesito comas entre todos ellos. Imagina que no hay comas. Entonces 'c' es el valor 3. Bien. Ahora digamos que hacemos $ baz ($ matriz2); donde baz no considera la presente por referencia. Así que $ foo ['c'] + +; Este es un ejemplo en el que se pasa como argumento matriz2 y luego se está modificando un índice específico de la matriz incrementándolo. Honestamente no tengo idea de lo que PHP va a hacer. Se puede hacer fácilmente una copia de toda la cosa, pero si es inteligente, se hará una copia de estas llaves donde esta tendrá su valor distinto pero esto todavía puede apuntar a la misma matriz 1,2,3,4 y esto todavía puede apuntar a la misma matriz. Voy iPad ella. Pasamos en este array donde este chico a 3 puntos, esto apunta a guy [1,2,3,4], este chico apunta a [34, ...] Ahora que lo estamos pasando a baz, estamos modificando esto. Si PHP es inteligente, sólo puede hacer - Todavía tenía que copiar algo de memoria, pero si no hubiera estos subconjuntos anidados enormes no necesitamos copiar esos. No sé si eso es lo que hace, pero me imagino haciendo eso. Esto también es una ventaja muy grande de C sobre PHP. PHP hace la vida mucho más fácil para un montón de cosas, pero que tipo de tener la menor idea de lo bien que se llevará a cabo porque no tengo ni idea de por debajo de la capucha cuando se trata de hacer estas copias de las cosas, oh, es que va a ser una copia constante de tiempo, es sólo va a cambiar un puntero, es que va a ser una copia lineal ridículamente difícil? ¿Y si no puede encontrar el espacio? ¿Tiene entonces que ejecutar la recolección de basura para obtener espacio un poco más? Y la recolección de basura puede tomar arbitrariamente largo. En C no tiene que preocuparse por estas cosas. Cada línea que se escribe puede razonar más o menos sobre cómo se va a realizar. Vamos a mirar hacia atrás en estos. ¡Qué bueno es que no tienes que lidiar con las funciones hash, listas enlazadas, ni nada de eso? Desde que trabajamos con tablas hash es tan fácil ahora, he aquí un rompecabezas divertido para trabajar. Abra un archivo llamado unique.php y en él escribe un programa PHP (También conocido como un "script"). Tendemos a llamar a los scripts si son cosas cortas que se ejecutan en la línea de comandos. Básicamente, cualquier lenguaje que no compila pero vas a ejecutar el archivo ejecutable en la línea de comandos, puede llamar a ese script ejecutable. Yo podría muy bien escribir un programa en C que hace esto, pero yo no lo llamo un script desde la primera vez que compile y ejecute el archivo binario. Pero este programa PHP que vamos a llamar a un script. O si lo escribimos en Python o Perl o Node.js o cualquiera de esas cosas, nos llamamos todos los scripts porque se ejecutan en la línea de comandos pero no compilarlos. Podemos hacer esto con bastante rapidez. No vamos a utilizar argv. Vamos a volar a través de esto. Llámelo único, escribir un programa. Se puede suponer que la entrada contendrá una palabra por línea. En realidad, argv será bastante trivial de usar. unique.php. Primero lo primero, queremos comprobar si se nos ha pasado un argumento de línea de comandos. Tal como era de esperar argc y argv en C, tenemos todavía los de PHP. Así que si ($ argc! == 2) entonces no voy a tratar de imprimir un mensaje o algo así. Voy a salir, el código de error de 1. También pude volver 1. Pocas veces en PHP que se encuentran en este estado donde estamos - Por lo general, usted está en una función llamada por una función llamada por una función llamada por una función. Y si algo sale mal y lo que desea es salir todo por completo, salida justo termina el programa. Esto también existe en C. Si estás en una función en una función en una función en una función y quiere matar sólo el programa, puede llamar a la salida y saldrá solo. Pero en PHP es aún más raro que nos encontramos en este nivel superior. Por lo general, estamos dentro de algún tipo de función, por lo que llamamos salida para que no tenga que volver a una cosa que se da cuenta de que hay un error de modo que si devuelve hasta que reconoce que fue un error. No queremos que lidiar con eso, así que salir (1); retorno (1), en este caso sería equivalente. Entonces, ¿qué queremos abrir queremos fopen. Los argumentos que se van a ver bastante similar. Queremos fopen ($ argv [1], y queremos abrirlo para su lectura. Esto devuelve un recurso que vamos a llamar a f. Esto se ve muy similar a como lo hace C excepto que no tienes que decir * FILE. En su lugar, sólo decir $ f. Bien. En realidad, creo que incluso nos da una pista en cuanto a la función de PHP llamada archivo. PHP File. Lo que esto va a hacer es leer un archivo entero en una matriz. No tienes necesidad de fopen ella. Se va a hacer eso por usted. Así que $ lineas = archivo ($ argv [1]); Ahora todas las líneas del archivo están en las líneas. Ahora queremos ordenar las líneas. ¿Cómo podemos clasificar las líneas? Nos ordenar las líneas. Y ahora podemos imprimirlas o lo que sea. Probablemente la forma más fácil es foreach ($ lines como $ line) echo $ line; [Estudiante] ¿No nos incluso cruzar las líneas haciendo referencia a algo en clase? Aquí es donde la especie se definiría como una especie de función (& $ array). Cuando se llama a la función que no pase por referencia. Es la función que se define como tomando como referencia. Esto es en realidad exactamente lo que salió mal cuando ponemos todo a nuestros servidores cuando fuimos 5,3 a 5,4. Hasta 5,4, esto era perfectamente razonable. Una función no tiene previsto tomar como referencia, pero se puede pasar por referencia así que si la función se da a modificarlo, sigue siendo modificado. A partir de 5,4, que no debes hacer esto. Así que ahora la única forma de pasar por referencia es si la función explícita que hace. Si usted no quiere que lo modifique, entonces usted necesita para hacer copia $ = $ pass líneas y copia. Así que ahora las líneas se conservará copia y será cambiada. php.unique.php. Yo podría haber metido algo. Inesperado 'especie'. Va a ser algo que lo hace por nosotros. Ni siquiera allí. Aviso cuando usted lee el manual que el primer argumento se espera que sea una matriz y se toma como referencia. ¿Por qué se quejan a mí? Porque tengo esta especie en función todavía aquí que no quiero. Bueno, php.unique.php. No me pasa un argumento porque no tengo un archivo. Es php.unique.php en test.php. Aquí está test.php todos impresos en un orden bien ordenados. Tenga en cuenta que el orden establecido es un poco raro para un archivo de código porque todas nuestras líneas en blanco va a ser lo primero entonces van a venir todos nuestros muescas de nivel 1 luego vienen todos nuestros muescas no. Si. >> [Estudiante] Así que el código fuente no se pasa por referencia? Es que generalmente pasa por valor? [Bowden] Cuando se llama a una función, nunca se determina si se pasan por referencia. Es la definición de la función que determina si se pasan por referencia. Y mirando a la definición de la función de la especie, o simplemente buscando en esto, toma el argumento por referencia. Así que, independientemente de si desea que se tome como referencia, lo hace tomar como referencia. Se modifica la matriz en su lugar. Esto no es sólo permitida. Usted no tiene permiso para hacerlo. >> [Estudiante] Oh, está bien. [Bowden] Esto, más o menos se va a tomar como referencia las líneas y modificarlo. Y de nuevo, si usted no quiere que haga eso, usted puede hacer una copia de género. Incluso en este caso, la copia no es realmente una copia de las líneas. Es sólo apunta a lo mismo hasta que primero es modificado, donde los primeros van a modificar en la función de clasificación, donde, porque es copy-on-write, ahora una copia del ejemplar que va a realizar. También puede hacer esto. Ese es el lugar que usted puede ver y comercial. Lo ves en los bucles foreach, lo ves en la declaración de funciones, y lo ves cuando la asignación a variables. Y nosotros no hemos hecho nada al hacer esto porque la copia y las líneas son literalmente la misma cosa. Usted puede utilizar las líneas y copiar de manera intercambiable. Usted puede hacer unset ($ copia), y que no las líneas no definidas, que acaba de perder su referencia a lo mismo. Así que a partir de este punto, ahora líneas es la única manera de acceder a líneas. ¿Preguntas? Si. [Estudiante] completamente fuera de tema, pero usted no tiene que cerrar PHP con la opción - >> No lo sabes. Bien. [Bowden] Yo iría tan lejos como para decir que es una mala práctica para cerrarlas. Eso es probablemente una exageración, sobre todo en un script, pero vamos a ver qué pasa si hago esto. Eso no hizo nada. ¿Qué pasa si yo quería - [Suspira] Tengo que pasar un argumento. Dispara. Llamé mal. Así php.unique.php con un argumento. Ahora ya no tienes necesidad de esto. Voy a pasar un argumento válido. Este impreso lo que es la impresión. Estoy imprimiendo copia y la copia no existe. Así líneas. Se imprimirá todo, y después se da cuenta toda esta basura aquí abajo, porque en nada PHP que se encuentra fuera de las etiquetas PHP sólo va a imprimir literalmente. Es por eso que HTML, es tan bonito que puedo hacer div bla, bla, bla, clase o lo que sea, bla, bla, bla, y luego hacer algo de código PHP y entonces hacer div fin. Y ahora esto me da la impresión de mi div bonito encima de la tapa, todo lo que PHP impreso, div en la parte inferior. Desastroso cuando sucede algo como esto, que es bastante común, sólo una nueva línea parásita en la parte inferior de archivo. Usted no pensaría que sería tan grande de un acuerdo hasta que se tiene en cuenta el hecho de que con los navegadores - Cómo redirigir el trabajo o básicamente cualquier trabajo encabezados, al realizar la conexión con un sitio web y lo envía de vuelta todas estas cabeceras y cosas como respuesta o la respuesta de redirección 200 o lo que sea, encabezados sólo son válidos hasta el primer byte de datos se envían. Puede redirigir miles de veces, pero tan pronto como el primer byte de datos se envía que no se supone para redirigir de nuevo. Si tiene una perdida de nueva línea en la parte inferior de un archivo y digamos que utilice esta función y entonces usted quiere - Digamos que es otro archivo que es index.php y require_once algo - No puedo pensar en un buen ejemplo de ello. El problema ocurre cuando esta línea en la parte inferior se hizo eco. Usted no quiere que nada se ha hecho eco todavía. A pesar de que no tenía la intención de conseguir cualquier cosa se hizo eco, algo que sí conseguimos eco y lo que ahora se supone que no debes enviar las cabeceras de ninguna otra y usted va a recibir quejas. Uno no necesita esas etiquetas de cierre. Si tienes pensado hacer algo con HTML - y es perfectamente razonable para hacerlo aquí div cualquier y en este punto se puede o no se pueden incluir. En realidad no importa. Pero en scripts PHP es raro para cerrarla. Cuando todo es PHP, absolutamente todo, usted realmente no necesita para cerrarlo / no debes cerrarlo. Tratar con cadenas es mucho más agradable que en C. En PHP se puede especificar una cadena con comillas simples o dobles. Con comillas simples no se puede utilizar "escape" secuencias. Constantemente escapar, blah, blah, blah. Así que printf es muy raro en PHP. Supongo que me gustaría utilizar printf si quería hacer una especie de cosa - en el conjunto de procesadores que utiliza sprintf 5 o lo que sea. Pero que quieres hacer 001.jpg 002.jpg y. Así que para ese tipo de cosas en el que realmente desea formatear el texto me gustaría utilizar printf. Pero por lo demás me acaba de utilizar la concatenación de cadenas. Realmente nunca usar printf. Sólo estamos diferenciando los detalles entre comillas simples y comillas dobles. La mayor diferencia es que las comillas simples, se imprimirá literalmente. No hay ningún tipo de datos char en PHP, a diferencia de C, así que esto es equivalente a esto. Los dos son cadenas. Y lo bueno acerca de las cadenas de comillas simples se podría decir 'hola mundo! " bla, bla, bla, $ $ Wooo. ¿Qué sucede cuando se trata de imprimir lo va a imprimir literalmente. Vamos a deshacernos de todas nuestras cosas. Así que echo $ cadena1; Es, literalmente, impreso todas esas cosas: signos de dólar, backslash n, que uno pensaría que sería saltos de línea - todas esas cosas que se imprime la letra. Lo único que se necesita para escapar comillas simples son porque de lo contrario podría pensar que va a cerrar las comillas simples. Las comillas dobles, completamente diferentes. Ya vemos el resaltado de sintaxis se nos cluing a lo que va a ir muy mal. php.unique. Undefined variable: wooo porque esto se interpreta como una variable llamada wooo. Las comillas dobles permiten insertar variables en - Digamos que $ name = "Rob"; Así que echo "Hola, mi nombre es $ nombre!"; Se reconoce esto como una variable. Cuando ejecuto esto - y voy a insertar un salto de línea - Hola, mi nombre es Rob! y hola mundo! Esto se debe a que nunca le quité la impresión de wooo arriba. Hay un paso más que puede hacer. $ Array = [1, 2, 3]; ¿Qué pasa si quiero imprimir el primer índice de la matriz? Usted hace $ array [0]. El resaltado de sintaxis es una pista. ¿Qué es esto va a hacer? php.unique. Hola, mi nombre es 1! que no es lo que yo quería. El resaltado de sintaxis me mintió. Vamos a probar 'a' -> 1, 'b' -> 2. Así es como yo tendría que escribir. Cita inesperada único (T_ENCAPSED blah, blah, blah, blah, blah). La idea es que no se reconoce esto como parte de la matriz. No está reconociendo esto como matriz indexada por una letra. ¿Quieres hacer que entre llaves, y ahora lo que hay en esta llave de cierre serán interpolados, que es la palabra que usamos para mágicamente la inserción de estas variables en los lugares correctos. Ahora hacer esto, php.unique y Hola, mi nombre es 1! como se esperaba o Hola, mi nombre es Rob! Una cosa que es un poco agradable acerca de comillas simples es que - Hay algún costo para la interpolación. Si utiliza comillas, el intérprete tiene que ir a través de esta cadena, asegurando que, "Oh, aquí está una variable. Ahora tengo que ir a buscar esa variable e insertarla aquí." Incluso si usted no utiliza ninguna variable, nada dentro de estas comillas necesita ser interpolados, pero todavía será más lento porque tiene que ir a través de las comillas dobles en busca de cosas que necesitan ser interpolados. Así citas individuales puede ser un poco más rápido si nada necesita ser interpolados, y tiendo a incluso utilizar comillas simples para: 'Hola, mi nombre es'. $ Array ['a'] de todos modos. Eso va a ser equivalente a lo que teníamos antes. Pero es una cuestión de preferencia. Si usted está usando PHP, es probable que no les importa la diferencia de velocidad. No es suficiente para razonar, para empezar. Una pregunta final? En realidad, ni siquiera pasar por todo esto, pero esto era aburrido. La última cosa que una especie de agradable en PHP es cuando usted está tratando con HTML, lo vas a usar un poco, así que la sintaxis buen atajo para imprimir una variable. Sin poner PHP aquí, esto se llama etiquetas cortas. Oficialmente a partir de PHP 5.4, esta no se utiliza. Se recomienda poner php. Esto es aun soportada, etiqueta cortas con el