[Powered by Google Translate] [Rozdział 8 - bardziej komfortowe] [Rob Bowden - Harvard University] [To jest CS50. - CS50.TV] Te notatki sekcja tygodnie będą dość krótki, więc jestem po prostu będzie rozmawiać, macie zamiar trzymać zadawanie pytań, i postaramy się wypełnić jak najwięcej czasu, jak to możliwe. Wiele osób uważa, że ​​to pset niekoniecznie trudne, ale jest to bardzo długo. Pset specyfikacja sama zajmuje godziny czytać. Dajemy Ci wiele SQL mogłoby ewentualnie potrzebne do użycia. Mamy Cię przez wiele go, więc nie powinno być tak źle. Czy ktoś zaczął lub skończył? To ostatni zbior. Och, mój Boże. Zazwyczaj istnieje JavaScript jeden po tym, ale rzeczy zmieniają kalendarza czyni wszystko 1 tydzień krótszy, a my nie będziemy mieli Pset JavaScript. Nie wiem, jak to wpływa czy JavaScript zamierza pojawić się na egzaminie lub Quiz 1. Wyobrażam sobie to będzie coś, co musisz wiedzieć wysokie rzeczy o JavaScripcie ale wątpię, że po prostu daje prosty kodu JavaScript ponieważ nie miał PSET w nim. Ale to będzie coś do przeglądu quizu w przyszłym tygodniu. Sekcja pytań. Wiele z tych rzeczy jest trochę źle sformułowane, ale omówimy dlaczego. W przeciwieństwie do C, PHP jest "dynamicznie wpisywanych" język. Co to znaczy, pytasz? Cóż, pożegnać się wszystkie te char, float, int, i słów kluczowych innych trzeba użyć podczas deklarowania zmiennych i funkcji w C. W PHP, Typ zmiennej jest określany przez wartość, która jest aktualnie dominującej. Więc zanim wpisać ten kod w pliku o nazwie dynamic.php, PHP jest dynamicznie wpisane. To prawda. Nie zgadzam się z tym, że to oznacza, że ​​pożegnanie char, float, int, i inne słowa kluczowe. Dokładna różnica między dynamicznie wpisywanych i ewentualnie, która jest statycznie wpisane, że dynamicznie typowanym, wszystkie z kontroli typu i rzeczy dzieje się w czasie pracy, natomiast statycznie wpisane zdarza się w czasie kompilacji. Słowo static w ogóle wydaje się oznaczać rzeczy czasie kompilacji. Myślę, że istnieją inne zastosowania dla niego, ale w C Kiedy deklarujesz zmienną statyczną, ich przechowywanie ma przydzielone w czasie kompilacji. Tutaj dynamicznie typowanym prostu oznacza, że ​​- W C jeśli spróbujesz dodać ciąg i liczbą całkowitą, gdy go skompilować, to będzie narzekać, bo to będzie, że nie można dodać int i wskaźnik. To nie tylko ważne działanie. To jest inna sprawa, że ​​my się do w sekund. Ale tego rodzaju kontroli, fakt, że skarży się w czasie kompilacji, jest statyczna kontrola typów. Istnieją języki, w którym nie trzeba mówić char, float, int, i wszystkie z tych rzeczy, ale język można powiedzieć, z kontekstu rzeczy, jakiego typu ma być, ale nadal statycznie wpisane. Więc jeśli wziąć 51, OCAML, nigdy nie będziesz musiał korzystać z tych typów, ale nadal będzie w czasie kompilacji, mówią, że nie może tego zrobić, ponieważ jesteś mieszanie int i ciąg. Dynamicznie typowanym oznacza tylko, że kiedyś w czasie pracy będziesz dostać skargę. Jeśli przed Java również, ogólnie, prawie każdego typu C Język zostanie statycznie wpisane, więc C, C + +, Java, wszystkie te są ogólnie statycznie wpisane. W Javie podczas kompilacji coś i mówisz string s równa się nowe coś, co nie jest ciągiem znaków, że będzie na co narzekać, ponieważ te typy po prostu nie pasują do siebie. To się dzieje na co narzekać w czasie kompilacji. Ale ma też pewne rzeczy, jak dynamiczny czas jeśli spróbujesz rzucić coś do typu, który jest bardziej szczegółowy niż obecnie rodzaju, nic nie może zrobić w czasie kompilacji, aby sprawdzić, czy odlew będzie sukces. Java ma także pewne dynamiczną kontrolę typu, że tak szybko, jak to robi do tej linii kodu kiedy jest faktycznie wykonywana, to będzie zrobić obsadę Jeśli sprawdzenie ważności, że odlewane w pierwszym miejscu, i jeśli nie był, to się skarżą, że masz nieprawidłowy. Dynamiczna kontrola typów. Wpisz to w pliku o nazwie dynamic.php. Dynamic.php. Ja rozpakować że formatowanie. Mamy zmienną, możemy ustawić ją do liczby całkowitej 7, wtedy będziemy go wydrukować i% s - Oh, my drukowania typ to, więc gettype będzie zwraca typ zmiennej. Jesteśmy po prostu drukowania typu kółko. Właśnie php.dynamic.php. Zobaczymy, że zmienia się z liczby całkowitej na ciąg na Boolean jak przejść. W C nie ma typ danych logicznych, nie ma danych typu ciąg. Jest char * i Boolean tak bywa int lub char lub coś. W PHP te typy nie istnieją, i to jest jedna z wielkich zalet PHP ponad C - że operacje na łańcuchach są nieskończenie łatwiejsze w PHP niż C. Oni po prostu działają. Więc tu wrócić. Pobiegliśmy dynamic.php. Ten mówi interpreter PHP, o nazwie PHP, aby uruchomić kod PHP w dynamic.php. Jeśli masz jakieś błędy w pliku, tłumacz powie! Tłumacz, to inna wielka różnica między PHP i C. W C musisz skompilować coś, a potem uruchomić tego skompilowanego pliku. W PHP nie musisz nic kompilować. Więc interpreter PHP jest zasadniczo właśnie czyta ten wiersz po wierszu. Uderza var = 7 uderzy printf następnie uderza var następnie uderza printf itd.. Jest trochę kompilacji to robi, i to buforuje rezultaty więc jeśli uruchomić skrypt później można zrobić niektóre, ale w zasadzie jest to linia wg linii rzeczy. Oznacza to, że wiele z optymalizacji, które otrzymujemy w C, jak kompilacji, to jest po prostu generalnie kompilator może zrobić wiele sztuczek dla Ciebie. Można go wyjąć nieużywanych zmiennych, można zrobić wszystkie te różne rzeczy, może zrobić rekurencję ogonową. W PHP nie dostaniesz tej korzyści bo to po prostu będzie rozpoczęcie wykonywania linii przez linia po linii, i tak naprawdę nie uznają tych rzeczy tak łatwo ponieważ nie 1 duży przebieg kompilacji na rzeczy, a następnie wykonanie jest; to jest po prostu linia po linii. Więc to jest interpreter. Powrót do naszego dynamicznego wpisując: całkiem fajne, co? Na pewno nie da się tego zrobić w C! Teraz zobacz, czy możesz dowiedzieć się typ każdej z następujących wartości. Zobacz ten punkt odniesienia. Więc 3,50. Jaki rodzaj myślisz, że będzie? Oto typy mamy. Mamy bools, wartości, punkty pływające, stringi, tablice, obiekty, i zasobów, co jest raczej niejasne. Myślę, że jest rzeczywiście przykładem. Potem jest NULL. NULL to specjalny typ. W przeciwieństwie do C, gdzie null jest tylko wskaźnik o adresie 0, w PHP, NULL jest jego własny rodzaj, gdzie obowiązuje tylko sprawa tego typu jest NULL. Jest to o wiele bardziej przydatne dla kontroli błędów. W C, gdzie mieliśmy ten problem, jeśli zwróci null, znaczy jesteś powrocie wskaźnikiem NULL lub używając NULL oznaczać błąd lub wszystkie z tego zamieszania, jakie mieliśmy w jednym punkcie. Tu wraca NULL zazwyczaj oznacza błąd. Wiele rzeczy, także return false błędu. Ale chodzi o to NULL typu, jedyną rzeczą, na NULL typu NULL. Następnie callback jest jak można zdefiniować pewne anonimowe funkcje. Nie musisz dać funkcję nazwę, ale nie będzie miał do czynienia z tym tutaj. Patrząc na typy, że należy się spodziewać, abyśmy wiedzieli, co myślisz typ 3,50 jest? >> [Uczeń] Float. Tak. Więc tutaj, co o tym myślisz typ to jest? >> [Uczeń] Array. Tak. Pierwszy był float, drugi jest tablicą. Zauważ, że ta tablica nie jest jak tablica C gdzie masz indeks 0 ma pewną wartość, index 1 ma pewną wartość. Tutaj są wskaźniki a, b, c i wartości 1, 2, i 3. W PHP nie ma żadnej różnicy między tablicy asocjacyjnej i zaledwie tablicy regularnej jak można myśleć w C. Jest tylko to, a pod maską jest tylko regularne tablica asocjacyjna gdzie 0 mapy do pewnej wartości sam sposób mapy do pewnej wartości. Z tego powodu, PHP może być bardzo szkodliwe dla bardzo szybki kod / benchmarking rzeczy ponieważ w C, gdy używasz tablicę wiesz, że dostęp do członka jest stała czasowa. W PHP dostęp członka jest kto wie, ile czasu? To chyba stała jeżeli jest ono hashe poprawnie. Kto wie, co to naprawdę robi się pod maską? Naprawdę trzeba patrzeć na życie, aby zobaczyć jak to będzie sobie z tym poradzić. Więc fopen. Myślę, że tutaj niech tylko podręcznik PHP fopen spojrzeć na typ zwracany. Widzimy tutaj można wyszukać prawie żadnych funkcji w PHP instrukcji i to jest jakby w manualu PHP. Typ zwracany będzie zasobem. Dlatego poszukaliśmy go, bo tak naprawdę nie określają zasób. Pomysł zasobu, w C masz rodzaj ma plik * lub cokolwiek; w PHP zasobem jest Twój plik *. To co masz zamiar być czytanie ze, to co masz zamiar napisać do. Jest to zwykle zewnętrzne, więc jest to zasób można wyciągnąć rzeczy od i rzucać rzeczy. I w końcu, co to jest typ NULL? >> [Uczeń] NULL. Tak. Więc jedyną rzeczą, która jest NULL NULL. NULL NULL. Jedną z cech systemu typu PHP (na lepsze lub na gorsze) jest jego zdolność do żonglowania typy. Kiedy piszesz wiersz kodu PHP, który łączy w sobie wartości różnych typów, PHP będzie próbował zrobić coś sensownego. Wypróbuj każdy z następujących linii kodu PHP. Co drukowane? Czy to jest to, czego oczekuje? Dlaczego lub dlaczego nie? Fakt ten o PHP jest to, co sprawia, że ​​to, co nazywamy słabo wpisane. Słabo i silnie wpisane na maszynie, istnieją różne zastosowania dla tych pojęć, ale większość ludzi używa słabo wpisane i zdecydowanie wpisane oznaczać coś takiego gdzie ("1" i 2), która działa. W C, który nie działał. Można sobie wyobrazić, to nie działa. Wielu ludzi mieszać dynamiczne typowanie i słabą wpisywania i statycznego typowania i silne wpisywanie. Python to kolejny przykład języka, który jest dynamicznie wpisałeś. Możesz rzucić wokół typów w zmiennych i to będzie do ustalenia w czasie wykonywania żadnych checkings błędach. W Pythonie to będzie wykonać to i to zobaczyć ("1" + 2); i to nie dlatego, że mówi, że nie można dodać ciąg i liczbą całkowitą. W PHP, które jest tak samo dynamicznie typowanym, nie zawiedzie. Słaby pisania ma do czynienia z tym, że robi rzeczy z typami że tak naprawdę nie ma sensu niekoniecznie. Więc ("1" + 2), mogę sobie wyobrazić, że jest ciąg 12, mogę sobie wyobrazić, że jest ciąg 3, Mogę sobie wyobrazić, że jest liczbą całkowitą 3. To nie koniecznie dobrze zdefiniowane, a my prawdopodobnie będzie zobaczyć tutaj że podczas drukowania ("1" + 2), to pewnie skończy się inności niż drukowanie (1 + "2"). I to wydaje się być, moim zdaniem, na gorsze. Tutaj możemy spróbować tych. Kolejny mały trick o PHP to nie trzeba do zapisu pliku. To ma uruchomić ten tryb komend. Więc php-r, to możemy rzucić w poleceniu tutaj: "Print ('1 '+ 2);" i dorzucę nowy wiersz. Ten drukowane 3. Wygląda na to, drukuje 3 i jest to liczba całkowita 3. Więc teraz spróbujmy na odwrót: "Print (1 + 2"); Dostajemy 3, i jest to również będzie liczbą całkowitą 3? Szczerze mówiąc nie mam pojęcia. Wygląda na to, że jest spójna. Nigdy nie ma szans na to jest 12 ciąg czy coś jest, że ponieważ PHP, JavaScript i Java przeciwieństwie też ma osobny operator dla konkatenacji. Łączenie w PHP jest kropka. Więc drukowanie (1 2 ".) Ma dać nam 12. To często prowadzi do nieporozumień, gdy ludzie starają się zrobić coś jak str + = inna sprawa, że ​​chcą dodać na końcu ich ciąg, i że będzie na porażkę. Trzeba zrobić, ul. = Nie zapomnij więc łączenie w PHP jest kropka. Inne rzeczy do wypróbowania: print ("CS" + 50); Mówiłem ci, że nie ma nadziei na to powoduje CS50 ponieważ nie jest to łączenie +. Jak myślisz, co to będzie w końcu jest? I szczerze nie mają żadnego pojęcia. Wygląda na to, że to tylko 50. Widzi ciąg, i założę się, jeśli założymy 123CS - Widzi pierwszy łańcuch, próbuje odczytać liczbę całkowitą z niej lub numer z niego. W tym przypadku widzi 123CS. "To nie ma sensu, jako integer, więc jestem po prostu myśleć o 123". Więc 123 + 50 będzie 173. I tu zaczyna się czytając to jako liczba całkowita. Nie widzę nic, więc to po prostu traktuje to jako 0. Tak 0 + 50 będzie 50. Jestem zakładając ten zrobi coś podobnego. Myślę 99. Tak, bo to zajmie pierwsze - Więc 99. Tutaj (10/7), gdyby to było C, co by to wrócić? [Uczeń] 1. >> Tak, to będzie 1, bo 10/7 dzieli 2 liczby całkowite. Podzielona przez całkowitą liczbę całkowitą będzie zwracać liczbę całkowitą. Nie może wrócić 1 punkt cokolwiek to będzie, więc to po prostu się do powrotu 1. Tutaj drukowania (10/7), to będzie rzeczywiście zinterpretować. A to oznacza, że ​​jeśli rzeczywiście chcą zrobić całkowitą zaokrąglanie i rzeczy w tym stylu, trzeba zrobić print (floor (10/7)); W C to chyba dziwne, że można polegać na całkowitej obcinania regularnie ale w PHP nie można, ponieważ automatycznie włączy ją do pływaka. A potem (7 + true); co myślisz, że będzie? Zgaduję, 8 czy to będzie prawdziwe, jak interpretować 1. Wygląda na to, że to 8. Więc wszystko co zrobiliśmy w ciągu ostatnich 10 minut powinieneś nigdy absolutnie zrobić. Pojawi się kod, który to robi. Nie muszą być takie proste, jak w tym. Można mieć 2 zmienne i 1 zmienna bywa ciąg a druga zmienna bywa int, a następnie dodać te zmienne razem. Ponieważ PHP jest dynamicznie wpisane i nie będzie robić żadnych kontrola typów dla Ciebie i ponieważ jest słabo wpisane i ponieważ będzie to tylko automatycznie wyrzucić te rzeczy razem i wszystko będzie po prostu działać, trudno nawet wiedzieć, że zmienna ta musi być ciąg teraz tak, że nie należy dodawać do tej zmiennej, która jest liczbą całkowitą. Najlepszym rozwiązaniem jest, czy zmienna jest ciągiem znaków, przechowywać go jako ciąg zawsze. Jeśli zmienna jest int, utrzymać ją jako int zawsze. Jeśli chcesz zajmować się liczb i łańcuchów, można użyć varsint - to JavaScript. Intval. Robię to przez cały czas. PHP i JavaScript I wymieszać wszystko. Więc intval zamierza powrócić wartość całkowitą zmiennej. Jeśli przechodzą w "print (intval ('123 ')); dostaniesz 123. Intval sama nie zrobi czek dla nas, że to jest wyłącznie całkowitą. Obsługi PHP, istnieje tak wiele funkcji dostępne, więc myślę, że to, co używam jest is_numeric pierwszy. Zgaduję, że zwrócone false. To kolejna rzecz, którą musimy przejść przez to. === Więc is_numeric ('123df "), to nie myśleć, że jak is_numeric. W C trzeba by iterować wszystkie znaki i sprawdzić, czy każdy znak jest cyfrą lub cokolwiek. Tutaj is_numeric zrobi to za nas, i to zwracać wartość false. Więc kiedy drukowane, że to nic nie drukowane, więc mam porównanie, aby zobaczyć, nie zdarzy ci się być fałszywe? I tak teraz jest drukowanie 1. Podobno to drukuje 1 jako prawdziwe zamiast drukować prawdziwa jak prawda. Zastanawiam się, czy zrobić print_r. Nie, to jeszcze nie 1. Wracając do ===, == nadal istnieje, i jeśli porozmawiasz z Tommym powie == jest idealnie czysty. Mam zamiar powiedzieć, że == jest straszna i nigdy nie powinno się używać. == Różnica jest taka, że ​​== porównuje rzeczy , gdzie może być prawdą, nawet jeśli nie są one tego samego typu, natomiast === porównuje rzeczy i pierwszy sprawdza, czy są one tego samego typu? Tak. Ok, teraz mam zamiar sprawdzić, czy rzeczywiście porównać równe. Się dziwne rzeczy, jak 10 równa - Zobaczmy, co to mówi. So ('10 '== '1 E1 "); Zwraca true. Czy ktoś ma jakieś domysły, dlaczego zwraca true? To nie jest tylko o tym. Może to jest wskazówka. Ale jeśli mogę zmienić na f - cholernie to! I zachować przy użyciu cudzysłowów. Powodem podwójne cytaty krzyczeć na mnie, ponieważ mam umieścić to w cudzysłów. Więc mogłem uciec cudzysłowia w tutaj, ale pojedyncze cudzysłowy ułatwić. So ('10 '== '1 f1'); nie drukuje prawdziwe. ('10 '== '1 E1 "); drukuje prawdziwe. [Student] Czy hex? >> To nie jest hex, ale jest blisko, że jest to jak - 1E1, notacja naukowa. Uznaje 1E1 jako 1 * 10 ^ 1 lub cokolwiek. Są równe całkowitymi. Jeśli robimy === wtedy będzie fałszywe. I rzeczywiście nie ma pojęcia, jeśli robimy == co (10 i '10abc ');? Dobrze. Tak, że to prawda. Więc jak, kiedy ty (10 + '10abc ") i będzie to 20, tu (10 == '10abc '); to prawda. Jeszcze gorsze są takie rzeczy jak (false == NULL) jest prawdziwe lub (false == 0); to prawda, (false == []); Istnieje dziwne przypadki - To jeden z tych dziwnych przypadków. Zauważmy, że (false == []); prawda. ('0 '== False) jest prawdziwe. ('0 '== []) Jest fałszywe. Więc == jest w żaden sposób przechodni. może być równa i B mogą być równe C, b, ale nie może być równy C. To jest obrzydliwością dla mnie, i zawsze należy stosować. === [Uczeń] możemy zrobić! ==, Jak również? >> [Bowden] Tak. Odpowiednik będzie! = I! ==. To jest faktycznie wychowywane w Pset specyfikacji gdzie wiele powrotu funkcji - Obsługi PHP jest dobry na ten temat. To stawia w dużym polu czerwonym "To zwróci false, jeśli jest błąd." Ale 0 powrocie jest całkowicie uzasadnione, co do powrotu. Pomyśl o dowolnej funkcji, które ma nastąpić zwraca liczbę całkowitą. Powiedzmy, że ta funkcja ma policzyć liczbę linii w pliku, czy coś. W normalnych warunkach, możesz przekazać tę funkcję plik i to będzie zwracać liczbę całkowitą, która reprezentuje liczbę linii. Więc 0 jest całkowicie uzasadnione numer, jeśli plik jest po prostu pusty. Ale co jeśli przekazana nieprawidłowy plik i funkcja dzieje return false jeśli przekazana nieprawidłowy plik? Jeśli po prostu zrobić == nie jesteś różnicującym sprawy pomiędzy nieprawidłowy plik i plik pusty. Zawsze należy stosować. === To wszystko z tych. W PHP, rodzaj tablicy jest inny od tego, co masz w zwyczaju w C. Rzeczywiście, można już zauważyć to powyżej, kiedy zobaczył, że to jest z tablicy znamionowej. Składnia jest nowy uchwyt w PHP 5.4, który jest najnowszą wersją PHP. Przed tym zawsze miałem napisać array ('a' -> 1, 'b' -> 2. To był konstruktor tablicy. Teraz wreszcie nadszedł PHP wokół do miłego składni zaledwie nawiasach kwadratowych, która jest po prostu o wiele lepiej niż tablicy. Jednak biorąc pod PHP 5.4 to najnowsza wersja, można napotkać miejsca, które nie mają nawet w PHP 5.3. W lecie wpadliśmy w tej sprawie, gdzie PHP 5,3 było to, co mieliśmy na urządzenia, ale serwer, który wdrożyliśmy wszystkie klasy książkę i złożyć i wszystkie rzeczy do to PHP 5.4. Nie wiedząc o tym, opracowaliśmy w 5,3, pchnął do 5,4, a teraz nagle nikt z naszego kodu działa bo akurat były zmiany między 5,3 a 5,4 które nie są kompatybilne, i mamy iść i naprawić wszystkie nasze rzeczy, które nie działają dla PHP 5.4. Do tej klasy, gdyż urządzenie ma PHP 5.4 to perfekcyjnie używać nawiasów kwadratowych. Ale jeśli jesteś patrząc na rzeczy w Internecie, jeśli szukasz trochę takich rzeczy tablicy, najprawdopodobniej masz zamiar zobaczyć przeliterować składni konstruktora Array ponieważ było około od PHP urodził i kwadratowych składnia wspornik już od kilku ostatnich miesięcy lub w każdym przypadku 5,4 przyszłaś. To jest jak indeks. Podobnie jak w języku C, jak byś index nawiasy kwadratowe jak $ tablica [0], $ tablica [1], $ tablica [2], indeksowania w ten sam sposób, jeśli zdarzy się, że Twoje indeksy są ciągami. Więc $ array ['a'] i $ array ['b']. $ Tablica [b]. Dlaczego miałoby to być nie tak? To prawdopodobnie będzie generować ostrzeżenie, ale nadal działa. PHP ma tendencję do tego. To skłania do po prostu, "Będę cię ostrzec o tym, ale mam zamiar iść dalej "I robić, co się da." Prawdopodobnie będzie przełożyć to na ciąg znaków, jednak jest możliwe, że w pewnym momencie w przeszłości że ktoś define b, aby być "HELLO WORLD". Więc teraz b może być stała i $ array [b] będzie faktycznie robi 'Hello World'. Myślę, że w tym momencie, a przynajmniej nasze ustawienia PHP, jeśli spróbujesz indeksu do tablicy i ten klucz nie istnieje, nie powiedzie się. Nie sądzę, że będzie to tylko ostrzeżenie. Albo przynajmniej można ustawić go tak, że nie tylko ostrzegam, to tylko prosto nie. Sposób można sprawdzić, czy faktycznie jest taki indeks isset. Więc isset ($ array ['Hello World']) zwróci false. isset ($ array ['b']) zwróci true. Można mieszać te składnie. Jestem pewien, że to, co ta tablica będzie w końcu jest to - możemy przetestować go. Oh, muszę PHPWord. To mieszanie składni, gdzie można wskazać, jakie klucz jest i nie precyzuje, jakie klucz. Więc 3 tutaj jest wartość. Masz wyraźnie nie powiedział, co jego klucz będzie. Co sądzisz jego klucz ma być? [Uczeń] 0. >> Zgaduję 0 tylko dlatego, że jest to pierwszy jeden nie został określony. Rzeczywiście możemy zrobić kilka takich przypadków. Więc print_r jest wydrukować rekurencyjne. Będą w nim całą tablicę. Byłoby drukować subarrays tablicy, gdyby nie było żadnych. Więc print_r ($ tablica); php.test.php. To nie wygląda na to, że dał mu 0. Jest rzeczywiście coś pamiętać tutaj, ale wrócimy do niego w sekund. Ale co, jeśli zdarzy mi się zrobić tego indeksu 1? PHP nie rozróżnia indeksów łańcuchowych i indeksów całkowitych, więc w tym momencie mam tylko określony indeks 1 i można zrobić zarówno $ tablica [1] i $ tablica ['1 '] i będzie to samo indeks i sam klucz. Więc teraz co myślisz 3 będzie? >> [Student] 2. >> [Bowden] Zgaduję 2. Tak. To 2. , Co oznacza, że ​​nie jest to 10, to jest 4? Co sądzisz indeks 3 będzie? Myślę 11. Zgaduję, co PHP robi - i myślę, że widziałem to wcześniej - jest to po prostu śledzi co najwyższy indeks numeryczny jest używany do tej pory jest. To nigdy nie będzie przypisać indeks string do 3. To zawsze będzie indeks numeryczny. Więc to śledzi na najwyższy jest przypisany do tej pory, co zdarza się 10, i to da 11 do 3. To, co powiedziałem wcześniej, zauważyć sposób jego drukowania tej tablicy. Wypisuje klucz 10, klucz 4, klucz 11, klucz d. Albo jeszcze zróbmy - Chyba nie umieścić 0, ale to jest druk 1, 2, 3, 4. Co jeśli zmienię tutaj? Albo niech faktycznie przełączyć te 2. Teraz drukuje 2, 1, 3, 4. PHP tablice nie są jak do zwykłej tabeli hash. Jest to całkowicie uzasadnione, aby myśleć o nich jako hash tablic 99% czasu. Ale w swoich tablicach hash nie ma sensu z rzędu, w którym rzeczy zostały wstawione. Więc jak tylko wstawić go do tabeli mieszania, zakładamy, że nie ma połączonej listy i można było ocenić w połączonej listy które wprowadzono pierwszy. Ale tu wstawione 2 pierwsze i wie, kiedy to drukowanie tej tablicy, że 2 jest pierwsze. Nie ma go wydrukować tylko w dowolnej kolejności. Techniczna struktura danych jest za pomocą jest sortowane na mapę, więc odwzorowuje klucze do wartości i zapamiętuje kolejność, w których te klucze zostały wstawione. Zasadniczo jest to do pewnych komplikacji, gdzie jest to naprawdę irytujące - Powiedzmy, że masz tablicę 0, 1, 2, 3, 4, 5 i chcesz wziąć indeks 2. Jeden sposób to zrobić, zobaczymy, co to wygląda. 0, 2, 1, 3, 4. Unset dzieje się rozbroić obie zmienne i wskaźniki tablicy. Więc unset ($ tablica [2]); Teraz, co to będzie wyglądać? 2 jest po prostu nie ma, tak że jest całkiem dobrze. Bardziej irytujące jest, jeśli chcesz rzeczy rzeczywiście być jak tablicy. Powiem liczb losowych. Zauważcie swoje indeksy. Chcę, aby po prostu być jak tablicy C, gdzie idzie od 0 do długości - 1 i mogę iteracyjne nad nim jako takie. Ale jak tylko zniszczy drugiego indeksu, co było w indeksie 3 nie teraz staje index 2. Zamiast tego, po prostu usuwa ten indeks, a teraz idziesz 0, 1, 3, 4. Jest to całkowicie uzasadnione. To jest po prostu irytujące i trzeba robić takie rzeczy jak splice tablicy. Tak. [Uczeń] Co by się stało, gdybyś miał dla pętli i chcesz przejść na wszystkie elementy? Kiedy uderzył 2, to wydajność kiedykolwiek? Iteracja tablicy. Istnieją 2 sposoby, można to zrobić. Możesz używać regularnie na pętli. Jest to kolejna zawiłość z PHP. Większość języków, chciałbym powiedzieć, mieć jakiś długości lub len czy coś określająca długość tablicy. W PHP jest to count. Więc count ($ tablica); $ i + +) Miejmy print ($ tablica [$ i]); Notice: Undefined offset: 2. To po prostu się nie powiedzie. To jest powodem, że w przeważającej części, nigdy nie będziesz musiał iteracyjne nad tablicę takiego. To może być przesada, ale nie musisz iteracyjne nad tablicę takiego ponieważ PHP zapewnia jej składni foreach gdzie foreach ($ tablica as $ item). Jeśli teraz wydrukować ($ item) - we'll omówić go w drugim - że działa doskonale. Sposób, że foreach działa jest pierwszym argumentem jest tablica, że ​​jesteś iteracja. I drugi argument, poz, przez każdego przebiegu pętli for to zajmie na pierwszego w tablicy. Więc pamiętaj tablica ma rozkaz. Za pierwszym razem przez pętlę for, poz będzie 123 to będzie 12 to będzie 13 to będzie 23 to będzie 213. Robi się naprawdę dziwnie, gdy coś jak foreach. Zobaczmy, co się dzieje, ponieważ nigdy nie należy tego robić. Co jeśli unset ($ array [1]); To był prawdopodobnie spodziewać. Jesteś iteracja tej tablicy i za każdym razem jesteś wyłączania pierwszy indeks. Więc dla indeksu 0, pierwszą rzeczą, poz przyjmuje wartość 0, więc to będzie 123. Ale wewnątrz pętli for my unset index 1, więc oznacza to 12 już nie ma. Tak drukować. PHP_EOL. PHP_EOL jest tylko znak nowej linii, ale jest technicznie bardziej przenośne ponieważ newlines w systemie Windows różni się od nowej linii na Mac i UNIX. W systemach Windows linii jest \ r \ n, a wszędzie indziej ma tendencję żeby być \ n. PHP_EOL jest tak skonfigurowany, że używa cokolwiek newline Twojego systemu jest. Tak drukować, że. Niech nie print_r ($ array) na końcu. Nie miałem pojęcia, że ​​to byłoby zachowanie. Pozycja nadal przyjmuje wartość 12 chociaż unset 12 zanim kiedykolwiek dostał się do niego z tablicy. Nie wierz mi na słowo, ale to wygląda jak foreach tworzy kopię tablicy a następnie element nabiera wszystkich wartości tej kopii. Tak więc nawet w przypadku modyfikowania tablicy wewnątrz pętli for to nie obchodzi. Artykuł będzie na oryginalnych wartości. Spróbujmy wyłączania go. Co jeśli jest to $ array [1] = "hello"; Nawet jeśli stawiamy "hello" do tablicy, nie pozycja przyjmuje tę wartość. Jest inna składnia pętli foreach gdzie umieścić 2 zmiennych rozdzielonych strzałką. Ta pierwsza zmienna będzie kluczem tej wartości, i ta druga zmienna będzie dokładnie taki sam element. To jest nieinteresujące tutaj, ale jeśli wrócimy do naszej pierwotnej przypadku 'a' -> 1, "B" -> 1, tutaj jeśli tylko iteracyjne dla każdej tablicy jako elementu, pozycja będzie 1 za każdym razem. Ale jeśli chcemy też poznać klucz związany z tym elementem potem robimy as $ klucz -> $ element. Więc teraz możemy zrobić print ($ klucz. ':'. Teraz to iteracja i drukowanie każdy klawisz i związane z nią wartości. Dodatkową rzeczą, jaką możemy zrobić w pętli foreach jest można zobaczyć tej składni. Znaków handlowego przed nazwami zmiennych wydają się być jak PHP czy referencje. Gdzie odniesienia są bardzo podobne do wskaźników, nie ma wskazówek, więc nie można sobie z pamięci bezpośrednio. Ale masz referencje, gdzie 1 zmienna odnosi się do tego samego, co inne zmienne. Wewnątrz tutaj zróbmy $ item. Wróćmy do 1, 10. Zróbmy $ item + +, to nadal istnieje w PHP. Nadal można zrobić + +. php.test.php. Mam go wydrukować. print_r ($ tablica); Drukujemy 2, 11. Gdybym tylko zrobić foreach ($ tablica as $ item), a następnie produkt będzie wartość 1 pierwszy przez pętlę. To przyrost 1 do 2, a następnie gotowe. Więc to będzie przejść przez sekunda przejściu pętli i że pozycja jest 10. To pozycja zwiększa do 11, a następnie, że jest po prostu wyrzucić. Potem print_r ($ tablica); i zobaczymy, że to tylko 1, 10. Więc przyrost zrobiliśmy zaginął. Ale foreach ($ array, jak & $ item) teraz ten element jest taki sam jak ten element tutaj. To jest to samo. Więc $ item + + modyfikuje tablicę 0. Zasadniczo, można też zrobić $ k -> $ item i można zrobić $ array [$ k] + +; Więc inny sposób robi, że jesteśmy wolni, aby zmienić pozycję, ale nie będą modyfikować naszą oryginalną tablicę. Ale jeśli używamy k, który jest naszym kluczem, to może po prostu indeks do naszej tablicy przy użyciu tego klucza i przyrost tego. Ten bardziej bezpośrednio modyfikuje naszą oryginalnej tablicy. Możesz to zrobić nawet, że jeśli z jakiegoś powodu chciał możliwość modyfikowania - Faktycznie, jest to całkowicie uzasadnione. Nie chcę mieć do zapisu $ array [$ k] + +, po prostu chciałem napisać $ item + +, ale nadal chciał powiedzieć if ($ k === 'a') następnie zwiększyć element, a następnie wydrukować naszą tablicę. Więc teraz co mamy oczekiwać print_r zrobić? Jakie wartości powinny być drukowane? [Tablica] 2 i 10. >> [Bowden] Tylko, jeśli klucz jest "a" mamy właściwie drukować to. Prawdopodobnie bardzo rzadko, jeśli w ogóle, będą musiały określić funkcje w PHP, ale można zobaczyć coś podobnego, gdzie można zdefiniować funkcję jak cokolwiek funkcji. Wysyłka powiedziałbyś ($ foo, $ bar), a następnie określić, że jest cokolwiek. Ale jeśli tego nie zrobię, to znaczy, że wszystko, co zwraca cokolwiek, co nazywa baz, więc pierwszy argument przekazany do baz może być zmieniony. Zróbmy $ foo + +; i wewnątrz tutaj zróbmy BAZ ($ item); Teraz wywołanie funkcji. Argument podejmuje odniesienia, co oznacza, że ​​jeśli modyfikować jesteśmy modyfikując rzecz, że został przekazany w. I drukowania tego spodziewamy - chyba zawiedli składni - mamy 2, 11, tak było rzeczywiście zwiększany. Zawiadomienie musimy odniesień w 2 miejscach. Co zrobić, jeśli to zrobił? Co to znaczy? [Uczeń] Warto zmienić. >> Tak. Artykuł jest tylko kopia wartości w tablicy. Więc pozycja zmieni się na 2, ale tablica ['a'] nadal będzie 1. A co jeśli to zrobić? Teraz pozycja jest wysyłana jako kopię baz. Więc kopia argumentu zostanie zwiększony do 2, ale sama nigdy nie została pozycja zwiększana do 2. I pozycja jest to samo, co wspornika tablicy czymkolwiek, tak, że tablica nie została zwiększona. Tak więc oba te miejsca potrzebują. PHP jest zwykle bardzo mądry o tym. Możesz myśleć, że chcę przekazać przez odniesienie - To był właściwie pytanie na jednym z psets. Było questions.txt rzeczą gdzie powiedział, Dlaczego warto przekazać tę struct przez odwołanie? Jaka była odpowiedź na to? [Uczeń] Więc nie trzeba skopiować coś wielkiego. >> Tak. Struct może być dowolnie duża, a kiedy przechodzą w struct jako argument potrzebuje skopiować ten cały struct przekazać je do funkcji, natomiast jeżeli po prostu przekazać struct przez odniesienie potem po prostu musi kopiować 4-bajtowy adres jako argument funkcji. PHP jest trochę lepsze niż to. Jeśli mam jakąś funkcję i przejść do niego tablicę 1.000 rzeczy, to oznacza, że ​​będzie musiał skopiować cały 1.000 z tych rzeczy przekazać je do funkcji? Nie musi to zrobić natychmiast. Jeśli wewnątrz tej funkcji nigdy faktycznie modyfikuje foo, więc jeśli ($ foo === 'hello') zwróci true.; Zauważ, że nigdy właściwie zmodyfikowane wnętrze argumentem tej funkcji, co oznacza, że ​​wszystko, co zostało przekazywane jako nie należy foo kopiowane ponieważ nie jest modyfikacją. Więc sposób PHP działa to argumenty zawsze są przekazywane przez referencję aż faktycznie spróbować zmodyfikować go. Teraz, jeśli mówię $ foo + +, będzie teraz zrobić kopię oryginalnego foo i modyfikować kopię. Pozwala to zaoszczędzić trochę czasu. Jeśli nigdy nie dotykać tej ogromnej tablicy, nigdy tak naprawdę go zmodyfikować, nie trzeba zrobić kopię, natomiast jeśli tylko umieścić ten znak handlowego to znaczy, że nie ma nawet go skopiować nawet jeśli nie modyfikować. Takie zachowanie nazywa się copy-on-write. Zobaczysz je w innych miejscach, zwłaszcza jeśli wziąć kurs systemu operacyjnego. Copy-on-write to całkiem zwykły wzór, w którym nie trzeba zrobić kopię coś chyba że to faktycznie zmienia. Tak. [Uczeń] Co jeśli miał przyrost wewnątrz testu, tak tylko 1 element z 1.000 należałoby zmienić? Nie jestem pewien. Myślę, że byłoby skopiować całą rzecz, ale jest możliwe, to jest na tyle sprytny, że - Właściwie, co ja to sobie wyobrazić mieliśmy tablicę, która wygląda tak: $ tablica2 = [ Następnie index '' jest tablica [1 2 3 4], a indeksu "b" jest tablicą cokolwiek. Muszę przecinków pomiędzy wszystkich tych. Wyobraź sobie, że są przecinki. Następnie 'c' jest 3 wartości. Okay. Powiedzmy, że mamy $ baz ($ tablica2); gdzie baz nie wziąć to jako odnośnik. Więc $ foo ['c'] + +; To jest taki przykład, gdzie mijamy tablica2 jako argument a następnie jest modyfikacja określonego indeksu tablicy, zwiększając to. Szczerze mówiąc nie mam pojęcia co PHP ma zamiar zrobić. To można łatwo zrobić kopię całej rzeczy, ale jeśli jest mądry, będzie wykonanie kopii tych kluczy, gdzie będzie to miało swoją odrębną wartość ale można jeszcze wskazać na samej tablicy 1,2,3,4 i może jeszcze w tym samym punktu tablicy. Będę iPad to. Mijamy w tej tablicy, gdzie ten facet punkty 3, wskazuje to facet [1,2,3,4], Ten facet wskazuje na [34, ...] Teraz, kiedy przekazujemy go do baz, to modyfikujemy to. Jeśli PHP jest inteligentny, to może po prostu zrobić - Mieliśmy jeszcze skopiować trochę pamięci, ale jeśli były te ogromne zagnieżdżone subarrays nie trzeba kopiować tych. Nie wiem, czy to, co robi, ale mogę sobie wyobrazić, że to robić. Jest to również dość duża zaleta C przez PHP. PHP sprawia, że ​​życie jest o wiele łatwiejsze dla wielu rzeczy, ale niby nie mają żadnego pojęcia, jak dobrze będzie wykonywać bo nie mam pojęcia, pod maską, gdy robi te kopie rzeczy, oh, jest to, że będzie stała kopia razem jest to po prostu zmieni się 1 wskaźnik, czy to będzie śmiesznie trudny liniowy kopia? Co zrobić, jeśli nie można znaleźć miejsca? To wtedy trzeba uruchomić zbieranie śmieci, aby uzyskać pewne więcej miejsca? I zbieranie śmieci może dowolnie długo. W języku C nie musisz martwić się o tych rzeczach. Każda linia pisania Możesz bardzo dużo o tym, jak rozum to będzie wykonać. Spójrzmy wstecz na te. Jak miłe jest to, że nie masz do czynienia z funkcji mieszania, związane listy, albo coś takiego? Od pracy z tabel mieszania jest tak łatwo się teraz, tutaj jest zabawa puzzle pracować. Otwórz plik o nazwie unique.php aw nim napisać program PHP (Znany również jako "skryptu"). Mamy tendencję, aby połączyć je skrypty jeśli są krótkie rzeczy, które działają w wierszu poleceń. Zasadniczo, każdy język, że nie skompilować, ale masz zamiar uruchomić plik wykonywalny w linii poleceń, można wywołać ten skrypt wykonywalny. Mógłbym równie dobrze napisać program w C który robi to, ale ja nie nazywam to skrypt od kiedy pierwszy raz go skompilować i uruchomić program. Ale ten program PHP mamy zamiar wywołać skrypt. Lub jeśli napisał to w Pythonie lub Perl lub Node.js ani z tych rzeczy, którą nazywamy je wszystkie skrypty, bo je uruchomić w wierszu polecenia ale nie ich kompilacji. Możemy to zrobić dość szybko. Nie będziemy używać argv. Miejmy tylko dmuchać przez to. Nazwijmy to wyjątkowy, napisać program. Można założyć, że wejście będzie zawierać jedno słowo w wierszu. Właściwie, argv będzie dość banalny w obsłudze. unique.php. Pierwszą rzeczą po pierwsze, chcemy sprawdzić czy zostały przekazane 1 argument wiersza polecenia. Tak jak można się spodziewać ARGC i ARGV w C, nadal mamy te w PHP. Więc jeśli ($ argc! == 2) wtedy nie będzie zajmować się drukowania wiadomości lub cokolwiek. Ja po prostu wyjść, kod błędu 1. Mógłbym także powrócić 1. Rzadko w PHP czy w tym stanie, w którym jesteśmy na - Zwykle jesteś w funkcji o nazwie przez funkcję o nazwie przez funkcję o nazwie przez funkcję. A jeśli coś pójdzie nie tak i po prostu chcesz, aby zakończyć wszystko w całości, zjazd po prostu kończy program. To samo występuje w C. Jeśli jesteś w funkcji w funkcji w funkcji w funkcji i chcesz po prostu zabić program można wywołać wyjście i będzie to tylko wyjść. Ale w PHP jest bardziej rzadkie, że jesteśmy na tym najwyższym poziomie. Zazwyczaj jesteśmy w środku jakiejś funkcji, więc nazywamy wyjście tak, że nie mamy do powrotu do 1 rzeczy, które następnie realizuje tam błąd tak, że zwraca się, jeśli uznaje, że nie było błędu. Nie chcemy, aby sobie z tym poradzić, więc wyjść (1); Powrót (1), w tym przypadku za równoważne. Wtedy to, co chcemy, aby otworzyć chcemy fopen. Argumenty będą wyglądać dość podobnie. Chcemy fopen ($ argv [1], a my chcemy, aby go otworzyć do czytania. Które zwraca zasób który zamierzamy zadzwonić f. Wygląda to bardzo podobne do tego, jak robi to C chyba nie mamy do powiedzenia plik *. Zamiast po prostu powiedzieć, $ f. Okay. Właściwie, myślę, że to nawet daje nam wskazówkę co do funkcji PHP o nazwie pliku. Plik PHP. Co to będzie zrobić, to przeczytać cały plik do tablicy. Nie trzeba nawet fopen go. To zrobi to za Ciebie. Więc $ lines = file ($ argv [1]); Teraz wszystkie wiersze pliku są w linii. Teraz chcemy, aby posortować wiersze. Jak możemy posortować linie? Mamy posortować wiersze. I teraz możemy wydrukować je lub cokolwiek. Prawdopodobnie najłatwiej jest foreach ($ lines as $ linia) echo $ line; [Uczeń] nie możemy nawet przekroczyć linii odwołując coś w rodzaju? To jest, gdzie rodzaj zdefiniowany jako rodzaj funkcji (& $ tablica). Podczas wywoływania funkcji nie przekazać go przez odniesienie. Jest to funkcja, która określa ją jako biorąc go jako punkt odniesienia. To jest dokładnie to, co się stało kiedy postawił wszystko na naszych serwerach, kiedy poszliśmy z 5,3 do 5,4. Aż do 5,4, to było całkowicie uzasadnione. Funkcja nie spodziewamy się go jako punkt odniesienia, ale można przekazać go jako odniesienie więc jeśli funkcja nie stanie zmodyfikować go, to jeszcze zmienione. Począwszy od 5,4, nie powinieneś tego robić. Więc teraz jedynym sposobem przechodzą przez odniesienie jest, jeśli funkcja jawnie robi. Jeśli nie chcesz, aby go zmodyfikować, a następnie trzeba zrobić kopię $ = $ linii i kopia pass. Więc teraz linie zostaną zachowane i kopia zostanie zmieniony. php.unique.php. Mógłbym pomieszane coś. Unexpected "sort". Nie będzie to coś, że robi to dla nas. To nie jest nawet tam. Zauważyć podczas przeczytać instrukcję, że pierwszy argument należy spodziewać się tablica i jest wykonane przez odniesienie. Dlaczego jest to skargę do mnie? Bo ja mam ten rodzaj funkcji jeszcze tutaj, że nie chcę. Okay, php.unique.php. Nie przekazać go argument, bo nie ma pliku. To php.unique.php na test.php. Oto test.php wszystkie wydrukowane w ładnym porządku sortowanie. Zauważ, że posortowanych jest dziwne dla pliku z kodem ponieważ wszystkie nasze puste linie będą na pierwszym miejscu następnie będą pochodzić wszystkich naszych 1 poziomu wcięć następnie przyjść wszyscy nasi bez wcięć. Tak. >> [Uczeń] Tak dla kodu źródłowego nie był przekazywany przez odwołanie? Jest to, że na ogół przekazywane przez wartość? [Bowden] Po wywołaniu funkcji, nigdy nie określa, czy to było przekazywane przez referencję. To określenie funkcji, które określa, czy została przyjęta przez odniesienie. I patrząc na definicji funkcji sort lub po prostu patrząc na to, trwa argumentu przez odniesienie. Więc niezależnie od tego, czy chcesz go wziąć go przez odniesienie, to robi się to przez odniesienie. Modyfikuje tablicy w miejscu. To jest nie tylko dozwolone. Nie wolno tego robić. >> [Uczeń] Oh, w porządku. [Bowden] To, sortowanie zajmie linie przez odniesienie i modyfikować. I znowu, jeśli nie chcesz, aby to zrobić, można zrobić kopię rodzaju. Nawet w tym przypadku, kopiowanie nie jest faktycznie kopia linii. To po prostu wskazuje na to samo, aż po raz pierwszy zostaje zmieniony, gdzie jest 1-cia zamiar się modyfikować w funkcji sortowania, gdzie, bo to copy-on-write, teraz kopię karty zostanie wykonane. Można też to zrobić. To jest inne miejsce, można zobaczyć znak handlowego. Widać to w pętli foreach, widzisz to w deklaracji funkcji, i widać to, gdy tylko przypisywania zmiennych. Teraz osiągnęliśmy nic to robi ponieważ kopiowanie i linie są dosłownie to samo. Możesz używać linii i skopiować zamiennie. Możesz zrobić kopię unset ($), i że nie usuwa linie, po prostu traci odniesienie do tej samej rzeczy. Więc z tego punktu, teraz linie to jedyny sposób można uzyskać dostęp do linii. Pytania? Tak. [Uczeń] Zupełnie nie na temat, ale nie masz do zamknięcia PHP z - >> nie masz. Okay. [Bowden] chciałbym iść tak daleko, aby powiedzieć, że jest złą praktyką, aby je zamknąć. To chyba przesada, zwłaszcza w skrypcie, ale zobaczymy, co się stanie, jeśli to zrobić. Że nic nie zrobił. Co zrobić, jeśli chciałam - [wzdycha] Trzeba przekazać argument. Strzelać. Nazwałem to źle. Więc php.unique.php z argumentem. Teraz nie trzeba nawet tego. Będę go przekazywać poprawny argument. To, co jest drukowane druk. Jestem drukowania kopii i kopia nie istnieje. Więc linie. To wszystko, co drukowane, a następnie zauważyć wszystkie te śmieci tu, ponieważ w PHP, który jest cokolwiek poza PHP tagów jest po prostu będzie drukowane dosłownie. Dlatego HTML, to jest tak miło, że mogę zrobić div bla, bla, bla klasę lub cokolwiek, bla, bla, bla, a następnie wykonaj kod PHP, a następnie wykonaj div zakończenia. A teraz to mogę wydrukować mój miły div do góry, wszystko, PHP drukowanej div na dole. Katastrofalne, gdy coś takiego się dzieje, co jest dość powszechne, tylko NEWLINE rozproszenia na dole pliku. Nie sądzę, że to będzie wielka sprawa aż pod uwagę fakt, że w przeglądarkach - Jak przekierowuje pracy lub w zasadzie każda praca nagłówki podczas wykonywania połączenia do serwisu WWW i wysyła z powrotem te wszystkie nagłówki i miejscach jak odpowiedzi 200 lub odpowiedzi przekierowania lub cokolwiek, nagłówki są ważne tylko do pierwszego bajtu danych jest wysyłany. Możesz przekierować tysiące razy, ale jak tylko pierwszy bajt danych wysłany nie powinieneś przekierować ponownie. Jeśli masz bezpańskich nowej linii na końcu pliku i powiedzmy, że można korzystać z tej funkcji, a następnie chcesz - Powiedzmy, że jest to inny plik to index.php i require_once coś - Nie mogę myśleć o dobrym przykładem. Problem dzieje się, kiedy ta linia na dole zostanie wyświetlony. Nie chcesz nic zostały echem jeszcze. Nawet jeśli nie miał zamiaru na nic coraz echem, coś dostał echem i tak teraz nie powinniśmy się już więcej wysyłać nagłówki i masz zamiar się skarg. Po prostu nie potrzebuję tych tagów zamykających. Jeśli planujesz zrobić coś z HTML - i jest to całkowicie uzasadnione i tutaj div cokolwiek , a następnie w tym miejscu można lub nie można włączyć je. To naprawdę nie ma znaczenia. Ale w skryptach PHP to rzadko, aby je zamknąć. Kiedy wszystko jest PHP, absolutnie wszystko, naprawdę nie trzeba go zamknąć / nie należy go zamknąć. Radzenie sobie ze strun jest o wiele ładniejszy niż w C. W PHP można określić ciąg pojedyncze lub podwójne cudzysłowy. Z apostrofami nie można używać "Escape" sekwencje. Ciągle uciekać, bla, bla, bla. Więc printf jest bardzo rzadkie w PHP. Chyba byłoby użyć printf gdybym chciał zrobić coś takiego - w Pset 5 użyłeś sprintf lub cokolwiek. Ale chcesz zrobić 001.jpg i 002.jpg. Więc dla tego rodzaju rzeczy, gdzie rzeczywiście chcesz sformatować tekst chciałbym użyć printf. Ale w przeciwnym razie po prostu użyć konkatenacji. Tak naprawdę nigdy nie używać printf. My tylko różnicowania szczegóły między apostrofami i cudzysłowy. Największą różnicą jest to, że pojedyncze cytaty, zostanie on wydrukowany dosłownie. Nie ma char typ danych w PHP, w przeciwieństwie do C, więc jest to równoznaczne z tym. Są oba ciągi. I miłą rzeczą pojedynczych strun cytat mógłbym powiedzieć 'Hello World! " bla, bla, bla, $ $ Woo. Co dzieje się podczas drukowania to wypisze to dosłownie. Pozbądźmy się wszystkich naszych rzeczy. Więc echo $ str1; Dosłownie wydrukowane wszystkie z tych rzeczy: znaki dolara, backslash n, które uważasz, że byłoby newlines - wszystkie z tych rzeczy wypisuje dosłownie. Jedyne co musisz uciec to pojedyncze cytaty bo inaczej to myślę, że to zamknięcie apostrofów. Cudzysłów, zupełnie inna. Już teraz widać, że podświetlanie składni jest cluing nas do tego, co o to, aby iść strasznie źle. php.unique. Undefined variable: woo, ponieważ ta jest interpretowana jako zmienna o nazwie woo. Podwójne cudzysłowy pozwala wstawić zmienne do - Powiedzmy $ name = "Rob"; Więc echo "Cześć, mam na imię $ name!"; Uznaje to jako zmienną. Kiedy uruchomić, że - i wstawić znak nowej linii - Witam, nazywam się Rob! i hello world! To dlatego, że nigdy nie usuwa drukowanie woo powyżej. Jest 1 kolejny krok można zrobić. Tablica $ = [1, 2, 3]; Co zrobić, aby wydrukować pierwszą indeks tablicy? Robisz $ tablica [0]. Podświetlanie składni jest wskazówka. Co to ma zrobić? php.unique. Cześć, nazywam się 1! co nie jest to, co chciałem. Podświetlanie składni mnie okłamał. Spróbujmy 'a' -> 1, 'b' -> 2. To w jaki sposób mam to napisać. Unexpected pojedynczy cudzysłów (T_ENCAPSED bla, bla, bla, bla, bla). Chodzi o to, że nie jest uznając to jako część tablicy. To nie uznając tego jako tablicy indeksowanej pismem a. Chcesz zrobić w nawiasach klamrowych, i teraz wszystko, co jest w tej nawiasem klamrowym będzie interpolowana, który jest słowo, którego używamy do magicznie wstawienie tych zmiennych w odpowiednich miejscach. Teraz robi to, php.unique i Hi, my name is 1! zgodnie z oczekiwaniami lub Hi, my name is Rob! Jedno, co miłe o apostrofach, że - Jest jakiś koszt interpolację. Jeśli użyć cudzysłowów, tłumacz musi przejść przez ten ciąg, upewniając się, że: "O, tu jest zmienna. Teraz muszę iść po tej zmiennej i wstawić go tutaj." Nawet, jeśli nie używać żadnych zmiennych, nic wewnątrz tych cudzysłowach należy interpolowana, ale to nadal będzie wolniej, ponieważ musi przejść przez podwójne cudzysłowy szukam rzeczy, które muszą być interpolowane. Więc pojedyncze cudzysłowy mogą być nieco szybciej, jeśli nic nie jest interpolowana, i staram się nawet użyć apostrofów dla "Cześć, mam na imię". $ Array ['a'] tak. Że będzie to odpowiednik tego, co mieliśmy wcześniej. Ale jest to kwestia preferencji. Jeśli używasz PHP, prawdopodobnie nie dbam o prędkości różnicy. Nie wystarczy, aby rozumować je na początku. Jakieś ostatnie pytania? Tak naprawdę nawet nie dostać przez to wszystko, ale to rzeczy było nudne. Ostatnią rzeczą jest to miłe w PHP jest, kiedy mamy do czynienia z HTML, będziesz używać go trochę, więc ładny składnię skrótów drukowania zmienną. Pominięciem PHP tutaj, jest to tzw krótkie znaczniki. Oficjalnie w PHP 5.4, jest to przestarzałe. Zaleca się umieścić php. To nadal jest obsługiwany, tak krótkich znaczników z