[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]