[Powered by Google Translate] [第8條 - 更舒適] [羅布·鮑登 - 哈佛大學] [這是CS50。 - CS50.TV] 這週部分票據將是很短的, 所以我只是要保持對話,你們要不斷地問問題, 我們會嘗試盡可能填補盡可能多的時間。 很多人認為,這pset的不一定是困難的,但它是很長的。 在pset規範本身需要一個小時來閱讀。 我們給你一個你可能需要使用大量的SQL。 我們走你通過它的很多,所以它不應該是太糟糕了。 有沒有人開始或完成了嗎? 這是最後的pset。哦,我的上帝。 通常有一個JavaScript在此之後,但日曆改變的事情 一切較短的1週,我們不再有一個JavaScript的pset。 我不知道它們是如何影響的JavaScript是否會出現在考試中 測驗1。 我想它會像你需要知道的關於JavaScript的高層次的東西, 但我懷疑我們剛剛給你直接的JavaScript代碼 因為你還沒有在它的pset。 但是,這將是下週測驗複習的東西。 節的問題。 很多這個東西是有點差劣,但我們將討論為什麼。 不像C,PHP是一個“動態類型”的語言。這是什麼意思,你問? 好了,說再見了所有這些字符,浮點數,整數,和其他的關鍵字,你需要使用 聲明變量和函數在C 在PHP中,變量的類型決定,它目前持有的價值。 所以,我們輸入這個代碼進入一個名為dynamic.php, PHP是動態類型。這是真的。 我不同意的事實,這意味著我們說再見字符,浮點型,整型, 等關鍵詞。 動態類型和替代的確切區別, 這是靜態類型的,是動態類型,所有的類型檢查和東西 發生在運行時,而靜態類型,它發生在編譯時。 靜態的,一般這個詞的意思似乎是編譯時的事情。 我想有它的其他用途,但在C當你聲明一個靜態變量, 它的存儲分配在編譯的時候。 在這裡,只是意味著動態類型的 - 在C語言中,如果你嘗試添加一個字符串和一個整數,在編譯時, 它會抱怨,因為它會說,你可以不加一個int和指針。 這是不是一個有效的操作。 那是另一回事,我們將在第二。 但是,這一類的檢查,事實上,它會在編譯時, 是靜態類型檢查。 有語言時,您並不需要說字符型,浮點型,整型,所有這些東西, 但語言從上下文的東西可以告訴它應該是什麼類型, 但它仍然是靜態類型的。 所以,如果你把51,OCaml的,你永遠不需要使用任何類型, 但它仍然會在編譯的時候說,你不能這樣做,因為你將一個int和一個字符串。 動態類型的,只是意味著在運行期間的某個時候,你會得到一個投訴。 如果您還使用了Java之前,一般情況下,幾乎所有的C-型語言 將被靜態類型,因此C,C + +,Java中,所有這些都是靜態類型的。 在Java中,當你編譯的東西,你在說什麼 字符串s等於新的東西,是不是一個字符串, 的抱怨,因為這些類型的不匹配。 這是在編譯的時候會抱怨。 但它也有一定的動態之類的東西,如果你投的東西 的類型,更重要的是其目前的具體類型, 沒有什麼可以在編譯時檢查是否該投是會成功的。 Java也有一些動態類型檢查,盡快,因為它得到該行的代碼 它實際上執行時,它會做演員, 檢查是有效的,如果強制擺在首位, ,如果不是,那麼它會抱怨,你有一個無效的類型。 動態類型檢查。 輸入到一個稱為dynamic.php的文件。 Dynamic.php。 我會解壓縮的格式。 我們有一個變量,我們將它設置為整數7, 然後,我們將打印和%s - 哦,我們要打印的類型,這樣的getType返回類型的變量。 我們只是印刷的類型,一遍又一遍。 我們只是php.dynamic.php。 我們將看到,它的變化從整數到字符串,布爾,我們去通過。 在C語言中沒有布爾數據類型,有沒有字符串數據類型。 char *和布爾往往是int或char或東西。 在PHP中,這些類型的存在,這是一個大的優勢,PHP比C - 在PHP字符串操作是無限更容易比他們只是工作。 因此,我們回來這裡。 我們跑了dynamic.php。 這告訴PHP解釋器,名為php,在dynamic.php運行PHP代碼。 如果您有任何文件中的錯誤,解釋器會告訴你的! 解釋器,這是一個很大的區別PHP和C 在C語言中,你必須編譯的東西,然後你運行編譯後的文件。 在PHP中,你永遠不會編譯任何東西。 因此,PHP解釋器基本上只是讀這條線的線。 它擊中變種= 7,然後它擊中printf的然後它擊中變種然後它擊中printf和等。 有位編譯它,和它緩存的結果 所以,如果你運行該腳本後,你可以做一些, 但基本上是一條線,線之類的事情。 這意味著,大量的優化,我們在C, 類似編譯,它只是一般的編譯器可以為你做了很多的技巧。 它可以使用的變量,它可以做所有這些事情, 它可以做尾遞歸。 在PHP中,你是不會得到這種優勢 因為它只是要開始執行的一行行, ,它並沒有真正認識到這些東西一樣容易 因為它不是大編譯通過的東西,然後執行; 它只是一行行。 這樣的解釋。 回到我們的動態類型:很酷,不是嗎? 你絕對不能做,在C! 現在,看看你能不能找出下列值中的每一個類型的。 見,以供參考。 因此,3.50元。你認為將是什麼類型? 下面是我們的類型。 我們有bool值,整數,浮點數,字符串,數組,對象, 和資源,這是一種模糊的。 我認為這實際上是一個例子。 再有就是NULL。 NULL是一個特殊的類型。 不像C,其中NULL只是一個指針的地址為0, 在PHP中,NULL是它自己的類型,該類型的唯一有效的東西是NULL。 這是更為有用的錯誤檢查。 在C語言中,我們有這個問題,如果你返回NULL, 這是否意味著你返回一個NULL指針或NULL表示錯誤 所有的混亂,我們在一個點上。 這裡,返回NULL意味著錯誤。 很多事情的錯誤也返回false。 但有一點是NULL類型,唯一的NULL類型是NULL。 然後的回調是像你可以定義一些匿名函數。 你沒有給函數的名稱,但你不會在這裡處理。 尋找的類型,他們希望我們知道, 你認為3.50的類型是什麼? >> [學生]持股量。 是啊。 那麼,在這裡,有什麼你認為的類型是什麼? >> [學生]數組。 是啊。第一個是浮動的,第二個是一個數組。 請注意,這個數組是不是像一個C數組 你有索引0有一定的價值,指數有一定的價值。 這裡的指數分別為a,b,和c的值是1,2,和3。 在PHP中是一個關聯數組沒有什麼區別,只是一個普通的陣列 ,你會覺得它在C. 僅僅是這一點,引擎蓋下的一個普通的數組僅僅是一個關聯數組 0映射到一定的價值以同樣的方式映射到一定的價值。 出於這個原因,PHP是非常糟糕的代碼/基準的東西真快 因為在C:當你使用一個數組,你知道訪問的成員是固定的時間。 在PHP訪問的成員是誰知道多少時間? 這也可能是常量,如果它的哈希值正確。 誰知道什麼是真正做引擎蓋下的嗎? 你真的需要看看執行,看看它是如何去處理。 那麼FOPEN。 我想在這裡讓我們看的返回類型是PHP手冊FOPEN。 我們看到,在這裡你可以看一下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-R的,那麼我們就可以扔在這裡的命令: “打印('1'+ 2);”我會拋出一個新的生產線。 該印刷3。 它看起來就像是打印,它是整數3。 所以,現在讓我們嘗試其他方式: “打印(1 + '2'); 我們得到了3個,並且它也將是整數3?老實說,我不知道。 這看起來是一致的。 從來就沒有什麼機會,它是字符串的12或類似的東西, 因為PHP不同,JavaScript和Java太, 有單獨操作串聯的。 PHP級聯點。 所以,印刷業(1 '2');是要給我們12。 這往往會導致混亂,人們嘗試做這樣的事情STR + = 一些其他的事情,他們希望添加到它們的字符串的結束,而這要失敗的。 你需要做的STR。 所以,不要忘了串聯PHP點。 嘗試其他的事情:打印(“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中,你不能因為它會自動把它轉化成一個​​Float。 (7 +真),你認為這將是嗎? 我猜,如果它要解釋真正為1。 它看起來像它的8。 因此,在過去的10分鐘,你絕對不會做任何事情,我們已經做了。 你會看到,這樣做的代碼。 它不具有的那樣簡單,因為這。 你可以有2個變量,1個變量恰好是一個字符串 和其他變量發生是一個int,然後再添加這些變量。 由於PHP是動態類型的,它不會做任何類型檢查 並且由於它是弱類型的,因為它會自動把這些東西一起 一切都只是工作,這是困難的,甚至知道,此變量必須是一個字符串, 所以我不應該將它添加到這個變量,它是一個整數。 最好的做法是,如果一個變量是一個字符串,永遠保持它作為一個字符串。 如果一個變量是一個int,將它作為一個int,直到永遠。 如果你要處理整數和字符串, ,您可以使用varsint的 - 這是JavaScript的。 INTVAL。我做這一切的時候。 PHP和JavaScript,我混合了一切。 因此,INTVAL是要返回的整數變量的值。 如果我們通過在“打印(INTVAL('123')); 123。 INTVAL本身不會對我們來說,它是專門為整數做檢查。 PHP手冊,有這麼多的功能, 所以在這裡,我想我會用is_numeric第一。 我猜,返回false。 這是另一回事,我們去了是===。 is_numeric('123df),你不會想到,作為is_numeric。 在C中,你就必須遍歷所有字符 和檢查,如果每一個字符是數字或什麼的。 這裡is_numeric對我們來說要做到這一點, 它的返回false。 所以,當我打印的,打印什麼都沒有,所以我在這裡比較看, 你這樣是假的嗎?所以現在的印刷1。 顯然,它打印1為真,而不是打印真正為真。 我不知道如果我這樣做的print_r。不,它依然是1。 讓我們回到=== ==仍然存在, 如果你跟湯米,他會說==是完全沒有問題的。 我會說,==是可怕的,你不應該使用==。 不同的是,==比較的東西 它可以是真實的,即使他們是不一樣的類型, 而===比較的東西,首先檢查它們是同一類型的嗎? 是。好了,現在我要看看他們實際的比較是相等的。 你得到奇怪的事情,比如10等於 - 讓我們來看看,說什麼。 因此,('10'== '1 E1'); 這則返回true。 沒有任何人有任何猜測為什麼返回true? 它不僅僅是關於該。也許,這是一個提示。 但如果我改變的f - 實在可恨!我一直在使用雙引號。 雙引號罵我的原因是因為我已經把這個雙引號括起來。 所以,我可以在這裡逃脫的雙引號,但單引號更容易。 因此,('10'== '1 F1');打印不正確的。 ('10'== '1 E1');打印出真實的。 [學生]是十六進制? >>這是不是十六進制,但它很接近,它就像 - 1E1,科學記數法。 承認1E1為1 * 10 ^ 1或什麼的。 這些都是平等的整數。 如果我們這樣做===那麼它會是假的。 如果我們這樣做,其實我不知道==什麼(10和'10abc“);好的。所以,這是事實。 所以就像當你做(10 + '10abc),這將是20, 在這裡(10 == '10abc)的,是真實的。 更糟糕的是類的東西(假== NULL);是真實的 或(假== 0);是真實的,(假== []); 有奇怪的箱子 - 這些奇怪的情況下,這是一個。 請注意,(假== []);是真實的。 (0 == FALSE);是真實的。 (0 == []);是假的。 所以==是沒有辦法傳遞的。 一個可以是等於b,a可以是等於c, 但B可能不等於c。 這是我所憎惡的,你應該總是使用===。 [學生]:我們可以做的!==呢? >> [鮑登]是的。 相當於將=和!==。 這實際上是在pset規範 那裡有很多的函數的返回值 - PHP手冊是良好的。 它把一個紅色的大盒子,“這將返回false,如果有一個錯誤。” 但返回,返回0是一個完全合理的事情。 想想任何函數返回一個整數。 比方說,此功能在一個文件或東西應該算的行數。 在正常情況下,這個函數傳遞一個文件 和它的要返回的整數表示的行數。 所以0是一個非常合理的數字,如果該文件是空的。 但是,如果你把它傳遞一個無效的文件和功能發生了返回false 如果你傳遞一個無效的文件嗎? 如果你只是做==你不區分無效的文件和空文件的情況下。 始終使用===。 這是所有這一切。 在PHP中,你已經習慣了在C數組類型是不同的 事實上,你可能已經注意到了這一點,當你看到這是數組類型。 括號的語法是新的,這是最新版本的PHP PHP 5.4。 在此之前,你總是寫陣列('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],$數組[1],[2],陣列的方括號,如指數 指數相同的方式,如果你碰巧有你的指數是字符串。 所以數組[''],數組['B']。 $陣列[B]。為什麼這是錯的? 它可能會產生一個警告,但仍能正常工作。 PHP容易做到這一點。 它往往只是,“我要警告你,但我只是要繼續 “,並盡我所能。” 它可能會轉化為一個字符串, 但它是可能的,在一些點在過去有人所述 定義b為'HELLO WORLD“。 所以,現在b可以是一個常數,數組[B]其實做'HELLO WORLD“。 我認為在這一點上,或者至少是我們的PHP設置, 如果您嘗試對數組的索引鍵不存在,它將會失敗。 我不認為它只是提醒你。 或者至少你可以設置它,以便它不只是提醒你,它只是直失敗。 你檢查,看看如果確實是這樣的索引方式是使用isset。 因此,使用isset($數組['HELLO WORLD'])將返回false。 使用isset($陣列['B'])將返回true。 您可以將這些語法。 我敢肯定,這個陣列會結束 - 我們可以對其進行測試。 哦,我需要PHPWord的。 這是混合您指定的語法,其中的關鍵是什麼 你不指定的關鍵是什麼。 因此,3這裡是一個值。 你還沒有明確表示其關鍵是要的。 你認為它的關鍵將是什麼? [學生] 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鍵,11鍵,4鍵d。 甚至讓我們做 - 我想我沒有把一個0,但它的打印1,2,3,4。 如果我轉嗎?還是讓我們切換這2個。 現在它打印2,1,3,4。 PHP的數組是不是就像你經常哈希表。 這是完全合理的,認為他們是哈希表99%的時間。 但在哈希表是沒有意義的事情的順序插入。 因此,只要將它插入你的哈希表, 假設有沒有鍊錶,你可以判斷一個鍊錶內 這是第一次插入。 但在這裡我們插入2第一,它知道什麼時候它打印出該數組是第一位的。 它不把它打印出來,在短短任何順序。 技術數據結構,它的使用是一個有序的地圖, 所以鍵映射到相應的值,它會記住這些鍵的順序插入。 基本上,它的一些並發症,它是討厭的實際 - 比方說,你有一個陣列0,1,2,3,4,5 你要拿出指數2。 這樣做的一個方式,讓我們來看看是什麼樣子。 0,2,1,3,4。 未設置發生未設置變量和數組的索引。 所以,用unset($陣列[2]); 現在這是什麼的樣子?二是剛剛過去,所以這是完全正常的。 更可氣的是,如果你想要的東西,其實是像一個數組。 我會把隨機數。 現在發現我的指標。 我希望它只是像一個C數組是從0到length - 1 我可以遍歷它是這樣的。 但取消設置的第二個索引,什麼是指數3,只要我現在不成為指數2。 相反,它只是刪除該索引,而現在你去0,1,3,4。 這是完全合理的。 這只是惱人的,你所要做的事情,比如陣列拼接。是啊。 [學生]會發生什麼,如果你有一個for循環 你想要去的所有元素? 2,當它擊中了它會產生永遠不會消失? 遍歷數組。有2種方式,你可以做到這一點。 您可以使用常規的for循環。 這又是一個複雜的PHP。 大多數語言中,我會說,有某種長度,len或東西 指示的長度的一個數組。 在PHP中,它的計數。 所以count($),$ i + +) 讓我們只需打印($ [$一]); 注意:未定義抵消:2。 這只是要失敗的。 這是原因是,在大多數情況下,你永遠需要遍歷一個這樣的數組。 這可能是一個有點誇張,但你永遠需要遍歷一個這樣的數組 因為PHP提供的foreach語法中的foreach($美元的項目)。 現在,如果我們打印(項目) - 將就此進行討論它在一秒鐘 - 工作完全正常。 foreach是工作的方式,是第一個參數是你遍歷數組。 第二個參數,項目,通過for循環的每個通 它要採取的下一個數組中的事情。所以請記住陣列有一個訂單。 第一次通過for循環中,項目將是123 那麼這將是12,那麼這將是13,那麼這將是23,那麼這將是213。 事情變得很奇怪,當你做類似的foreach。 讓我們看看會發生什麼,因為你永遠不應該這樣做。 如果我們用unset($數組[1]); 這是可能的預期。 你遍歷這個數組,每一次你註銷的第一個索引。 因此,索引0,第一件事情,項目需要的價值為0,所以這將是123。 但裡面的循環中,我們未設置索引為1,這樣就意味著12已經一去不復返了。 因此,打印。 PHP_EOL。 PHP_EOL是剛換行的,但它在技術上更便攜 因為換行符在Windows在Mac和UNIX的換行符是不同的。 在Windows換行符\ r \ n,而在其他地方往往只是\ n。 PHP_EOL配置,使其使用任何你的系統是換行。 打印。讓我們在最後的print_r($陣列)。 我不知道,這將是的行為。 物品仍然需要,即使我們取消設置之前,我們得從數組中的值12。 不要把我的話,但它看起來像的foreach的數組創建一個副本 然後項後,該副本的所有值。 所以,即使你修改數組內的循環, 它不會在意的。項目將採取的原始值。 讓我們嘗試註銷。 如果這是數組[1] =“你好”; 儘管我們將“Hello”到數組裡,項目從來沒有考慮該值。 還有另一種語法foreach循環 你把箭頭分離的2個變量。 該第一變量將是該值的鍵, 和這個第二可變將是相同的確切資料。 這是無趣的,但如果我們回到我們原來的情況下,'A' - > 1, 'b'的 - > 1, 在這裡,如果我們只是遍歷為每個數組作為項目,項目將是每一次。 但是,如果我們也想知道與該項目相關的關鍵 然後,我們做美元的關鍵 - >項目。 所以,現在我們可以做打印($關鍵。“:”。 現在,它的遍歷和打印每個鍵及其關聯的值。 我們可以在foreach循環是一個額外的東西,你可能會看到這個語法。 &符號變量名前往往是PHP如何做參考。 如果引用是非常類似的指針, 你沒有指針,所以你永遠不會直接處理內存。 但是,你有1變量指的是同樣的事情,另一個變量的引用。 內部,在這裡,讓我們做$項目。讓我們回到1,10。 讓我們做項目+ +中仍存在PHP。你仍然可以做+ +。 php.test.php。我要打印出來。的print_r($陣列); 我們打印2,11。 如果我剛剛做的foreach($ $項目)項目將值1 第一次通過循環。這將增加1到2,然後我們就大功告成了。 那麼它會通過第二次的循環,該項目是10個。 它增加項目至11日,然後這只是扔掉。 然後,我們的print_r($陣列),讓我們看看,這僅僅是1,10。 所以,我們所做的就是失去的增量。 但foreach($美元陣列為&$項) 現在,這個項目是相同的項目在這裡。這是同樣的事情。 所以項目+ +修改陣列0。 基本上,你也可以做$ K - > $項目,你可以做$陣列[K] + +; 因此,另一種方式這樣做,我們可以自由修改項目, 但不會修改我們的原始數組。 但是,如果我們使用k,這是我們的關鍵,那麼我們就可以到我們的數組索引使用該密鑰 和增量。 這更直接地改變我們原來的數組。 你甚至可以這樣做,如果由於某種原因,你想要修改的能力 - 其實,這是完全合理的。 你不想寫陣列[$ K] + +, 你只是想寫美元項目+ +,但是你仍然想要說的話($ K ==='A') 然後增加項目,然後打印我們的數組。 所以,我們現在該怎麼辦的print_r做?應印有什麼樣的價值觀? [學生] 2和10。 >> [鮑登]如果其中的關鍵是一個'我們實際打印。 你可能很少,如果有的話,將需要定義函數在PHP中, 但你可能會看到類似的東西,你定義了一個類似的功能任何功能。 通常,你會說($ foo的吧),然後確定它是什麼。 但如果我這樣做,那麼這意味著,無論要求什麼, 任何調用baz,將第一個參數傳遞給巴茲是可以改變的。 讓我們做$ foo的+ +; 內,在這裡讓我們做巴茲(項目); 現在,我們調用一個函數。 參考的參數,這意味著如果我們修改 我們要修改的東西傳入 打印此我們所期望的 - 除非我搞砸了語法 - 我們得到了2,11, 所以,它實際上是遞增的。 請注意,我們需要在兩個地方引用。 如果我這樣做呢?這是什麼意思呢? [學生]:這將改變。 >>呀。 項目僅僅是一個數組中的值的副本。 因此,項目將改變為2,但數組['A'將仍然是1。 或者,如果我這樣做,該怎麼辦呢? 現在項目被發送作為複製到巴茲。 因此,複製的說法將增加為2, 但項目本身從未增加了2。 產品陣列支架任何同樣的事情, 因此,陣列沒有增加。 因此,這兩個地方都需要它。 PHP通常是非常聰明的。 你可能會認為我想通過引用傳遞 - 這實際上是一個pset時的問題。 這是一個questions.txt的事情,它說, 你為什麼想通過這個結構的參考? 這個問題的答案是什麼呢? [學生]所以你不必複製的東西大。 >>呀。 一個結構可以任意大,而當你作為一個參數傳遞結構 它需要複製整個結構,把它傳遞給功能, 而如果你只是傳遞結構參考 那麼它只是需要複製一個4字節的地址作為參數傳遞給函數。 PHP是一個有點聰明得多。 如果我有一些功能,我傳遞給它的數組1,000件事情, 這是否意味著它要複製的那些事1000 把它傳遞到函數嗎?它沒有馬上做到這一點。 如果裡面的這個功能,它從來沒有真正修改foo的, 因此,如果($ foo的==='你好')返回true。 請注意,我們從來沒有真正被修改了這個函數的參數內的, 這意味著,無論是通過為foo從來沒有需要複製 是因為它沒有修改它。 因此,PHP的工作原理是參數總是通過引用傳遞 直到你真正嘗試對其進行修改。 現在,如果我說的$ foo的+ +;現在,原來的foo的一個副本,修改副本。 這可以節省一些時間。 如果你從來沒有接觸這個龐大的陣列,你從來沒有真正進行修改, 它並不需要,使複印件, 而如果我們只是把這個符號,這意味著它甚至不把它複製 即使你修改它。 這種行為被稱為寫時拷貝。 你會看到它在其他地方,特別是如果你需要一個操作系統課程。 寫時複製是一個非常平常的模式,你並不需要的東西進行複製 除非它實際上是不斷​​變化的。是啊。 [學生]如果你有增量內部測試, 所以只出了1000元將需要改變? 我不太肯定。 我認為這將複製整個事情,但它可能是足夠聰明, - 其實,我的想法是想像,我們有一個看起來像這樣的數組:數組= [ 然後索引'a'是一個數組中的[1 2 3 4],和索引'b'的,無論是一個數組。 我需要所有這些逗號之間。試想一下,有逗號。 然後'C'的值是3。 好吧。 現在,讓我們說,我們做巴茲(數組); 巴茲不以供參考。 所以,$ foo的['C'] + +; 這是一個例子,我們通過數組作為參數 然後它被修改特定的數組索引通過遞增。 老實說,我不知道PHP是要幹什麼。 它可以很容易地使整個事情的副本,但如果它的智能, 這將有其獨特的價值,它會複製這些鍵 但仍然可以指向同一個數組1,2,3,4 這仍然可以指向同一個數組。 我的iPad。 我們通過這個數組中,這傢伙點,這傢伙點[1,2,3,4], 這傢伙[34] 現在我們已經將它傳遞到巴茲,我們正在修改。 如果PHP是智能的,它可以這樣做 - 我們仍然有一些內存複製,但如果有這些巨大的嵌套子陣 我們並不需要複製這些。 我不知道這是什麼,但我可以想像它這樣做。 這也是一個相當大的優勢的C PHP。 PHP使生活變得更輕鬆了很多東西, ,但你絕對不知道它會執行 因為我不知道這些副本的東西時,它的引擎蓋下的, 哦,那將會是一個固定的時間複製, 它只是要改變1個指針,它會是一個可笑的困難線性副本嗎? 什麼,如果它不能找到空間? 是否需要執行垃圾收集得到一些更多的空間? 垃圾收集可以任意長。 在C語言中,你不必擔心這些事情。 你給你寫的每一行相當多的原因,它是如何去執行。 讓我們回頭看看這些。 有意思的是,你不必處理散列函數, 鏈接列表,或類似的東西嗎? 由於工作與哈希表是很容易的,現在,這裡是一個有趣的益智工作。 打開一個文件名為unique.php,在寫一個PHP程序 (也被稱為“腳本”)。 我們往往稱他們為腳本,如果他們短的東西,你在命令行中運行。 基本上,你沒有任何語言,編譯,但你要運行的可執行文件 在命令行中,你可以調用可執行腳本。 我也完全可以寫一個C程序,這樣做, 但我不把它的腳本,因為我第一次編譯,然後運行二進制文件。 但這個PHP程序中,我們要調用腳本。 或者,如果我們寫的Python或Perl或Node.js的任何事情, 我們會打電話給他們,因為你所有的腳本運行在命令行 但我們不編譯它們。 我們能做到這一點很快得到解決。 我們不打算使用argv。讓我們通過這個打擊。 說它獨特,寫一個程序。 你可以假設,輸入將包含每行一個單詞。 其實,ARGV將變得非常簡單使用。 unique.php。 第一件事,第一,我們要檢查,如果我們已經通過命令行參數。 正如你所期望的argc和argv在C,我們還有那些在PHP。 因此,如果($ ARGC!== 2),那麼我將不會處理與打印一條消息或任何。 我就退出,錯誤代碼1。 我還可以返回1。 在PHP中,你很少在這種狀態下,我們在哪裡 - 通常你在一個函數中調用一個函數調用的函數調用的函數。 而且,如果出現錯誤,你只是想完全退出一切, 退出剛剛結束的程序。 這也存在C中 如果你在一個函數中的函數,在函數中的函數 你只想殺程序,你可以調用exit,它只會退出。 但在PHP中更是罕見,我們在這個頂層。 通常我們內部的某種功能,所以我們調用exit 所以,我們不必返回了1件事,然後實現有一個錯誤 因此,返回,如果承認有錯誤。 我們不想去面對這一切,所以退出(1); 返回(1),在這種情況下將是等同的。 那麼我們要打開我們想要的FOPEN。 參數看起來很相似。 我們要FOPEN($ ARGV [1],我們想打開它的閱讀。 返回一個資源,我們要調用f。 這看起來非常相似,如何做,但我們並沒有說FILE *。 相反,我們只是說$ F。好吧。 其實,我覺得這甚至給我們一個提示,以PHP函數調用的文件。 PHP文件。 這是什麼做的是讀取整個文件到一個數組中。 你甚至都不需要FOPEN它。它會為你做的。 因此,$線=文件($ ARGV [1]); 現在,所有的文件的行的行中。現在,我們要排序的行。 我們如何可以排序的行嗎? 我們的行進行排序。 現在,我們可以打印出來或者什麼的。 也許最簡單的方法是的foreach($迴聲$線線線); [學生]不,我們甚至交叉線通過引用到排序的東西嗎? 這是那種會被定義為函數sort($陣列)。 當你調用這個函數,你不把它傳遞以供參考。 這是的功能定義它,把它作為參考。 其實,這是到底出了什麼錯 當我們把所有的東西到我們的服務器,我們去的時候,從5.3到5.4。 直到5.4,這是完全合理的。 功能不希望把它作為參考,但你可以把它作為參考 因此,如果不發生修改它,它仍然有修改的。 5.4,你不應該這樣做。 所以現在唯一的辦法是,如果你通過引用傳遞明確它的功能。 如果你不想要它,修改它,然後你需要做的$ = $線,並通過複製複製。 所以,現在線將被保留,副本將被改變。 php.unique.php。我可能會弄亂的東西了。 意外的'排序'。 有要的東西,這對我們來說。 它甚至不存在。 請注意,當您閱讀本手冊的第一個參數是一個數組 和它的所採取的參考。 這是為什麼向我抱怨嗎?因為我有這樣的功能,的排序仍然在這裡,我不想。 好了,php.unique.php。我沒有傳遞給它一個說法,因為我沒有一個文件。 這是對test.php的php.unique.php。 這裡是一個很好的排序順序打印出來的test.php的。 請注意,排序是一種奇怪的代碼文件 因為我們所有的空行是要來首次 然後要來我們所有的1​​級縮進 然後來我們沒有凹陷。 是啊。 >>的源代碼[學生]因此,它不是通過引用傳遞? 一般是按值傳遞? 波頓當你調用一個函數,它從來沒有確定它是否是通過引用傳遞。 這是確定它是否是通過引用傳遞函數的定義。 在函數定義的排序,或者只是在看, 它需要的參數,以供參考。 所以,不管你是否希望它把它的參考,它以供參考。 它會修改數組中的地方。 這僅僅是不允許的。你沒有做到這一點。 >> [學生]:哦,好吧。 鮑登]這一點,是要採取排序的參考和修改。 再者,如果你不希望它這樣做,你可以製作一個副本的排序。 即使在這種情況下,複製是不實際的行的副本。 它只是指出了同樣的事情,直到它第一次被修改, 它第一次被修改的排序功能, 的地方,因為它的副本上寫的,現在要進行複製的副本。 您也可以做到這一點。這是在其他地方,你可以看到符號。 你看,它在foreach循環中,你會看到它在函數聲明中, 你看到它的時候才分配變量。 現在,我們已經這樣做一事無成 因為複製和線的字面意思是同樣的事情。 您可以使用和複製交替。 你可以做未設置(副本);不未設置線, 你只是失去了同樣的事情。 所以,這一點,現在線是唯一的方法,你可以訪問行。 有問題嗎? 是啊。 [學生]完全偏離主題,但您不必關閉PHP - >>你沒有。 好吧。 鮑登我會去盡量說這是不好的做法,將其關閉。 這可能是誇張,尤其是在腳本中, 但讓​​我們看看會發生什麼,如果我這樣做。 這什麼都沒做。如果我想 - [嘆氣] 我需要傳遞的參數。 拍攝。我把它叫做錯誤。 參數所以php.unique.php。 現在,我什至都不需要這個。 我會通過一個有效的參數。 這無論是印刷打印。 我在印刷複製和拷貝不存在。所以線。 它打印的每一件事,然後發現這一切垃圾到這裡, 因為在PHP什麼是PHP標籤之外 只是要打印的字面。 這就是為什麼HTML,它是如此的好,我可以做格嗒嗒,嗒嗒,嗒嗒類或其他, 等等,等等,等等,然後做一些PHP代碼,然後做終端的分區。 而現在印刷這個,我得到我漂亮的分區往上頂,一切PHP印刷,DIV底部。 這樣的事情發生災害時,這是很常見的, 只是一個流浪在底部的文件換行符。 你可能不會想到這將是大不了的 直到你考慮的事實是,與瀏覽器 - 如何重定向工作或基本任何頭的工作, 當你讓你連接到一個網站,它發回所有這些報頭和活動 像200或響應重定向或任何響應 頭是唯一有效的,直到第一個字節的數據被發送。 您可以重定向幾千倍,但只要作為第一個字節的數據被發送 你不應該再次重定向。 如果你有一個流浪在底部的文件換行符 比方說,您使用此功能,那麼你要 - 比方說,這是另一種的index.php文件,你require_once的東西 - 我不認為它的一個很好的例子。 問題發生時,這條線在底部得到呼應。 你什麼也不想。 即使你不打算在任何問題上得到呼應,東西都迴盪 所以現在你不應該發送任何更多的頭文件 你會得到投訴。 你只是不需要那些關閉的標籤。 如果你打算做一些與HTML - ,這是完全合理的,在這裡做下來格 ,然後在這一點上,你或你可以不包括他們。 這其實並不重要。 但是在PHP腳本中,很少將其關閉。 當一切PHP,絕對好用, 你並不真的需要關閉它/你不應該關閉它。 處理字符串的好得多,比C. 在PHP中,你可以指定一個字符串用單引號或雙引號括起來。 用單引號,您不能使用“escape”序列。 不斷逃跑,等等,等等,等等。 因此我們知道printf在PHP中是非常罕見的。 我想我會使用printf,如果我想要做的事情 - 在pset中5,你用sprintf或者任何一種。 不過,你想要做001.JPG 002.JPG。 因此,對於諸如此類的事情,其實我想我會用printf來格式化文本。 但是,除此之外,我只想用字符串連接操作。 我從來沒有真正使用printf。 我們只是區分單引號和雙引號之間的細節。 最大的區別在於,單引號,它會被打印字面上。 沒有char數據類型在PHP,C不一樣,所以這是相當於。 他們兩個字符串。 有關單引號字符串是很好的事情,我可以說'你好,世界!“等等,等等,等等, $ $ WOOO。 會發生什麼事,當我打印,這是它會打印出它的字面。 讓我們擺脫我們的東西。 所以迴聲$ str1的; 它的字面打印所有這些事情:美元符號, 反斜杠n,您會覺得這是換行符 - 所有這些東西打印字面上。 你唯一需要轉義單引號 因為否則會認為這是結束的單引號。 雙引號,完全不同的。 我們已經看到的語法高亮cluing我們去可怕的錯誤。 php.unique。未定義的變量:WOOO,因為這被解釋為變量的Wooo。 雙引號,讓你插入變量 - 比方說,$名稱=“搶”; 所以迴聲“嗨,我的名字是名字!”; 認識到這一點作為一個變量。 當我運行的 - 我將插入一個新行 - 嗨,我的名字是Rob!和世界你好! 這是因為我從來沒有刪除上面印刷的Wooo。 有進一步的步驟,你可以做的。 $陣列= [1,2,3]; 如果我要打印第一個索引的數組? 您做$數組[0]。 語法突出顯示是一個線索。這是什麼怎麼辦呢? php.unique。 嗨,我的名字是!這不是我想要的。 語法高亮對我撒了謊。 讓我們嘗試“ - > 1,'B' - > 2。 這是我會怎麼寫。 意外的單引號(T_ENCAPSED廢話,廢話,廢話,廢話,廢話)。 我們的想法是,它沒有認識到這一點作為陣列的一部分。 它沒有認識到這一點作為數組的索引字母a。 你想幹什麼,大括號, 現在無論是在這個大括號將插, 這是我們到正確的地方,神奇地將這些變量的使用的字。 現在這樣做,php.unique,嗨,我的名字是1!果然 “或”嗨,我的名字是Rob! 有一件事,是一種不錯的關於單引號是 - 這裡也有一些成本插值。 如果使用雙引號,解釋過這串, 肯定地說,“哦,這裡有一個變量,現在我需要去獲得這個變量,並將其插入。” 即使你不使用任何變量, 這些雙引號裡面什麼都沒有,需要進行插值, 但它仍然會比較慢,因為它需要在雙引號 尋找的東西,需要進行插值。 因此,單引號可以快一點,如果沒有什麼需要進行插值, 我傾向於甚至可以使用單引號,'嗨,我的名字是'。數組['A']了。 這是怎麼回事,我們以前是等價的。 但是,這是一個見仁見智的問題。 如果你使用PHP,你可能不關心速度的差異。 沒有足夠的理他們開始。 任何最後的問題嗎? 實際上,我們沒有,甚至通過所有的,但這個東西很無聊。 最後一件事,是一種不錯的PHP是當你要處理的HTML, 打印變量,你就可以使用它了一下,所以很好的快捷方式語法。 沒有讓PHP在這裡,這就是所謂的短標籤。 正式的PHP 5.4,這已經過時了。 建議您把PHP。 這仍然是支持的,這麼短的標籤<?還是完全沒有問題的。 它在默認情況下是支持的,所以您可以使用這些如你所願,和他們吃起來十分方便。 有什麼問題嗎? 好的。 保持優雅,聖地亞哥。 [笑] 再見。 [笑] [掌聲] [笑] [CS50.TV]