[Powered by Google Translate] [Раздел 8 - по-комфортно]
[Роб Боудън - Харвардския университет]
[Това е CS50. - CS50.TV]
>> Тези бележки седмица раздел ще бъде доста кратък,
така че аз съм просто ще продължим да говорим, вие ще продължат да задават въпроси,
и ние ще се опитаме да запълнят толкова време, колкото е възможно.
Много хора смятат, че, че това pset не е непременно трудно, но това е много дълго.
Самата pset спец. отнема един час, за да се чете.
Ние ви даваме много на SQL, което би могло да се наложи да използвате.
Ние ви преведе през много от него, така че не трябва да бъде прекалено лошо.
Има ли някой е започнало или завършен?
Това е последната pset. О, Боже мой.
Обикновено там е JavaScript един след това, но нещата календарни на климата
прави всичко 1 седмица по-кратък, а ние вече няма pset JavaScript.
Не знам как това влияе на това дали JavaScript ще се появи на изпита
или викторина 1.
Предполагам, че това ще бъде нещо като теб трябва да знае неща от високо ниво за JavaScript,
но аз се съмнявам, че току-що ви дам направо JavaScript код
тъй като не са имали pset в него.
Но това ще бъде неща за преглед тест следващата седмица.
>> Раздел въпроси.
А много от тези неща е малко по-зле формулиран, но ние ще обсъдим защо.
За разлика от C, PHP е език "динамично пишеща машина". Какво означава това, ще попитате вие?
Е, да кажем сбогом на всички тези Чар, флоат, вътр и други ключови думи, които трябва да използвате
при деклариране на променливи и функции в C.
В PHP, типът на променливата се определя от стойност, която в момента държи.
Така че преди да въведете този код във файл, наречен dynamic.php,
PHP е динамично написали. Това е вярно.
Не съм съгласен с факта, че това означава, че ние сме се сбогува с Чар, флоат, вътр,
и други ключови думи.
Точната разлика между динамично на пишеща машина и алтернативата,
което е статично въвели, е, че динамично въвели, всички проверки на типа и неща
се случва по време на изпълнение, като има предвид, че статично написали това се случва по време на компилация.
Думата статична като цяло изглежда предвид неща, времето на съставяне.
Предполагам, че има и други начини за използване, но в C, когато декларирам статична променлива,
нейното съхранение се разпределят по време на компилация.
Тук динамично написали просто означава, че
В C, ако се опитате да добавите низ и число, когато го съставят,
че ще ходи да се оплаче, защото тя ще каже, че не можете да добавяте вътр и показалеца.
Това просто не е валиден операция.
Това е друго нещо, че ние ще стигнем до в секунда.
Но този вид проверка, фактът, че той се оплаква по време на компилация,
е статичен тип проверка.
Има езици, където не трябва да се каже, Чар, плувка, вътр., Както и всички тези неща,
но езикът може да каже от контекста на това нещо, какъв тип е трябвало да бъде,
но тя все още е статично написали.
Така че, ако сте приели 51, OCaml, никога не трябва да използвате някоя от тези видове,
но все още по време на компилация ще кажа, че не може да направи това, защото сте смесването на вътр и низ.
Динамично написали просто означава, че по някое време тече времето ти започваш да се получи жалба.
Ако сте също се използва 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 интерпретатора е просто четат тази линия по ред.
Той удари VaR = 7 след това го удари ФОРМАТ след това го удари VaR след това го удари ФОРМАТ и така нататък.
Има малко на съставянето го прави и го кешира резултатите
така че ако стартирате скрипта по-късно можете да направите някои,
но основно това е ред по ред подобно нещо.
Това означава, че много оптимизации, които получаваме в C,
като събиране, това е просто обикновено компилаторът може да направи много трикове за вас.
Това може да отнеме неизползвани променливи, той може да направи всички тези видове неща,
той може да направи рекурсия опашката.
В PHP вие няма да получите това предимство
защото това е просто ще започне изпълнение на ред по ред по ред,
и не наистина да признае тези неща толкова лесно
тъй като не е една голяма компилация пас над нещо и след това изпълнение;
това е просто ред по ред.
Така че това е преводач.
>> Обратно към динамичното ни пишете: много готино, нали?
Ти определено не може да направи това в C!
Сега, вижте, ако можете да разберете вида на всяка от следните стойности.
Виж за справка.
Така 3.50. Какъв тип смятате ли, че ще бъде?
Това са видове, които имаме.
Имаме bools, цели числа, плаващи точки, низове, масиви, обекти,
и ресурси, което е един вид на неясни.
Мисля, че всъщност е пример тук.
Тогава там е NULL. NULL е специален вид.
За разлика от C, където NULL е само указател с адрес 0,
в PHP, NULL своя тип, когато валидни само нещо от този тип е NULL.
Това е много по-полезен за проверка за грешки.
В C, където сме имали този проблем, при който ако се върнете NULL,
не означава, че връща нулев указател или използване NULL да означава грешка
или всичко това объркване имахме в един момент.
Ето, връщайки NULL обикновено означава грешка.
Много неща се върне невярно за грешка.
Но въпросът е NULL тип, единственото нещо, на NULL тип е NULL.
След това обаждане е като можете да определите някои анонимни функции.
Не е нужно да се даде функцията име, но няма да се налага да се справят с това тук.
Видове, които те очакват от нас да знаете,
какво мислите вида на 3.50? >> [Ученик] Float.
Да.
Значи тук, какво мислите за това е? >> Студент масив.
Да. Първият е поплавък, вторият е масив.
Забележете, че този масив не е като масив C
където имате индекс 0 има някаква стойност, индекс 1 има някаква стойност.
Тук индекси са А, Б, В и С и стойностите са 1, 2 и 3.
В PHP няма разлика между асоциативен масив, а просто обикновен масив
, както бихте си помислили за него в C.
Има само това, а под предния капак редовно масив е само асоциативен масив
където 0 карти до някаква стойност по същия начин, карти някаква стойност.
Поради тази причина, PHP може да бъде доста лошо за много по-бързо нещата код / ​​бенчмаркинг
тъй като в C, когато използвате масив знаете, че достъпът до потребител е константно време.
В PHP достъп до член е кой знае колко време?
Вероятно това е постоянна, ако правилно го хешове.
Кой знае какво наистина прави под предния капак?
Вие наистина трябва да погледнем изпълнението, за да се види как ще се справим с това.
Тогава fopen.
Мисля, че тук нека просто PHP ръчно fopen да погледнете типът на връщане.
Ние виждаме тук можете да погледнете нагоре почти всяка функция в PHP употреба
и това е нещо на човека страница на PHP.
Връщания тип ще бъде ресурс.
Ето защо аз го погледна, защото ние наистина не определят ресурс.
Идеята на ресурсите, C вид има FILE * или каквото
в PHP ресурс е FILE *.
Това е това, което ще трябва да се чете от, това е, което ти започваш да се пише.
Това е обикновено външни, така че това е ресурс, който може да тегли нещата и хвърлят неща, които трябва да.
И накрая, какъв е типът на NULL? >> Студент NULL.
Да. Е NULL Така че единственото нещо, което е NULL.
NULL е NULL.
>> Една от характеристиките на тип система PHP (за добро или за лошо) е способността му да жонглирам видове.
Когато пишете линия на PHP код, която съчетава ценностите на различни видове
PHP ще се опита да се направи разумно нещо.
Опитайте всеки от следните линии на PHP код. Какво отпечатани?
Това, което сте очаквали? Защо или защо не?
Този факт за PHP е това, което прави това, което ние наричаме слабо пишеща машина.
Слабо написали и силно типизирани
има различни начини за използване на тези условия,
но повечето хора използват слабо написали и силно типизирани означава този вид на нещо
където ("1" + 2), която работи.
В C, че няма да работи.
Можете да си представите, това не работи.
Много хора се смесват динамично типизиране и слаби пишете и статични пишете и силно типизиране.
Python е друг пример за език, който е динамично написали.
Можете да хвърлите около видове в променливи и ще се определи по време на изпълнение
грешки checkings.
В Python, че ще изпълни това и ще видите ("1" + 2);
и това ще се провалят, защото тя казва, че не можете да добавяте низ и число.
В PHP, който е също толкова динамично написали, това няма да се провали.
Слаба пишете трябва да се направи с факта, че тя прави неща с типове
, които наистина не смисъл е задължително.
Така ("1" + 2), мога да си представя, че е низ 12, мога да си представя, че е низ 3,
Мога да си представя да е цяло число 3.
Това не е непременно добре дефинирани, и ние вероятно сме да видите тук
че когато се печата ("1" + 2); е вероятно в крайна сметка ще е различен
от печат (1 + "2").
И тази тенденция да бъде, по мое мнение, по-лошо.
Тук можем да се опитаме.
Друг малък трик за PHP е, че не е нужно да се запише файла.
Тя не изпълните тази команда режим.
Така PHP-R, тогава можем да хвърли в командния тук:
"Печат (1 + 2);" и аз ще направя нов ред.
Това отпечатани 3.
Изглежда, че отпечатва 3, и е цяло число 3.
Така че сега, нека се опитаме по друг начин:
"Печат (1 + 2");
Ставаме 3, и също ще бъде цяло число 3? Честно казано, нямам идея.
Това изглежда, че е в съответствие.
Там никога няма шанс да е низ 12 или нещо подобно, че
защото PHP, за разлика от JavaScript и Java,
има отделен оператор за конкатенация.
Concatenation в PHP е точка.
Така печат (1 '2 ').; Ще ни даде 12.
Тази тенденция да доведе до объркване, когато хората се опитват да направят нещо подобно ул. + =
някои други неща, че искате да добавите към края на низ им, както и че ще се провалят.
Вие трябва да направите ул. =
Така че не забравяйте конкатенация в PHP е точка.
Други неща, които можете да опитате: печат ("CS" + 50);
Казах ти, че няма надежда за това, в резултат на CS50
тъй като конкатенация не е +.
Какво мислиш, че това е в крайна сметка ще е?
Аз честно казано нямам абсолютно никаква идея.
Тя изглежда като че ли е само на 50.
Тя вижда низ, и Обзалагам се, че ако сложим 123CS -
Тя вижда първия низ, тя се опитва да чете цяло число от него или от нея.
В този случай той вижда 123CS.
"Това не се връзва като цяло число, така че аз съм просто ще мисля за 123".
Така че 123 + 50 ще бъде 173.
И тук започва да чете това като цяло число.
Той не вижда нищо, така че просто се третира като 0. Така 0 + 50 ще бъде 50.
Това аз съм се предположи, че ще направи нещо подобно.
Мисля 99.
Да, защото ще вземе първото -
Така 99.
Тук (10/7), ако това е C, какво би било това се върнете?
[Ученик] 1. >> Да, ще бъде 1, защото 10/7 се раздели на две числа.
Цяло число, разделени от цяло число ще се върне цяло число.
Тя не може да се върне една каквото и точка, която ще бъде, така че просто ще се върне 1.
Тук печат (10/7), това ще се тълкува тази.
А това означава, че ако искате да направите цяло число, закръгляване и подобни неща,
което трябва да направите печат (етаж (10/7));
В C, това е може би странно, че можете да разчитате на редовно цяло число отрязване,
но в PHP не може, защото тя автоматично ще го превърне в поплавъка.
И тогава (7 + вярно); какво мислите, че ще бъде?
Аз съм се познае осем, ако то се случва да се тълкува вярно, тъй като 1.
Тя изглежда като че ли е 8.
>> Така че всичко, което сме правили през последните 10 минути абсолютно никога не трябва да правите.
Вие ще видите код, който прави това.
То не трябва да бъде толкова лесно, тъй като това.
Може да има две променливи, както и едно променлива се случва да бъде низ
и друга променлива се случва да бъде едно цяло число, и след това да добавите тези променливи.
Тъй като PHP е динамично написали и не ще направи проверка на типа за вас
и тъй като това е слабо написали и тъй като тя просто ще автоматично хвърлят тези неща заедно
и всичко ще работи, че е трудно дори да се знае, че тази променлива трябва да бъде низ сега,
така че аз не трябва да го добавите към тази променлива, която е цяло число.
Най-добрата практика е, ако дадена променлива е низ, дръжте го като низ завинаги.
Ако дадена променлива е едно цяло число, като вътр завинаги.
Ако искате да се справят с числа и низове,
можете да използвате varsint - това е JavaScript.
Intval. Аз правя това през цялото време. PHP и JavaScript смесват всичко.
Така intval ще се върне числовата стойност на дадена променлива.
Ако премине в "печат (intval ('123 ')), можете да получите 123.
Intval сама по себе си не ще да направи проверка за нас, че това е изключително цяло число.
Ръководството на PHP, има само толкова много функции,
така че тук мисля, че това, което бих използвал е функция is_numeric първото.
Аз съм се познае, че се връща фалшиви.
Това е друго нещо, което трябва да е ===.
Така функция is_numeric ('123df "), не би си помислил, на тази функция is_numeric.
В C вие ще трябва да обхождане на всички символи
и да се провери, ако всеки от героите е цифра или каквото.
Тук функцията is_numeric ще направи това за нас,
и това е връщане фалшиви.
Така че, когато аз отпечатан, отпечатани нищо, така че аз съм тук сравняват, за да видите,
се случи да е фалшива? И така, сега е печат 1.
Очевидно го отпечатва едно като истински вместо на отпечатване вярно, тъй като вярно.
Чудя се, ако го направя print_r. Не, все още една.
>> Връщайки се към === == все още съществува,
и ако искаш да говориш с Томи той ще каже == е съвършено глоба.
Отивам да се каже, че == е ужасно и никога не трябва да се използва ==.
Разликата е, че == сравнява неща
, където тя може да бъде вярно, дори ако те не са един и същи тип,
като има предвид, че === сравнява неща и за първи път го проверки, които са едни и същи тип?
Да. Добре, сега отивам да се види дали те действително сравни да бъде равен.
Можете да получите странни неща, като 10 се равнява - нека да видим какво казва.
Така че ('10 '== '1 e1 ");
Това връща вярно.
Някой има ли предположения защо това се връща вярно?
Това не е само за това. Може би това е намек.
Но ако сменя на е - по дяволите! Продължите да използвате двойни кавички.
Причината двойни кавички са ми крещи е така, защото съм сложил това в кавички.
Така че бих могъл да избяга от двойни кавички тук, но единични кавички го правят по-лесно.
Така че ('10 '== "1 f1); не се отпечатва вярно. ('10 '== "1 e1); отпечатва вярно.
[Ученик] шестнадесетичен? >> Това не е шестнадесетичен, но е близо, че това е като -
1E1, научна нотация.
Тя признава 1E1 като 1 * 10 ^ 1 или нещо такова.
Това са равни числа.
Ако правим === то тогава ще е невярна.
Аз всъщност нямам идея, ако правим == какво да кажем за (10 и '10abc "); Добре. Така че това е вярно.
Така че просто искал когато си направил (10 + '10abc "); и тя ще бъде 20,
(10 == '10abc "); е вярно.
Дори по-лошо са неща, като (FALSE == NULL); е вярно
или (фалшиво == 0); е вярно, (фалшиво == []);
Има странни случаи на - Това е една от тези странни случаи.
Забележете, че (фалшиво == []); е вярно.
('0 '== Фалшиви); е вярно.
('0 '== []), Е лъжа.
Така == е по никакъв начин не преходен.
може да бъде равна на В и може да бъде равна на в
но б не може да бъде равна на в.
Това е отвратително с мен, и винаги трябва да използвате ===.
[Ученик] Може да направим! == Както добре? >> Bowden Да.
Равностойността ще бъде! = И! ==.
Това всъщност е израснал в pset спец.
когато много функции връщат -
Ръководството на PHP е добре за това.
Тя поставя в голяма червена кутия "Това ще върне невярно, ако има грешка."
Но връщането на 0 е напълно разумно нещо, което трябва да се върне.
Помислете за всяка функция, която се очаква да се върне цяло число.
Да кажем, че тази функция е трябвало да брои броя на редовете във файл или нещо такова.
При нормални обстоятелства, се преминава тази функция файл
и тя ще се върне цяло число, което представлява броя на редовете.
Така че 0 е напълно разумен брой, ако файлът е празно.
Но какво, ако го давате невалиден файл и функцията се случва да се върне фалшиви
ако го премине невалиден файл?
Ако просто правим == не сте диференциране на делото между невалиден файл и празен файл.
Винаги използвайте ===.
Това е всичко, от тези.
>> Типът масив PHP, е различно от това, което сте свикнали в C.
Всъщност, може да са забелязали това по-горе, когато видя, че това е от тип масив.
Скоба синтаксис е ново от PHP 5.4, което е най-новата версия на PHP.
Преди това винаги трябваше да се напише масив ("А" -> 1, "б" -> 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], масива $ [1], масива $ [2],
индекс на същия начин, ако се случи да има индекси се струни.
Така че масива $ ["'] и $ масив [" б ".
Масива $ [B]. Защо това да е грешно?
Тя вероятно ще генерира предупреждение, но все още работи. PHP има тенденция да го направя.
Тя има тенденция да само: "Отивам да ви предупреди за това, но аз съм просто ще продължа
"И направя каквото мога."
Тя вероятно ще се преведе това в низ,
но е възможно, че в някакъв момент в миналото някой каза
определят б, за да бъде "Здравей, свят".
Така че сега б може да бъде постоянен и масива $ [B] всъщност ще се прави "Здравей, свят".
Мисля, че в този момент, или поне нашите PHP настройки,
ако се опитате да индекс в масив и този ключ не съществува, тя ще се провали.
Аз не мисля, че просто ще ви предупредя.
Или най-малкото можете да го настроите така, че да не само да ви предупредя, просто нагоре се провали.
>> Начин да проверите, за да видите, ако има действително е такъв индекс е isset.
Така isset ($ масив ['Hello World ") ще се върне фалшиви.
isset ($ масив ['б']) ще се върне вярно.
Можете да смесвате тези синтаксиса.
Аз съм сигурен, че това, което ще сложи край на този масив е - Можем да го тестваме.
О, имам нужда от PHPWord.
Това е смесване на синтаксиса, където можете да уточни каква ключът е
и не уточни какво е ключът.
Така 3 тук е стойност.
Не сте изрично подчерта ключовата му ще бъде.
Какво мислите ключа му ще бъде?
[Ученик] 0. >> Аз съм се познае 0 само защото е първият, който не са уточнени.
Ние действително можем да направим няколко от тези случаи.
Така print_r е да изписва рекурсивна. Тя ще отпечатате целия масив.
Той ще отпечата подмасива на масива, ако имаше такива.
Така print_r ($ масив); php.test.php.
Тя не изглежда като тя го е дал 0.
Всъщност е нещо, което трябва да имате предвид тук, но ние ще се върнем към него в секунда.
Но какво ще стане, ако се случи да направи този индекс 1?
PHP не прави разлика между струнни индекси и целочислените индекси,
така че в този момент аз току-що определи индекс 1 и мога да направя както масива $ [1] и масива $ [1]
и това ще бъде един и същ индекс и същ ключ.
И сега какво мислиш, че 3 ще бъде? >> Студент [2]. >> Bowden] Аз съм се познае 2.
Да. Това е 2.
Какво ще стане, ако го е направил е 10, това е 4? Какво мислиш, че индексът на 3 ще бъде?
Мисля 11.
Моето предположение какво PHP - и аз мисля, че съм виждал това и преди -
е просто следи от числов индекс, е използван досега.
Той никога няма да се присвоява индекс на низ до 3. Тя винаги ще бъде числов индекс.
Така че следи от най-високата е зададена досега, което се случва да бъде 10,
и тя ще даде 11-3.
Това, което казах преди, обърнете внимание на начина, по който тя се отпечатва този масив.
Той отпечатва ключ 10, ключ 4, ключ 11, ключ г.
Или дори да го направим -
Предполагам, че не съм се на 0, но това е печат 1, 2, 3, 4.
Какво ще стане, ако премина тук? Или нека включите тези две.
Сега го отпечатва 2, 1, 3, 4.
Масиви на PHP не са точно като редовен хеш таблица.
Това е напълно разумно да се мисли за тях като хеш таблици 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.
Това е напълно разумно.
Това е просто досадно и което трябва да направите неща като масив снаждане. Да.
>> [Ученик] Какво ще се случи, ако сте имали за контур
и искаш да отидеш над всички елементи?
Когато го удари два, ще я отстъпиш някога?
Итерации над масив. Има два начина, по които можете да го направите.
Можете да използвате редовно за контур.
Това е още една сложност на PHP.
Повечето езици, бих казал, че има някаква дължина или лен или нещо
посочва дължината на масива.
В PHP брой.
Така броят ($ масив); $ I + +)
Нека просто печат ($ масив [I]);
Notice: Undefined компенсира: 2.
Това е просто ще се провалят.
Това е причината, че за по-голямата си част, няма да е необходимо за обхождане на масив като този.
То може да бъде преувеличено, но никога не трябва да обхождане на масив като това
защото PHP предоставя foreach синтаксис, където foreach ($ масив $ елемент).
Сега, ако се печата ($ позиция); - Ще го обсъдим а през втората - че работи перфектно глоба.
Начинът, по който foreach работи е първият аргумент е масив, който сте итерации над.
И вторият аргумент, т. чрез всяко преминаване на линия за
ще поеме следващото нещо, което в масива. Така че не забравяйте масив има заповед.
Първи път през за цикъла, т. ще бъде 123
след това ще бъде 12 след това ще бъде 13 след това ще бъде 23 тогава той ще бъде 213.
Нещата стават наистина странно, когато правиш нещо като foreach.
Нека видим какво се случва, защото никога не трябва да направите това.
Какво ще стане, ако ние унищожен (масива $ [1]);
Това вероятно се очаква.
Вие итерации през този масив, и всеки път, когато сте изключване на първия индекс.
Така индекс 0, първото нещо, т. приема стойност 0, така че ще бъде 123.
Но вътре за цикъл ние унищожен индекс 1, така че това означава, че 12 е отишъл.
Така отпечатате. PHP_EOL.
PHP_EOL е само нов ред, но това е технически по-преносим
тъй като нови редове в Windows е различен от нови редове на Mac и UNIX.
На Windows нов ред \ R \ N, докато навсякъде другаде тя е склонна само за да бъде \ N.
PHP_EOL е конфигуриран така, че да използва, независимо от нов ред на вашата система е.
Така отпечатате. Нека не print_r ($ масив) в края.
Нямах представа, че това ще бъде поведението.
Точка все още заема на стойност 12, макар и да унищожите 12, преди да сме някога трябва да го от масива.
Не вземайте думата ми за това, но тя изглежда като foreach създава копие на масива
и след това т. поема всички стойности на това копие.
Така че, дори ако промените масиви в линия за
това не им пука. Позиция ще поеме първоначалните стойности.
Нека се опитаме изключване.
Какво ще стане, ако това е масива $ [1] = "Здравей";
Въпреки, че ние поставяме "здравей" в масива, никога т. поема тази стойност.
Има и друг синтаксис, за да foreach вериги
, където да поставите две променливи, разделени със стрелка.
Тази първа променлива ще бъде ключа на тази стойност,
и това втората променлива ще бъде точно същата позиция.
Това е безинтересно тук, но ако се върнем към нашия случай "а" -> 1,
"Б" -> 1,
тук, ако ние просто за всеки масив като точка превъртите, т. ще бъде едно всеки един момент.
Но ако искате да знаете ключ, свързан с тази позиция
след това правим като ключ - Над точка.
Така че сега можем да направим печат ($ ключ. ":".
Сега е итерации и отпечатване на всеки клавиш и свързаните с нея стойност.
>> Допълнителен нещо, което можем да направим в foreach вериги, можете да видите този синтаксис.
Амперсанди пред имената на променливите са склонни да бъдат, как PHP прави препратки.
Когато препратките са много подобни на указатели,
не сте указатели, така че никога не се справят с памет директно.
Но имате препратки, където 1 променливата се отнася до същото като друга променлива.
Вътре тук, нека да направим $ елемент. Нека се върнем към 1, 10.
Нека да направим $ т. + +, че все още съществува в PHP. Можете да го направите + +.
php.test.php. Аз трябва да го отпечатате. print_r ($ масив);
Ние печат 2, 11.
Ако току-що бях направил foreach ($ масив $ позиция) елемент ще бъде на стойност 1
първи път през примката. Тя ще увеличите 1 до 2 и след това сме готови.
Тогава той ще мине през второто преминаване на цикъла и тази позиция е 10.
Тя стъпки т. 11, и това е просто изхвърля.
Тогава ние print_r ($ масив), и да видим, че това е само 1, 10.
Така че увеличение, което направихме, е загубен.
Но foreach ($ масив, както и $ т.)
сега тази позиция е една и съща позиция, тъй като това тук. Това е едно и също нещо.
Значи $ т. + + променя масив 0.
Принцип, можете да направите $ к -> $ позиция и можете да направите $ масив [к] + +;
>> Така че друг начин за това, ние сме свободни да променят т.,
но това няма да промени нашата оригинална масив.
Но ако използваме к, което е нашата основна, тогава можем просто индекс в нашия масив използвате този клавиш
и нарастване.
Това по-пряко променя нашата оригинална масив.
Можете дори да направите това, ако по някаква причина искаш възможност за промяна -
Всъщност, това е напълно разумен.
Вие не искате да трябва да напишете масива $ [$ к] + +,
просто исках да напиша $ т. + + но все пак исках да кажа, ако ($ к === "а")
след това нарастване позиция и след това да отпечатате нашия масив.
И сега какво да очакваме print_r да направя? Какви ценности трябва да бъдат отпечатани?
[Ученик] 2 и 10. >> [Bowden] Само ако ключът е "да ние всъщност отпечатате.
>> Може би много рядко, ако изобщо някога, ще трябва да се определи функции в PHP,
но вие може да видите нещо подобно, можете да зададете функция като функция това, което.
Обикновено бих казал ($ Foo, бар) и след това го определят, за да бъде каквото.
Но ако направя това, то това означава, че каквото и призовава каквото,
каквото и призовава Баз, така че първият аргумент на Баз може да бъде променена.
Нека да направим $ Foo + +;
и отвътре от тук нека да направим Баз ($ позиция);
Сега ние призоваваме функция.
Аргументът е взето чрез препратка, което означава, че ако ние го променят
промяна на нещо, което е приет.
И отпечатване на това, което очакваме - освен ако аз се обърках синтаксис - имаме 2, 11,
така че всъщност се увеличава.
Забележите, че се нуждаят от препратки в две места.
Какво ще стане, ако го направя това? Какво означава това?
[Ученик] ще се промени. >> Да.
Позиция е просто копие на стойност в масива.
Така че позиция ще се промени на 2, но масива "а"] все още ще бъде 1.
Или какво, ако направя това?
Сега е изпратен като копие на Баз.
Така че копие на аргумента ще се увеличи на 2,
но самия елемент никога не е бил увеличен до 2.
И т. е същото като масив скоба каквото
така че масив никога не се увеличава.
Така че и двете тези места, които се нуждаят от нея.
>> PHP обикновено е доста умен за това.
Може би си мислите, Искам да премине чрез позоваване
Това всъщност е въпрос на един от psets.
Това беше questions.txt нещо, където се казва,
Защо може да искате да премине тази структура чрез препратка?
Какъв беше отговорът на този въпрос?
[Ученик] Така че не е нужно да копирате нещо голямо. >> Да.
Структура може да бъде произволно голям и, когато преминат структура като аргумент
тя трябва да копира цялата тази структура, за да го предаде на функцията,
докато ако просто минават структура чрез позоваване
след това просто трябва да копира 4-байтов адрес като аргумент на функцията.
PHP е малко по-умен от това.
Ако имам някои функции и предам масив от 1000 неща,
това означава, че ще трябва да копирате всички 1000 от тези неща
да премине в функцията? То не трябва да направи това незабавно.
Ако вътрешността на тази функция никога всъщност променя Foo,
така че ако ($ Foo === "здравей") връщане вярно;
Забележете, ние всъщност никога не се е променил аргумент вътрешността на тази функция,
което означава, че каквото и да е приет, тъй като никога не Foo трябва да бъдат копирани
, защото не е изменение.
Така че PHP работи е аргументи винаги се предават по референция
докато всъщност се опитват да го променят.
Сега, ако кажа, $ Foo + +; сега ще направи копие на оригиналната Foo и промяна на копие.
Това спестява доста време.
Ако никога не сте докосването на тази масивна решетка, никога няма да го променят,
че не е необходимо да се направи копие,
като има предвид, че, ако ние просто сложи този символ, това означава, че дори не го копирате
Дори и да го променят.
Това поведение се нарича копие на запис.
Ще го видите и на други места, особено ако сте се разбира операционната система.
Копиране на запис е доста обичайната схема, при която не е нужно да се направи копие на нещо
освен ако не е действително се променя. Да.
[Ученик] Какво ще стане, ако сте имали увеличение вътре в теста,
така че само 1 елемент от 1000 ще трябва да се промени?
Не съм сигурен.
Мисля, че ще копира цялото нещо, но това е възможно, то е достатъчно умен, че -
Всъщност, това, което си мисля, е, представете си, че е масив, който изглежда така: $ array2 = [
Тогава индекс "а" е масив от [1 2 3 4], а индексът "б" е набор от каквото.
Имам нужда от запетаи между всички тези. Представете си, има запетаи.
Тогава "С" е на стойност 3.
Добре.
Сега нека да кажем, че правим Баз ($ array2);
където Баз не вземе това по референция.
Значи $ Foo ['в'] + +;
Това е такъв пример, където преминава array2 като аргумент
и след това го променя конкретен индекс на масива от него увеличаване.
Аз честно казано нямам представа какво PHP ще направи.
Тя може лесно да се направи копие на цялото нещо, но ако тя е умна,
, че ще направи копие на тези клавиши, когато това ще има различния си стойност
но това все още може да сочат към един и същ масив 1,2,3,4
и това все още може да сочат към един и същ масив.
Ще го IPAD.
Минаваме в този масив, където този човек точки 3, този човек [1,2,3,4],
Този човек пункта до [34] ...
Сега, когато сме я предава в Баз, ние сме промяна.
Ако PHP е интелигентен, той може просто да направя -
Ние все още трябва да копирате някакъв спомен, но ако не бяха тези огромни вложени подмасива
ние не трябва да копирате тези.
Аз не знам дали това е, което го прави, но мога да си представя да го прави, че.
Това също е доста голямо предимство на C PHP.
>> PHP прави живота много по-лесно за много неща,
но някак си нямат абсолютно никаква представа колко добре ще изпълнява
защото нямам идея под капака, когато прави тези копия на неща,
о, е, че ще бъде постоянно копие от време,
просто няма да се промени едно показалеца, ще бъде абсурдно трудно линеен копие?
Какво ще стане, ако не може да намери пространство?
Ли трябва да тече събиране на отпадъци, за да получите повече пространство?
Събиране на боклука може да взема произволно дълго.
В C не е нужно да се притеснявате за тези неща.
Всеки един ред пишете в голяма степен причината за това как тя ще изпълнява.
>> Нека да погледнем назад към тези.
Колко хубаво е, че не е нужно да се справят с хеш функции,
свързани списъци, или нещо подобно?
Тъй като работата с хеш таблици е толкова лесно сега, тук е забавно пъзел да работят.
Отворете файл, наречен unique.php и в него се напише програма PHP
(Известен също като "скрипт").
Ние сме склонни да ги наричат ​​скриптове, ако те са кратки неща, които се движат в командния ред.
По принцип, всеки език, който не се съставят, а ти започваш да стартирате изпълнимия
в командния ред, можете да се обадите на този скрипт изпълним.
Също толкова добре мога да се напише програма на C, която прави това,
но аз не го наричат ​​скрипт, тъй като за първи път го компилирате и след това пуснете на двоичен.
Но тази програма PHP отиваме да се обадя на сценария.
Или ако го е написал в Python или Perl или Node.js или някое от тези неща,
ние ще ги наричаме всички скриптове, защото ги стартирате командния ред
но ние не ги компилирате.
Можем да го направим доста бързо.
Ние няма да използвате argv. Нека просто се взриви през тази.
Наречете го уникален, напишете програма.
Може да се предположи, че на входа ще съдържа по една дума на ред.
Всъщност, argv ще бъде доста тривиално да използвате.
unique.php.
Първото нещо, което за първи път, ние искаме да проверим дали са преминали един от командния ред аргумент.
Точно както бихте очаквали argc и argv в C, ние все още имаме тези в PHP.
Така че, ако ($ argc! == 2), тогава няма да се занимава с печатането на съобщение или нещо.
Аз просто ще излезете, код на грешка 1.
Аз също може да се върне 1.
Рядко в PHP са в това състояние, къде сме ние -
Обикновено сте функция, наречена от функция, наречена от функция, наречена от функция.
И ако нещо се обърка и просто искате да излезете от всичко изцяло,
изход просто приключва програмата.
Това съществува и в C.
Ако сте във функция във функция във функция във функция
и искате просто да убие програмата, можете да се обадите на излизане и тя просто ще излезете.
Но в PHP е още по-рядък, че ние сме в това най-високо ниво.
Обикновено сме вътре някаква функция, така че ние наричаме излизане
, така че ние не трябва да се върне до 1 нещо, което след това осъзнава, има грешка
така че се връща, ако, която признава, че е грешка.
Ние не искаме да се справим с това, така че EXIT (1);
възвръщаемост (1), в този случай би било равносилно.
>> Тогава това, което искате да отворите искаме да fopen.
Аргументите ще изглеждат доста сходни.
Ние искаме да fopen ($ argv [1], и ние искаме да го отворите за четене.
Това връща ресурс, който отива да се обадя е.
Това изглежда доста сходен как C го прави, освен ние не трябва да се каже * FILE.
Вместо това, ние просто да кажем $ е. Добре.
Всъщност мисля, че това дори ни подсказва да функционира PHP файл, наречен. PHP файл.
Това ще направи, е да прочетете целия файл в масив.
Ти дори не трябва да го fopen. Това ще направи това за вас.
Значи $ линии = файл ($ argv [1]);
Сега всички редове от файла са в линии. Сега искаме да сортирате линии.
Как можем да сортирате редове?
Ние да сортирате линии.
И сега можем да ги отпечатате или каквото.
Вероятно най-лесният начин е foreach ($ линии, като $ ред) ехо $ ред;
[Ученик] не бихме дори пресичат линии чрез съотнасяне нещо в вид?
Това е мястото, където вид да бъдат определени като функция сортиране (& $ масив).
Когато се обадите функцията, която не се предава по референция.
Това е функция, която се определя като като препратка.
Това всъщност е точно какво се е объркало
когато ние поставяме всичко за нашите сървъри, когато отидохме от 05.03-05.04.
До 5,4, това е напълно разумен.
Функция не се очаква да го вземе като отправна точка, но можете да го предадете като позоваването
така че ако функцията се случи да го променят, тя все още е модифициран.
Считано от 5.4, не би трябвало да направите това.
Така че сега само начина, по който преминават чрез позоваване е, ако функцията изрично го прави.
Ако не искате да го промените, тогава вие трябва да направите $ копие = $ линии и копиране на прохода.
Така че сега линии ще бъдат запазени и копие ще се промени.
php.unique.php. Може би щях да побъркани нещо.
Неочаквано "вид".
Ще бъде нещо, което прави това за нас.
Тя дори не е там.
Забележете, когато четете ръководството, че първият аргумент се очаква да бъде масив
и е взето по референция.
Защо това се оплакват с мен? Защото имам тази функция вид все още тук, че аз не искам.
Добре, php.unique.php. Не съм го давате аргумент, защото не е нужно файл.
Това е php.unique.php на test.php.
Ето test.php всички отпечатани в хубаво подредени за.
Забележете, че подредени ред е малко странно за код на файла
защото всички от нашите празни редове ще дойдат първо
след това ще дойде на едно ниво вдлъбнатини
след това идват на нашите не вдлъбнатини.
Да. >> [Ученик] Така за изходния код не е приет чрез препратка?
Е, че обикновено се предават по стойност?
Bowden] Когато се обадите функция, тя никога не определя дали се предават по референция.
Това е дефиницията на функцията, който определя дали се предават по референция.
И гледам в дефиницията на функцията на сортиране или просто търсите това,
е необходимо аргумент по референция.
Така че, независимо от това дали искате да го вземе чрез препратка, тя не е по референция.
Той променя масива на място.
Това просто не е позволено. Не ти е позволено да направят това. >> [Ученик] О, добре.
[Bowden] Това, нещо ще отнеме линии чрез препратка и го променете.
И отново, ако не искате да направите това, можете да направите копие на сортиране.
Дори и в този случай, копие всъщност не е копие на линиите.
Тя просто се насочва към едно и също нещо, докато не стане промяна,
където първият ще се промени в нещо функция,
, защото това е копие при запис, сега се случва да се направи копие на копие.
Можете да направите това. Това е другото място, където можете да видите амперсанд.
Можете да я видите в примки foreach, можете да го видите в декларации на функциите,
и вие я виждате, когато просто възлагане променливи.
Сега сме постигнали нищо по този начин
защото копиране и линии са буквално едно и също нещо.
Можете да използвате линии и да копирате взаимозаменяеми.
Можете да направите унищожен ($ копие); и че не се премахват линии,
просто губите препратка към едно и също нещо.
Така че от тази гледна точка, сега линии е единственият начин, по който можете да получите достъп линии.
>> Въпроси?
Да.
[Ученик] Напълно извън темата, но вие не трябва да затворите PHP - >> не.
Добре.
[Bowden аз ще отида толкова далеч, че да кажа, че е лоша практика да ги затвори.
Това вероятно е преувеличено, особено в скрипт,
но нека видим какво ще стане, ако направя това.
Това не е направил нищо. Какво става, ако исках - [въздишки]
Трябва да премине аргумент.
Застреляй. Обадих се правилно.
Така php.unique.php с аргумент.
Сега дори не е необходимо това.
Ще предам валиден аргумент.
Това отпечатан каквото и да е печат.
Аз печат копие и копие не съществува. Така линии.
Отпечатва всичко, и след това да забележите, всички тези боклуци тук,
защото в PHP нещо, което е извън PHP тагове
е просто ще бъдат отпечатани буквално.
Ето защо HTML, това е толкова хубаво, че мога да направя дивизия дрън, дрън, дрън клас или каквото,
дрън, дрън, дрън и след това да се направят някои PHP код, а след направим DIV края.
И сега отпечатване на това аз да си взема хубаво дивизия до върха, всичко, което PHP печатни, DIV в дъното.
Катастрофални, когато нещо подобно се случи, което е доста често срещано,
само едно бездомно нов ред в долната част на файла.
Може би не мисля, че това ще бъде, че голяма сделка
докато не отчетем факта, че с браузъри -
>> Как пренасочва работа или по принцип какъвто и заглавията работа,
когато правите връзка към уеб сайт и го изпраща обратно всички тези горни и неща
като отговор 200 или отговор, за пренасочване или каквото,
заглавията са валидни само до първия байт данни се изпраща.
Можете да пренасочите хиляди пъти, но веднага след като първи байт данни се изпраща
не би трябвало да се пренасочат отново.
>> Ако имате бездомно ред в долната част на файла
и нека кажем, че и след това искате да използвате тази функция -
Да кажем, че това е друг файл, който е index.php и require_once нещо -
Не мога да мисля за добър пример за това.
Въпросът се случва, когато получава отекна тази линия в долната част.
Не искам нищо да са отекна още.
Въпреки, че не е имал намерение нещо да се отекна, нещо, което се отекна
И така, сега не би трябвало да изпрати повече заглавията
и ти започваш да получавам оплаквания.
Ти просто не се нуждаят от тези затварящи тагове.
Ако имате намерение да правите нещо с HTML -
и това е напълно разумно да се направи тук DIV
и след това в този момент може или не може да ги включи.
Всъщност няма значение.
Но в PHP скриптове е рядкост да го затворите.
Когато всичко е PHP, абсолютно всичко,
наистина не трябва да го затворите / не трябва да го затворите.
>> Справяне със струни е много по-хубав, отколкото в C.
В PHP можете да зададете низ с единични или двойни кавички.
С единични кавички не можете да използвате "бягство" последователности.
Постоянно избяга, дрън, дрън, дрън.
Така ФОРМАТ е много рядко в PHP.
Предполагам, че ще използва ФОРМАТ ако исках да направя подобно нещо - в pset 5 sprintf или каквото сте използвали.
Но вие искате да направите 001.jpg и 002.jpg.
Така че за такова нещо, където аз всъщност искам да форматирате текста, бих използвал ФОРМАТ.
Но иначе бих просто използвайте конкатенация на низ.
Аз никога не използва ФОРМАТ.
Ние сме просто диференциране на информация между единични кавички и двойни кавички.
Най-голямата разлика е, че единични кавички, то ще бъдат отпечатани буквално.
Не е Чар тип данни в PHP, за разлика от C, така че това е еквивалентно на това.
И двамата са струни.
И хубавото единични струни цитат е, че може да се каже "Здравей, свят!" дрън, дрън, дрън,
$ $ Wooo.
Какво се случва, когато отпечатате това е, че ще го отпечатате буквално.
Да се ​​отървете от всички на нашите неща.
Така ехо $ str1;
Той буквално отпечатан всички тези неща: доларови знаци,
наклонена черта N, който бихте мисля, че би било знак за нов ред -
всички тези неща го отпечатва буквално.
Единственото нещо, което трябва да избягат са единични кавички
защото в противен случай би помислил, че ще затвори единични кавички.
Двойни кавички, съвсем различно.
Вече виждаме оцветяване на синтаксиса ни cluing на това, което е на път да отиде ужасно погрешно.
php.unique. Undefined променлива: Wooo, защото това се тълкува като променлива наречена Wooo.
Двойни кавички ви позволи да вмъкнете променливи в
Да речем, $ име = "Роб";
Така ехо "Здравейте, моето име е $ име!";
Тя признава това като променлива.
Когато аз тичам, че и аз ще вмъкнете нов ред - Здравей, името ми е Роб! и здравей свят!
Това е така, защото никога не съм се отстраняват отпечатването на Wooo по-горе.
Има 1-нататъшна стъпка можете да направите.
Масива $ = [1, 2, 3];
Какво ще стане, ако желаете да отпечатате първия индекс на масива?
Можете да направите масива $ [0].
Оцветяване на синтаксиса е представа. Каква е тази смяташ да правиш?
php.unique.
Здравейте, моето име е една! който не е това, което исках.
Оцветяване на синтаксиса ме излъга.
Нека се опитаме "-> 1," б "-> 2.
Ето как аз ще трябва да го напиша.
Неочаквана апостроф (T_ENCAPSED дрън, дрън, дрън, дрън, дрън).
Идеята е, че тя не признава това като част от масива.
Това не е признаването на този масив, индексирани с писмо на.
Вие искате да направите това, заобиколен от фигурни скоби,
и сега каквото и да е в тази презрамки къдрава ще се интерполират
което е дума, която използваме за магически поставяне на тези променливи в правилните места.
Сега правя това, php.unique и Здравейте, моето име е 1! както се очаква
Здравейте, моето име е Роб!
Едно нещо, което е нещо хубаво за единични кавички е, че
Има някои разходи за интерполиране.
Ако използвате двойни кавички, преводачът трябва да мине през този низ,
като се уверите, че: "О, тук е променлива. Сега трябва да отида на тази променлива и я поставете тук."
Дори ако не използвате променливи,
нищо вътре в тези двойни кавички трябва да се интерполира,
но все пак ще бъде по-бавно, защото трябва да отидем на двойни кавички
търси неща, които трябва да се интерполира.
Така единични кавички може да бъде малко по-бързо, ако нищо не трябва да се интерполира,
и са склонни да използвате дори единични кавички, "Здравейте, моето име е". Масива $ ['а'] така или иначе.
Това ще бъде еквивалентно на това, което сме имали преди.
Но това е въпрос на предпочитание.
Ако използвате PHP, най-вероятно не ми пука за разлика в скоростта.
Не е достатъчно, за да разсъждаваме, да започнем с това.
>> Някакви последни въпроси?
>> Ние всъщност не дори да получите чрез всичко това, но тези неща е скучно.
Последното нещо, което е нещо хубаво в PHP е, когато имаш работа с HTML,
ще го използвате малко, така хубаво синтаксис пряк път за печат на променлива.
Без пускането на PHP тук, това се нарича къси тагове.
Официално от PHP 5.4, това е нежелателно.
Се препоръчва да се сложи PHP.
Това е все още поддържа, толкова кратки тагове с <= все още са съвършено глоба.
Поддържа по подразбиране, така че можете да ги използвате, както желаете, и те са доста удобен.
>> Някакви въпроси?
Добре.
>> Останете класа, Сан Диего.
[Подсмихва]
Чао. [Смее се]
[Аплодисменти] [смее се]
>> [CS50.TV]