[Powered by Google Translate] [Section 8 - более комфортной] [Rob Боуден - Гарвардский университет] [Это CS50. - CS50.TV] Эти заметки неделю разделе будет очень коротким, так что я просто буду продолжать говорить, вы, ребята, собираетесь продолжать задавать вопросы, , и мы постараемся, чтобы заполнить столько времени, сколько возможно. Многие люди думают, что это PSET не обязательно трудно, но это очень долго. PSET спецификации сама занимает час, чтобы читать. Мы даем вам много SQL вам может понадобиться использовать. Мы вас через много, поэтому она не должна быть слишком плохо. Кто начал или закончил? Это последний PSET. О, мой Бог. Обычно есть наличие одного за это, но все изменения календаря делает все 1 неделю короче, и у нас больше нет PSET JavaScript. Я не знаю, как это влияет ли наличие собирается появиться на экзамен или викторины 1. Я думаю, это будет что-то вроде вам нужно знать высоком уровне вещей о JavaScript, Но я сомневаюсь, что мы бы просто дать вам прямо JavaScript кода так как у вас не было PSET в нем. Но это будет материал для рассмотрения тест на следующей неделе. Раздел вопросов. Многое из этого материала несколько плохо сформулированные, но мы обсудим, почему. В отличие от C, PHP является "динамически типизированный" язык. Что это значит, спросите вы? Ну, скажем до свидания всем тем, CHAR, FLOAT, INT, и другие ключевые слова необходимо использовать При объявлении переменных и функций на языке C. В PHP, тип переменной определяется значение, которое он в настоящее время холдинг. Поэтому, прежде чем ввести этот код в файл с именем dynamic.php, PHP динамически типизированных. Это правда. Я не согласен с тем, что это означает, что мы прощались с CHAR, FLOAT, INT, и другие ключевые слова. Точная разница между динамически типизированных и альтернативные, которая статически типизированный, является то, что с динамической типизацией, все ваши проверки типа и прочее происходит во время выполнения, в то время как статически типизированных это происходит во время компиляции. Слово статической в ​​целом, кажется, имею в виду вещи время компиляции. Я предполагаю, что есть другое применение, но в C, когда вы объявляете статическую переменную, его хранения выделяется во время компиляции. Здесь динамически типизированных просто означает, что - В C, если вы попытаетесь добавить строку и целое число, когда вы компилируете его, он собирается жаловаться, потому что он собирался сказать, что вы не можете добавить Int и указатель. Это просто не является допустимым операции. Это еще одна вещь, которую мы получим в секунду. Но такую ​​проверку, то, что он жалуется на этапе компиляции, является статической проверки типов. Есть языки, в которых вы не нуждаетесь сказать, CHAR, FLOAT, INT, и все эти вещи, но язык можно понять из контекста вещь, что типа он должен быть, но она по-прежнему статически типизированными. Так что если вы берете 51, OCaml, вам никогда не придется использовать любой из этих типов, но он по-прежнему будет во время компиляции, что вы не можете сделать этого, потому что вы смешиваете Int и строки. Динамически типизированных просто означает, что когда-то во время выполнения вы собираетесь получить жалобу. Если вы также используется Java, прежде чем, в общем, практически любой C-тип языка собирается быть статически типизированными, так C, C + +, Java, все эти, как правило, статически типизированными. В Java при компиляции что-то, и вы говорите, Строка с равным новые нечто, что не является строкой, что собирается жаловаться, потому что эти типы просто не совпадают. Вот собираюсь жаловаться во время компиляции. Но он также имеет некоторые динамические вещи, как время, если вы пытаетесь бросить что-то к типу, который более конкретным, чем его текущая типа, нет ничего, что можно сделать во время компиляции, чтобы проверить, что приведение собирается добиться успеха. Java также имеет некоторые динамические проверки типов, что как только он попадает в эту строку кода , когда он на самом деле выполняется, он собирается сделать бросок, проверить, что актерский состав действительно, в первую очередь, и если бы это было не так, то это будет жаловаться, что у вас есть недопустимый тип. Динамическая проверка типов. Введите это в файл с именем dynamic.php. Dynamic.php. Я распаковать, что при форматировании. У нас есть переменная, положить его на целых 7, Затем мы собираемся напечатать его и% S - О, мы печати типа, так GetType собирается вернуть тип переменной. Мы просто печатая тип снова и снова. Мы просто php.dynamic.php. Мы увидим, что она меняется от целого числа в строку булевой как мы проходим. В C нет логического типа данных, нет строковый тип данных. Там в символ * и логические просто, как правило, Int или символ или что-то еще. В PHP эти типы действительно существуют, и это одно из самых больших преимуществ PHP на C - , что операции со строками гораздо проще, чем в PHP C. Они просто работают. Таким образом, мы возвращаемся сюда. Мы побежали dynamic.php. Это говорит PHP интерпретатора, называется PHP, для запуска PHP кода в dynamic.php. Если у вас возникли ошибки в файле, переводчик скажу! Переводчика, это еще одна большая разница между PHP и C. В C вы должны скомпилировать что-то, а потом вы запускаете, что скомпилированный файл. В PHP вы никогда ничего компилировать. Таким образом, переводчик PHP в основном только читать эту строку за строкой. Она поражает переменная = 7, то она попадает Printf то он попадает VAR то он попадает Printf и так далее. Существует немного составления он делает, и он кэширует результаты так что если вы запустите скрипт позже вы можете сделать некоторые, но в основном это строка за строкой рода вещи. Это означает, что много оптимизаций, которые мы получаем в C, как компиляция, это просто вообще компилятор может делать много трюков для вас. Это может занять неиспользуемых переменных, он может делать все эти разные вещи, он может сделать хвостовой рекурсии. В PHP вы не собираетесь, чтобы получить это преимущество потому что он только собирается начать выполнение линии строка за строкой, и это на самом деле не признают эти вещи так же легко, так как это не 1 большой этап компиляции над вещью, а затем исполнение; это просто строка за строкой. Так вот переводчика. Вернемся к нашей динамической типизации: довольно прохладно, да? Вы, безусловно, не мог сделать это в C! Теперь, можете ли вы определить тип каждого из следующих значений. См. это для справки. Таким 3,50. Какой вы думаете, что это будет? Вот типа у нас есть. У нас есть Bools, целые, с плавающей точкой, строки, массивы, объекты, и ресурсов, которая является своеобразной расплывчато. Я думаю, что там на самом деле пример. Тогда есть NULL. NULL представляет собой особый тип. В отличие от C, где NULL это просто указатель с адресом 0, В PHP, NULL является своего типа, где действует только вещь, что типа NULL. Это намного более полезно для проверки ошибок. В C, где у нас была эта проблема, при которой, если вы вернетесь NULL, это значит вы возвращались NULL указателя или с помощью NULL для обозначения ошибки или все, что путаница у нас были в одной точке. Здесь, возвращаясь NULL как правило, означает ошибку. Многое также возвращают ложные права на ошибку. Но дело в том NULL типа, единственное, что нулевой тип NULL. Тогда обратного вызова, как вы можете определить некоторые анонимные функции. Вы не должны дать имя функции, но вы не будете иметь дело с этим здесь. Глядя на типы, что они ожидают, что мы знаем, Что вы думаете тип 3,50 есть? >> [Студент] Float. Да. Так то вот, как вы думаете, типа этого? >> [Студент] Array. Да. Первый был поплавок, второй представляет собой массив. Обратите внимание, что этот массив не похож на массив C где у вас есть индекс 0, имеет некоторое значение, индекс 1 имеет некоторое значение. Здесь индексами A, B, и C, а значения 1, 2 и 3. В PHP нет разницы между ассоциативный массив и просто обычный массив как вы думаете об этом в C. Существует только это, а под капотом обычный массив это просто ассоциативный массив где 0 карты до некоторого значения, так же карты до некоторого значения. По этой причине, PHP может быть очень плохо для очень быстрый код / ​​бенчмаркинг вещи так как в C, когда вы используете массив, вы знаете, что доступ член постоянной времени. В PHP доступа члена кто знает, сколько времени? Это, наверное, постоянной, если она хэшей правильно. Кто знает, что это действительно делал под капотом? Вам действительно нужно посмотреть на реализацию, чтобы посмотреть, как он будет бороться с этим. Итак Еореп. Я думаю, что здесь давайте просто PHP Руководство Еореп смотреть на тип возвращаемого значения. Мы видим здесь вы можете найти почти любую функцию в PHP эксплуатации и это является своего рода человеком странице PHP. Тип возвращаемого значения будет ресурс. Вот почему я посмотрел его, потому что мы действительно не определяют ресурс. Идея ресурса, в C вы вроде есть FILE * или любой другой; В PHP ресурс файл *. Это то, что вы собираетесь быть чтение, это то, что вы собираетесь писать в. Это, как правило внешние, так что это ресурс, который вы можете вытащить вещи из и бросить вещи. И, наконец, какой это тип NULL? >> [Студент] NULL. Да. Так что единственное, что NULL является NULL. NULL является NULL. Одной из особенностей системы типа PHP (к лучшему или к худшему) является его способность совмещать типов. Когда вы пишете линии PHP код, который сочетает в себе значения различных типов, PHP будет пытаться сделать разумные вещи. Попробуйте каждый из следующих строк кода PHP. Что распечатал? Это то, что вы ожидали? Почему или почему нет? Этот факт о PHP, что делает его, что мы называем слабо типизированный. Слабо типизированных и строго типизированными, Есть различные способы использования этих терминов, но большинство людей используют слабо типизированными и строго типизированными в виду такого рода вещи где ("1" + 2), которая работает. В C, что не будет работать. Вы можете себе представить, это не работает. Многие люди путают динамическая типизация и слабой типизации и статической типизации и строгой типизации. Python является еще одним примером язык, который динамически типизированных. Вы можете бросить вокруг типы переменных и это будет определять во время выполнения любая ошибка проверок. В Python это будет выполнить это, и это увидят ("1" + 2); и это не потому, что он говорит, вы не можете добавить строку и целое число. В PHP, который находится всего в качестве динамической типизацией, это не будет ошибкой. Слабая типизация имеет дело с тем, что он делает вещи типа что на самом деле не имеет смысла обязательно. Таким образом, ("1" + 2), я могу себе представить, что, будучи строка 12, я могу вообразить его являющийся нити 3, Я могу предположить, что это является число 3. Это не обязательно хорошо определены, и мы, вероятно, увидим здесь , что, когда мы печатаем ("1" + 2), она, вероятно, будет в конечном итоге различные чем печать (1 + "2"). И это имеет тенденцию быть, на мой взгляд, в худшую сторону. Здесь мы можем попытаться это. Другая маленькая хитрость о PHP, вам не нужно на самом деле записи файла. Это было запустить эту команду режима. Итак, PHP-г, то мы можем бросить в команду здесь: "Печать ('1 '+ 2)", и я брошу новой строки. Этот документ 3. Похоже, что он печатает 3 и это число 3. Итак, теперь давайте попробуем наоборот: "Печать (1 + '2 '); Мы получаем 3, и он также будет целых 3? Я, честно говоря понятия не имею. Похоже, что является последовательным. Существует не любой шанс того, что это 12-струнная или что-то вроде этого потому PHP, в отличие от JavaScript и Java тоже, имеет отдельный оператор конкатенации. Объединение в PHP является точка. Таким образом, печать (1 '2 '.); Собирается дать нам 12. Это правило, приводит к путанице, где люди пытаются сделать что-то вроде ул + = некоторые другие вещи, которые они хотят добавить к концу своей строки, и что происходит на провал. Вам нужно сделать, ул. = Так что не забывайте объединения в PHP является точка. Другие вещи, чтобы попробовать: Print ("CS" + 50); Я сказал тебе, что нет никакой надежды на это в результате CS50 С конкатенации не +. Как вы думаете, это будет в конечном итоге? Я, честно говоря понятия не имею. Похоже, что это всего лишь 50. Он видит строку, и, я думаю, если положить 123CS - Он видит первую строку, она пытается прочитать целое число от нее или рядом с ней. В этом случае он видит 123CS. "Это не имеет смысла, как целое, так что я просто буду думать 123." Таким образом, 123 + 50 будет 173. И вот он начинает читать это как целое. Он не видит ничего, так что он просто воспринимает его как 0. Таким образом, 0 + 50 будет 50. Это я предполагаю, что собирается сделать нечто подобное. Я думаю, 99. Да, потому что он собирается сделать первый - Так 99. Здесь (10/7), если бы это было C, то что бы это вернуть? [Студент] 1. >> Да, это будет 1, так как 10/7 делит 2 целых чисел. Целое число делится на целое собирается возвращать целое число. Он не может вернуть 1 очко что бы это ни было бы, таким образом, это просто будет возвращать 1. Здесь печать (10/7); это будет на самом деле толковать это. А это значит, что если вы действительно хотите сделать целое округления и тому подобное, Вы должны сделать печать (пол (10/7)); В C это, наверное, странно, что вы можете положиться на целых усечение регулярно, но в PHP вы не можете, потому что это автоматически превратит ее в обращении. И тогда (7 + истинные); что вы думаете, что это будет? Я предполагаю, 8, если это будет интерпретировать как истинный 1. Похоже, это 8. Поэтому все, что мы сделали за последние 10 минут вы должны абсолютно никогда не делают. Вы увидите код, который делает это. Это не должно быть так просто, как это. Вы можете иметь 2 переменных и 1 переменной бывает строки и другие переменные, случается, INT, а затем добавить эти переменные вместе. Начиная с PHP динамически типизированных и он не будет делать любые проверки типов для вас и так как он слабо типизированными и с тех пор он просто будет автоматически выбросить эти вещи вместе и все будет работать, трудно даже знаю, что эта переменная должна быть строка теперь, так что я не должна добавить его в эту переменную, которая является целым числом. Лучшая практика, является ли переменная строкой, сохранить его в виде строки навсегда. Если переменная Int, сохранить его в виде целого навсегда. Если вы хотите иметь дело с целыми числами и строками, Вы можете использовать varsint - это JavaScript. INTVAL. Я делаю это все время. PHP и JavaScript Я смешиваю все. Так INTVAL собирается вернуться целое значение переменной. Если перейти в "печати (INTVAL ('123 ')), вы получите 123. INTVAL сам не собирается делать проверку для нас, что это только целое число. Руководство PHP, есть только так много функций, доступных, так вот я думаю, что я хотел бы использовать это is_numeric в первую очередь. Я предполагаю, что вернулся ложным. Это еще одна вещь, которую мы должны пойти на это. === Так is_numeric ('123df '), вы бы не думать о том, как is_numeric. В C вам придется перебрать все символы и проверить, если каждый символ цифрой или любой другой. Здесь is_numeric собирается сделать это за нас, и это возвращение ложным. Поэтому, когда я напечатал, что он напечатал ничего, так что здесь я сравниваю его, чтобы увидеть, Вы, случается, ложно? И вот теперь это печать 1. Видимо он печатает 1, как истинный вместо печати истинное как истинное. Мне интересно, если я делаю print_r. Нет, он по-прежнему делает 1. Возвращаясь к ===, == все еще существует, и если вы поговорите с Томми он скажет == это прекрасно. Я хочу сказать, что == страшно, и вы никогда не должны использовать. == Разница в том, что == сравнивает вещи , где она может быть правдой, даже если они не того же типа, в то время как === сравнивает вещи, и сначала это проверок они же типа? Да. Хорошо, теперь я хочу посмотреть, если они на самом деле по сравнению с равным. Вы получаете странные вещи, как 10 равных - давайте посмотрим, что это говорит. Таким образом, ('10 '== '1 e1'); Это возвращает истину. Кто-нибудь есть какие-то догадки, почему это возвращает правда? Речь идет не только об этом. Может быть, это намек. Но если я изменю, что F - палки! Я продолжаю использовании двойных кавычках. Причина, по которой двойные кавычки кричать на меня, потому что я положил это в двойные кавычки. Так что я мог избежать двойных кавычках здесь, но одинарные кавычки сделать это проще. Таким образом, ('10 '== '1 f1'); не печатает правда. ('10 '== '1 E1'); печатает правда. [Студент] Это шестнадцатеричный? >> Это не шестигранные, но это близко, что это такое - 1e1, научные обозначения. Он признает, 1e1, как 1 * 10 ^ 1 или любой другой. Те, равных чисел. Если мы это сделаем === то это будет неверно. Я на самом деле понятия не имею, если мы будем делать то, что о == (10 и '10abc '); Хорошо. Так что это правда. Так же, как когда вы сделали (10 + '10abc ');, и было бы 20, Здесь (10 '10abc == '); это правда. Еще хуже такие вещи, как (ложные == NULL); верно или (ложные == 0); истинно, (ложный == []); Есть странные случаи - Это один из тех странных случаев. Обратите внимание, что (ложные == []); это правда. ('0 '== False); это правда. ('0 '== []); Является ложным. Так == никоим образом не транзитивно. может быть равна б и может быть равным с, но б не может быть равной с. Это мерзость для меня, и вы всегда должны использовать. === [Студент] Можем ли мы сделать! ==, А? >> [Боуден] Да. Эквивалентную будет! = И! ==. Это фактически воспитывался в PSET спецификации где много возвращение функций - Руководство PHP хорошо об этом. Это ставит в большую красную коробку "Это будет возвращать ложными, если есть ошибки." Но, возвращаясь 0 является вполне разумной вещью, чтобы вернуться. Подумайте о любой функции, которая должна возвращать целое число. Скажем, эта функция должна подсчитать количество строк в файле или что-то. При нормальных обстоятельствах, вы передаете этой функции файл и он собирается возвращать целое число, которое представляет собой количество строк. Таким образом, 0 является вполне разумным числом, если файл пустым. Но что, если вы передаете его недействительным файлов и функции происходит вернуться ложным если вы передаете его недействительным файл? Если вы просто делаете == Вы не дифференцируя случае между недействительных файлов и пустой файл. Всегда используйте. === Это все из них. В PHP, тип массива отличается от того, что вы привыкли в C. В самом деле, вы, возможно, уже заметили это выше, когда вы увидели, что это тип массива. Кронштейн синтаксис нового на PHP 5.4, который является новейшей версией PHP. До этого вы всегда были написать массив ('A' -> 1, 'B' -> 2. Это был конструктор массива. Теперь PHP, наконец, решилась на хороший синтаксис просто квадратные скобки, которые просто так намного лучше, чем массив. Но, учитывая, PHP 5.4, новейшую версию, Вы можете столкнуться с мест, которые даже не имеют PHP 5.3. За лето мы столкнулись с этим вопросом, где PHP 5.3 был тем, что мы имели на прибор, но сервер, который мы развернули все наши классе книгу и узнайте и все такое, чтобы был PHP 5.4. Не зная этого, мы разработали в 5,3, толкнул до 5,4, а теперь вдруг ни одна из наших код работает потому что там случилось, было изменений между 5.3 и 5.4 которые не являются обратно совместимыми, и мы должны пойти и исправить все наши вещи, которые не работают на PHP 5.4. Для этого класса, так как прибор имеет PHP 5.4, это прекрасно использовать квадратные скобки. Но если вы ищете вещи вокруг Интернета, если вы ищете некоторые виды массива вещи, скорее всего, вы будете видеть заклинание из массива, так как конструктор, что было вокруг, так как PHP родился и синтаксиса квадратных скобок была вокруг в течение последние пару месяцев или когда пришел в себя 5,4. Это, как вы индекса. Как и в C как бы вы индекса в квадратных скобках, например $ массив [0], $ array [1], $ array [2], Вы индекса Точно так же, если вам случится, чтобы ваши индексы быть строками. Так массиве $ [''] и $ массив ['B']. $ Массив [б]. Почему это было бы не так? Это, вероятно, генерировать предупреждения, но все еще работает. PHP имеет тенденцию делать это. Она стремится к справедливому, "Я иду, чтобы предупредить вас об этом, но я просто хочу, чтобы продолжать идти »И делать все, что я могу". Это, вероятно, перевести это в строку, но не исключено, что в какой-то момент в прошлом кто-то сказал, Определим б быть "Hello World". Так что теперь б могла быть постоянным и массив $ [B] на самом деле будет делать "Hello World". Я думаю, что на данный момент, или, по крайней мере, наши настройки PHP, если вы попытаетесь индекс в массиве, и что ключ не существует, она будет выполнена. Я не думаю, что это будет просто предупредить вас. Или, по крайней мере, вы можете настроить его так, что он не только предупредить вас, это только прямо не удается. То, как вы убедитесь в том, на самом деле есть такой индекс Исеть. Так Исеть ($ массив ['Hello World']) вернет ложь. Исеть ($ массив ['B']) вернет истину. Вы можете смешать эти синтаксиса. Я уверен, что этот массив будет в конечном итоге это - мы можем проверить его. О, мне нужно PHPWord. Это смешение синтаксиса, где вы указываете, что ключ и не указать, что ключ. Таким образом, 3 прямо здесь значение. Вы явно не сказала, что ее ключевые будет. Как вы думаете, ее ключевые будет? [Студент] 0. >> Я предполагаю, 0, только потому, что это первый мы не уточняется. Мы можем реально сделать несколько таких случаев. Так print_r это распечатать рекурсивной. Она выведет весь массив. Это будет печатать подмассивов массива, есть ли. Так print_r ($ массив); php.test.php. Это не похоже это дало это 0. Там на самом деле что-то держать в уме, но мы вернемся к нему в секунду. Но что, если я, случается, чтобы сделать этот индекс 1? PHP не делает различий между строк индексы и целые индексы, поэтому на данный момент я только что определен индекс 1, и я могу сделать как массиве $ [1] и $ массив ['1 '] и это будет тот же индекс и тот же ключ. Так что теперь вы думаете 3 собирается быть? >> [Студент] 2. >> [Боуден] Я предполагаю, 2. Да. Это 2. Что если бы мы сделали это 10, это 4? Что вы думаете индекс 3 будет? Я думаю, 11. Мое предположение о том, что PHP делает, - и я думаю, что я видел это раньше - это просто отслеживает то, что самый высокий числовой индекс оно используется до сих пор является. Это никогда не собирался присвоить строку индекса 3. Она всегда будет числовым индексом. Таким образом он отслеживает самый высокий он назначен до сих пор, которые, случается, 10, и он собирается дать 11 до 3. Как я уже говорил ранее, обратите внимание на способ его печати этого массива. Он печатает ключ 10, ключ 4, ключ 11, ключ г. Или даже давайте делать - Я думаю, я не ставил 0, но это печать 1, 2, 3, 4. Что делать, если я включаю сюда? Или давайте на самом деле эти переключения 2. Теперь он печатает 2, 1, 3, 4. Массивах не просто как обычного хэш-таблицы. Это вполне разумно, чтобы думать о них как хэш-таблиц 99% времени. Но в вашей хэш-таблицы нет никакого смысла в том порядке, в котором вещи были вставлены. Поэтому, как только вы вставляете его в свои хэш-таблицы, Предположим, что нет связанный список, и вы могли судить в связанном списке , который был включен первым. Но здесь мы вставили 2 первых и он знает, когда это распечатка этого массива, что 2 на первом месте. Это не распечатать его только в любом порядке. Технической структуры данных, которые он использует представляет собой упорядоченную карту, так он отображает ключи к ценностям и он помнит порядок, в котором эти ключи были вставлены. В основном это некоторые осложнения, где это раздражает на самом деле - Скажем, у вас есть массив 0, 1, 2, 3, 4, 5 и вы хотите взять из индекса 2. Один из способов сделать это, давайте посмотрим, как это выглядит. 0, 2, 1, 3, 4. Отключенное бывает, чтобы сбросить как переменные и индексы массива. Таким образом, установлена ​​($ массив [2]); Теперь то, что это будет выглядеть? 2, только что ушел, так что это прекрасно. Больше раздражает, если вы хотите узнать, на самом деле быть как массив. Я положу случайных чисел. Теперь обратите внимание мои показатели. Я хочу, чтобы просто быть как массив C, где она идет от 0 до длины - 1 и я можем перебирать его как таковой. Но как только я сбросить второй индекс, что было в индексе 3 не теперь стал индекс 2. Вместо этого он просто удаляет этот индекс и теперь вы идете 0, 1, 3, 4. Это вполне разумно. Это просто раздражает, и вы должны делать вещи, как массив соединения. Да. [Студент] Что произойдет, если у вас цикл и вы хотели пойти по всем элементам? Когда он ударил 2, будет ли давать когда-либо? Перебор массива. Есть 2 способа сделать это. Вы можете использовать обычный цикл. Это еще одна сложность PHP. Большинство языков, я бы сказал, есть какая-то длина или длина, или что-то с указанием длины массива. В PHP это кол. Таким образом, количество ($ массив); $ I + +) Давайте просто печать ($ массив [$ я]); Notice: Undefined смещение: 2. Это просто будет на провал. Это причина того, что, по большей части, вам не нужно перебрать массив, как это. Это может быть преувеличением, но вам никогда не придется перебрать массив как это потому что PHP предоставляет своим Еогеасп синтаксис, где Еогеасп ($ массив $ пункта). Теперь, если мы печатаем ($ пункта); - МЫ обсудим это во второй - что работает прекрасно. Таким образом, что каждому элементу работает первый аргумент является массивом, что вы итерации. И второй аргумент, элемент, через каждый проход цикла он собирается взять на себя следующее, что в массиве. Так что помните массив имеет порядка. В первый раз через цикл, пункт будет 123 , то это будет 12, то это будет 13, то это будет 23, то это будет 213. Все становится действительно странно, когда вы делаете что-то вроде ForEach. Давайте посмотрим, что происходит, потому что вы никогда не должны делать этого. Что, если мы отключенное ($ массив [1]); Это был, вероятно, ожидали. Вы итерации по этому массиву, и каждый раз, когда вы снятии первого индекса. Так, индекс 0, первая вещь, товар берет на значение 0, так что это будет 123. Но внутри цикла мы отключенном индекс 1, так что означает 12 нет. Так печать. PHP_EOL. PHP_EOL только строки, но это технически более портативные С новой строки в Windows, отличается от перевода строки на Mac и UNIX. В Windows новая строка \ г \ п, в то время как везде он стремится только, чтобы быть \ п. PHP_EOL настроен так, что он использует все строки из вашей системы. Так что печатать. Давайте не будем print_r ($ массив) в конце. Я понятия не имел, что это будет поведение. Пункт по-прежнему берет на значение 12, хотя мы сбросить 12 прежде, чем мы когда-либо получали ее из массива. Не верьте мне на слово по этому вопросу, но, похоже, Еогеасп создает копию массива , а затем пункт принимает все значения из этой копии. Так что даже если вы измените массива внутри цикла, он не будет заботиться. Пункт возьмет на исходные значения. Давайте попробуем снятии его. Что делать, если это массив $ [1] = "Hello"; Даже если мы ставим "привет" в массив, элемент никогда не принимает это значение. Там другая синтаксис для Еогеасп петли где вы положили 2 переменные, разделенные стрелкой. Это первая переменная будет ключ от этого значения, и это вторая переменная будет точно такой же пункт. Это неинтересно, но если мы вернемся к нашему первоначальному случае "а" -> 1, "Б" -> 1, Здесь, если мы просто итерацию для каждого массива в качестве пункта, пункта будет на 1 каждый раз. Но если мы также хотим знать ключ, связанный с этим элементом Затем мы делаем как ключевые $ -> $ пункта. Так что теперь мы можем сделать печать ($ ключ. ':'. Теперь это итерации и печати каждой клавиши и связанные с ней ценности. Кроме того, еще мы можем сделать в Еогеасп петель вы можете увидеть этот синтаксис. Амперсанды до имен переменных, как правило, как PHP делает ссылки. Где ссылки очень похожи на указатели, Вы не должны указатели, так что вы никогда не иметь дело с памятью напрямую. Но у вас есть ссылки, где 1 переменная ссылается на то же самое, другой переменной. Внутри здесь давайте сделаем $ пункта. Давайте вернемся к 1, 10. Давайте сделаем $ пункту + +; которая все еще существует в PHP. Вы все еще можете сделать + +. php.test.php. Я должен распечатать его. print_r ($ массив); Мы печатаем 2, 11. Если бы я только что сделал Еогеасп ($ массив $ пункта), то элемент будет значение 1 Впервые через петлю. Это будет увеличиваться от 1 до 2, а затем мы сделали. И тогда она будет проходить через второй проход цикла и что пункт 10. Это шагом пункта до 11, а то, что просто выбросить. Тогда мы print_r ($ массив), и давайте посмотрим, что это всего 1, 10. Таким образом, мы сделали шаг был потерян. Но Еогеасп ($ массив, как и $ пункта) Сейчас эта позиция та же деталь как это прямо здесь. Это то же самое. Таким образом, элемент $ + + изменяет массив 0. В принципе, вы также можете сделать $ K -> $ пункта и вы можете сделать массив $ [$ K] + +; Таким образом, еще один способ сделать это, мы свободно изменять пункта, но это не изменит нашу исходного массива. Но если мы используем K, которая является нашим ключевым, то мы можем просто индексом в нашем массиве с использованием этого ключа и увеличить это. Это более непосредственно изменяет наш исходный массив. Вы даже можете сделать это, если по каким-то причинам вы хотели возможность изменять - На самом деле, это вполне разумно. Вы не хотите, чтобы написать массиве $ [$ K] + +, Вы только хотел написать $ пункту + +, но вы все еще хотел сказать, если ($ K === '') Затем увеличиваем пункт, а затем распечатать наш массив. Так что сейчас мы ожидаем print_r делать? Какие ценности должны быть напечатаны? [Студент] 2 и 10. >> [Боуден] Только если ключ был "а" мы на самом деле напечатать это. Вы, наверное, очень редко, если вообще когда-либо, необходимо определить функции в PHP, но вы могли бы увидеть что-то подобное, где вы определяете функцию, как функцию угодно. Обычно вы говорите ($ FOO $ бар), а затем определить, что это будет что угодно. Но если я это сделаю, то это означает, что все, что вызывает что угодно, все, что вызывает Баз, так что первый аргумент, переданный Баз может быть изменен. Давайте сделаем $ FOO + +; и внутри здесь давайте сделаем Баз ($ пункта); Теперь мы вызываем функцию. Аргумент берется по ссылке, что означает, что если мы изменим это Мы изменении вещь, которая была передана дюйма И печатью этого мы ожидаем, - если я испортил синтаксис - мы получили 2, 11, таким образом, это было на самом деле увеличивается. Заметьте, что мы нужны ссылки на 2 места. Что делать, если я это сделал? Что это значит? [Студент] Она будет меняться. >> Да. Товар просто копия значения в массиве. Таким образом, пункт изменится на 2, но массив [''] еще будет 1. Или что, если я это делаю? Теперь пункта передается в виде копии Баз. Таким образом, копия аргумента будет увеличен до 2, но сам элемент никогда не был увеличен до 2. И позиция та же вещь, как массив кронштейн угодно, так что массив не был увеличен. Таким образом, оба эти места нужно. PHP, как правило, очень умные об этом. Вы думаете, я хочу пройти по ссылке - Это было на самом деле вопрос на одном из psets. Это был questions.txt вещь, где он сказал, Почему может вы хотите передать эту структуру по ссылке? Что было ответить на это? [Студент] Таким образом, вы не должны копировать что-то большое. >> Да. Структура может быть сколь угодно большим, и когда вы проходите структуры в качестве аргумента для этого нужно скопировать всю эту структуру, чтобы передать его функции, а если вы просто передать структуру по ссылке потом просто нужно скопировать 4-байтовый адрес в качестве аргумента функции. PHP немного умнее. Если у меня есть некоторые функции, и я пройти к нему массив из 1000 вещей, это значит, что это будет иметь, чтобы скопировать все 1000 из этих вещей , чтобы передать его в функцию? Это не обязательно делать это немедленно. Если внутри этой функции он никогда не изменяет Фу, Так что, если ($ Foo === 'привет') возвращает истинное. Обратите внимание, мы никогда на самом деле изменение аргумента внутри этой функции, Это означает, что все, что передается в качестве Foo никогда не должен быть скопирован потому что он не изменяя его. Таким способом PHP работ аргументы всегда передаются по ссылке пока вы на самом деле пытаетесь изменить его. Теперь, если я скажу $ FOO + +, она теперь будет сделать копию оригинального Foo и изменить копию. Это экономит время. Если вы никогда не касаясь этого огромного массива, вы никогда не измените его, его не нужно, чтобы сделать копию, а если мы просто положить этот символ означает, что она даже не скопировать его даже если вы измените его. Такое поведение называется копирования при записи. Вы будете видеть его в других местах, особенно если вы берете курс операционной системы. Копирование при записи это довольно обычная картина, где вам не нужно, чтобы сделать копию чего-то если это на самом деле меняется. Да. [Студент] Что делать, если у вас был прирост в тесте, так что только 1 элемент из 1000 должны быть изменены? Я не уверен. Я думаю, было бы скопировать всю вещь, но вполне возможно, что это достаточно умны, что - На самом деле, о чем я думаю это представить у нас была массив, который выглядит следующим образом: $ array2 = [ Тогда "а" индекс массива [1 2 3 4], а индекс «б» представляет собой массив угодно. Мне нужно запятую между всеми из них. Представьте себе, есть запятые. Тогда 'C' является значением 3. Хорошо. Теперь предположим, что мы делаем $ Баз ($ array2); где Баз не воспользоваться этой ссылкой. Таким образом, $ Foo ['C'] + +; Это такой пример, где мы проходим array2 в качестве аргумента а затем он изменении конкретного индекса массива, увеличивая его. Я честно не знаю, что PHP будет делать. Это можно легко сделать копию всю вещь, но если она умная, он будет делать копии этих ключей, где это будет иметь свое уникальное значение но это может указывать на тот же массив 1,2,3,4 и это может указывать на тот же массив. Я буду IPad это. Мы передаем этот массив, где этот парень пунктов 3, этот парень указывает на [1,2,3,4], этот парень указывает [34, ...] Теперь, когда мы передаем его к Баз, мы изменяем это. Если PHP умный, он может просто сделать - Мы все еще должны были скопировать памяти, но если бы не было этих огромных вложенных подмассивов мы не должны скопировать эти. Я не знаю, если это то, что она делает, но я могу себе это делать. Это также довольно большое преимущество над C PHP. PHP делает жизнь намного проще для многих вещей, но вы вроде совершенно не знаю, насколько хорошо она будет выполнять потому что я понятия не имею, под капотом, когда он делает эти копии вещей, О, это будет постоянное время копирования, оно только собирается изменить 1 указатель, оно будет смешно трудно линейного копия? Что делать, если он не может найти пространство? Значит ли это, то нужно запустить сборку мусора, чтобы получить больше пространства? И мусора может принимать сколь угодно долго. В C вам не придется беспокоиться об этих вещах. Каждая линия Вы пишете вы можете очень многое причине о том, как он собирается выполнять. Давайте оглянемся на них. Как приятно это, что вы не должны иметь дело с хеш-функции, связанные списки, или что-нибудь вроде этого? Поскольку работа с хэш-таблиц так легко сейчас, вот головоломка работать. Откройте файл с именем unique.php и в нем написать программу PHP (Также известной как "сценарий"). Мы склонны называть их скрипты, если они короткие вещи, которые вы запустите в командной строке. В принципе, любой язык, который вы не собирают, но вы собираетесь запустить исполняемый В командной строке, вы можете позвонить, что исполняемый скрипт. Я мог бы с таким же успехом написать программу C, что делает это, Но я не называю это сценарий, поскольку я впервые скомпилировать и запустить исполняемый файл. Но эта программа PHP мы будем называть сценарий. Или если бы мы написали это в Python или Perl или Node.js или любой из тех вещей, мы будем называть их все сценарии, потому что вы запускать их в командной строке но мы не компилировать их. Мы могли бы сделать это довольно быстро. Мы не собираемся использовать ARGV. Давайте просто дуть через это. Назовите это уникальное, написать программу. Можно предположить, что вход будет содержать одно слово в строке. На самом деле, ARGV будет довольно тривиально использовать. unique.php. Первое, что во-первых, мы хотим проверить, если бы мы были приняты 1 аргумент командной строки. Подобно тому, как можно было бы ожидать ARGC и ARGV в C, у нас еще есть те, в PHP. Так что, если ($ ARGC! == 2), то я не буду иметь дело с печати сообщения или ничего. Я просто выйти, код ошибки 1. Я мог бы также вернуть 1. Редко в PHP вы в это состояние, в котором мы находимся - Обычно вы находитесь в функции, вызванной функции, называемой функцией называют функцию. И если что-то пойдет не так и вы просто хотите, чтобы выйти все целиком, выход только заканчивается программа. Это также существует в C. Если вы находитесь в функции в функцию в функцию в функцию и вы хотите просто убить программу, вы можете позвонить выхода, и он будет просто выйти. Но в PHP это еще более редкое, что мы находимся на этом высоком уровне. Обычно мы находимся внутри какой-то функции, так что мы называем выходом так что мы не должны возвращаться до 1 вещь, которая затем понимает, что это ошибка так что возвращается, если признает, что произошла ошибка. Мы не хотим иметь дело с тем, чтобы выйти (1); возвращение (1), в этом случае были бы эквивалентны. Тогда то, что мы хотим открыть мы хотим Еореп. Аргументы будет выглядеть очень похоже. Мы хотим, чтобы Еореп ($ ARGV [1], и мы хотим, чтобы открыть его для чтения. Это возвращает ресурс, который мы будем называть ф. Это выглядит подобно тому, как это делает C, за исключением, мы не должны сказать, FILE *. Вместо этого мы просто скажем, $ F. Хорошо. На самом деле, я думаю, это даже дает нам намек на PHP функция называется файлом. PHP файлов. Что это будет сделать, это прочитать весь файл в массив. Вам не нужно даже Еореп его. Он будет делать это за вас. Таким образом, $ линий = файл ($ ARGV [1]); Теперь все строки файла в линиях. Теперь мы хотим, чтобы отсортировать строки. Как мы можем сортировать строки? Мы сортируем линий. И теперь мы можем распечатать их или любой другой. Возможно, самым простым способом является Еогеасп ($ линиях в $ линия) Эхо $ линию; [Студент] Разве мы даже пересекать линии, ссылаясь на что-то в роде? Здесь рода можно определить как функцию сортировки (& $ массив). Когда вы вызываете функцию, которую не передать его по ссылке. Это функция, которая определяет его как принимая его как ссылку. На самом деле это именно то, что пошло не так Когда мы все расставит на наших серверах, когда мы пошли с 5,3 до 5,4. Вплоть до 5.4, это было вполне разумным. Функция не ожидает принять это как ссылку, но вы можете передать его в качестве справочного Таким образом, если функция не случилось, чтобы изменить его, он по-прежнему изменен. По состоянию на 5.4, вы не должны этого делать. Так что теперь единственный способ пройти по ссылке, если функция явно это делает. Если вы не хотите, чтобы это изменить, то вам нужно сделать копию $ = $ линиями и проходят копию. Так что теперь линия будет сохранена и копия будет изменена. php.unique.php. Я мог бы испортил что-то. Неожиданный «род». Там собирается быть что-то, что делает это для нас. Это даже не существует. Обратите внимание, когда вы читаете инструкцию, что первый аргумент как ожидается, будет массив и это заняло по ссылке. Почему это жаловался мне? Потому что у меня эта функция сортировки по-прежнему здесь, что я не хочу. Хорошо, php.unique.php. Я не передать аргумент, потому что у меня нет файла. Это php.unique.php на test.php. Вот test.php все распечатанные в хорошем порядке сортировки. Обратите внимание, что отсортированные немного странно для файла кода потому что все наши пустые строки собираемся стоять на первом месте Затем собираются приехать всей нашей 1 углубления уровня Затем идут все наши нет углублений. Да. >> [Студент] Таким образом, для исходного кода он не был передан по ссылке? Разве что как правило, передается по значению? [Боуден] Когда вы вызываете функцию, она никогда не определяет, было ли оно передается по ссылке. Это определение функции, которая определяет, был ли он передается по ссылке. И, глядя на функцию определения вида или просто глядя на это, он принимает аргументов по ссылке. Таким образом, независимо от того, хотите ли вы его и взять его по ссылке, это займет его по ссылке. Это изменяет массив на месте. Это просто недопустимо. Вы не позволили это сделать. >> [Студент] О, все в порядке. [Боуден] Это, своего рода займет линии по ссылке и изменить его. И опять же, если вы не хотите, чтобы это сделать, вы можете сделать копию рода. Даже в этом случае, копия фактически не является копией линий. Он просто указывает на одно и то же, пока она не получает изменения, где это сначала собираюсь изменить в функции сортировки, где, потому что это копия-на-писать, теперь копия копии будут сделаны. Вы также можете сделать это. Вот в чем другом месте вы можете видеть амперсанд. Вы видите это в петли Еогеасп, вы видите его в объявлении функции, и вы видите его, когда только присвоение переменных. Теперь мы ничего не добился, делая это потому что копия и линий буквально то же самое. Вы можете использовать линии и скопировать взаимозаменяемы. Вы можете сделать охраны ($ копию), и что не установлена ​​линий, Вы просто потеряете ссылкой на то же самое. Таким образом, по состоянию на этот момент, линий является единственным способом вы можете получить доступ к линиям. Вопросы? Да. [Студент] Полностью не по теме, но вы не должны закрывать PHP с - >> Вы этого не делают. Хорошо. [Боуден] Я бы так далеко, чтобы сказать, что это плохая практика, чтобы закрыть их. Это, наверное, преувеличение, особенно в сценарии, но давайте посмотрим, что произойдет, если я это делаю. Это ничего не делал. Что делать, если я хотел - [Вздыхает] Мне нужно передать аргумент. Стрелять. Я назвал его так. Так php.unique.php с аргументом. Теперь я даже не нужно это. Я передам это правильный аргумент. Этот печатный что это печать. Я печатью копии и копии не существует. Так линиями. Здесь печатались все, а потом замечаю все это барахло сюда, потому что ни в чем PHP, который находится вне PHP теги только собирается быть напечатаны в буквальном смысле. Вот почему HTML, это так приятно, что я могу сделать DIV бла, бла, бла, бла класса или любой другой, бла, бла, бла, бла, а затем сделать некоторые PHP код, а затем делать конце дел. А теперь распечатать это я получу хорошее дел наверху, все, что PHP печатной, раздел внизу. Катастрофические когда происходит нечто подобное, что является довольно общим, только бродячие строки в нижней части файла. Вы бы не думаю, что это будет то, что крупные сделки пока вы не учитывать тот факт, что с браузерами - Как перенаправляет работе или в основном все заголовки работы, когда вы делаете подключение к сайту и отправляет обратно все эти заголовки и вещи как ответ 200 или ответ перенаправления или любой другой, Заголовки действительны только до первого байта данных передаются. Вы можете перенаправить в тысячи раз, но как только первый байт данных посылается Вы не должны перенаправить снова. Если у вас есть бродячие строка в нижней части файла и предположим, что вы используете эту функцию, а затем вы хотите - Давайте говорить, что это другой файл, который index.php, и вы require_once что-то - Я не могу думать о хорошем пример. Проблема происходит, когда эта линия в нижней получает эхом. Вы ничего не хочу, чтобы было еще эхом. Даже если вы не намерены ни на что получение повторил, что-то действительно становились вторит и теперь вы не должны посылать дополнительные заголовки и вы будете получать жалобы. Вы просто не нужны эти закрывающие теги. Если вы планируете делать что-то с HTML - и это вполне разумно делать здесь все, что дел , а затем в этот момент вы можете или вы не можете включить их. Это действительно не имеет значения. Но в сценарии PHP это редко, чтобы закрыть его. Когда все PHP, абсолютно все, Вы действительно не нужно, чтобы закрыть его / Вы не должны закрыть его. Работа со строками намного приятнее, чем в C. В PHP вы можете указать строку с одинарной или двойной кавычки. С одинарными кавычками вы не можете использовать "побега" последовательностей. Постоянно бежать, бла, бла, бла, бла. Так Printf очень редко в PHP. Я думаю, я хотел бы использовать Printf если бы я хотел делать вещи - в PSET 5 вы использовали Sprintf или любой другой. Но вы хотите сделать 001.jpg 002.jpg и. Таким образом, для такого рода вещи, где я действительно хочу, чтобы отформатировать текст я хотел бы использовать Printf. Но иначе я бы просто использовать конкатенацию строк. Я никогда не использовать Printf. Мы просто дифференциации детали между одинарные и двойные кавычки. Самым большим отличием является то, что одинарные кавычки, то она будет напечатана в буквальном смысле. Существует нет символьного типа данных в PHP, в отличие от C, так что это эквивалентно этому. Они обе строки. И хорошая вещь об одной строки цитата Я мог бы сказать 'привет мир! " бла, бла, бла, $ $ Wooo. Что происходит, когда я печатаю это будет распечатать его в буквальном смысле. Давайте избавимся от всех наших вещей. Так Эхо $ str1; Это буквально печатные все эти вещи: знаки доллара, обратная косая черта п, которое вы могли бы подумать бы новой строки - все эти вещи он печатает в буквальном смысле. Единственное, что вам нужно бежать являются одинарными кавычками потому что иначе это было бы думать, что это закрытие одинарные кавычки. Двойные кавычки, совершенно разные. Мы уже видим, подсветка синтаксиса cluing нас к тому, что собирается пойти ужасно неправильно. php.unique. Неопределенная переменная: Wooo, потому что это интерпретируется как переменная называется Wooo. Двойные кавычки позволяют вставить переменные в - Скажем, $ Name = "Rob"; Так эхо "Привет, меня зовут $ имя!"; Он признает это как переменную. Когда я запускаю что - и я буду вставлять строки - Привет, меня зовут Боб! и привет мир! Это потому, что я никогда не снимал печати Wooo выше. Существует еще 1 шаг, который вы можете сделать. Массиве $ = [1, 2, 3]; Что делать, если я хочу, чтобы напечатать первый индекс массива? Вы делаете $ массив [0]. Подсветка синтаксиса подсказки. Что это будет делать? php.unique. Привет, меня зовут 1! которые не то, что я хотел. Подсветка синтаксиса солгал мне. Давайте попробуем "а" -> 1, 'B' -> 2. Вот как я должен был бы написать это. Неожиданные одинарные кавычки (T_ENCAPSED бла, бла, бла, бла, бла, бла). Идея состоит в том, что она не признает это как часть массива. Это не признавая это как массив, индексированный по письму. Вы хотите сделать это в фигурные скобки, и теперь все, что в этой фигурной скобкой будет интерполировать, который есть слово мы используем для волшебным вставки этих переменных в нужных местах. Теперь делать это, php.unique, и Привет, меня зовут 1! как и ожидалось или Привет, меня зовут Боб! Одна вещь, которая вроде хорошо о одинарные кавычки в том, что - Там-то стоимость интерполяции. Если вы используете двойные кавычки, переводчик должен идти по этой строке, убедитесь, что: "Ах, вот переменная. Сейчас мне нужно пойти получить эту переменную и вставить его здесь". Даже если вы не используете переменные, ничего внутри этих двойных кавычках должно быть интерполированы, но она все равно будет медленнее, потому что она должна идти на двойные кавычки ищу вещи, которые должны быть интерполированы. Так одинарные кавычки могут быть немного быстрее, если ничего не нужно интерполировать, и я склонен даже использовать одинарные кавычки для "Привет, меня зовут». Массиве $ [''] в любом случае. Это будет эквивалентно тому, что мы имели раньше. Но это вопрос предпочтений. Если вы используете PHP, вы, вероятно, не волнует разница в скорости. Существует не достаточно, чтобы рассуждать их с самого начала. Любое окончательное вопросы? На самом деле мы даже не пройти через все это, но этот материал был скучным. Последнее, что отчасти хорошо в PHP, когда вы имеете дело с HTML, Вы будете использовать его немного, так что хороший синтаксис ярлык для печати переменных. Без ввода PHP здесь, это называется короткие теги. Официально на PHP 5.4, это является устаревшим. Рекомендуется поставить PHP. Это по-прежнему поддерживается, так что короткие теги