[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,
а зараз раптам ні адна з нашых код працуе
таму што там здарылася, было ніякіх зьменаў паміж 05/03 і 05/04
якія не з'яўляюцца назад сумяшчальнымі,
і мы павінны пайсці і выправіць усе нашы рэчы, якія не працуюць на 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
і я можам перабіраць яго як такой.
Але як толькі я скінуць 2. індэкс, што было ў індэксе 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.
Гэта па-ранейшаму падтрымліваецца, так што кароткія тэгі <? = Па-ранейшаму выдатна.
Гэта па змаўчанні падтрымліваецца, так што вы можаце выкарыстоўваць іх як вы хочаце, і яны вельмі зручныя.
>> Ёсць пытанні?
Добра.
>> Заставайцеся стыльнай, Сан-Дыега.
[Смяецца]
Пакуль. [Смяецца]
[Апладысменты] [смяецца]
>> [CS50.TV]