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