[Powered by Google Translate] [Phần 8 thoải mái hơn] [Rob Bowden - Đại học Harvard] [Đây là CS50. - CS50.TV] Những phần ghi chú tuần này sẽ là khá ngắn, vì vậy tôi chỉ cần đi để tiếp tục nói chuyện, các bạn sẽ tiếp tục đặt câu hỏi, và chúng tôi sẽ cố gắng để điền vào càng nhiều càng tốt. Rất nhiều người nghĩ rằng rằng pset này không nhất thiết phải là khó khăn, nhưng nó rất dài. Các spec pset chính nó có một giờ để đọc. Chúng tôi cung cấp cho bạn rất nhiều SQL bạn có thể có thể cần phải sử dụng. Chúng tôi hướng dẫn bạn qua rất nhiều của nó, vì vậy nó không phải là quá xấu. Có ai bắt đầu hoặc kết thúc? Đó là pset cuối cùng. Oh, Thiên Chúa của tôi. Thông thường có JavaScript sau này, nhưng mọi thứ thay đổi lịch làm cho mọi thứ ngắn hơn 1 tuần, và chúng tôi không còn có một pset JavaScript. Tôi không biết làm thế nào có ảnh hưởng đến JavaScript là sẽ xuất hiện vào kỳ thi hoặc quiz 1. Tôi tưởng tượng nó sẽ là một cái gì đó như bạn cần phải biết những điều cao cấp về JavaScript, nhưng tôi nghi ngờ chúng tôi chỉ muốn cung cấp cho bạn tiếp mã JavaScript kể từ khi bạn đã không có một pset trong đó. Nhưng đó là công cụ cho bài kiểm tra đánh giá vào tuần tới. Phần của câu hỏi. Rất nhiều các công cụ này là hơi kém worded, nhưng chúng tôi sẽ thảo luận về lý do tại sao. Không giống như C, PHP là một ngôn ngữ "năng động, đánh máy". Này có nghĩa gì, bạn yêu cầu? Vâng, nói lời tạm biệt với tất cả những float, char, int, và các từ khoá khác bạn cần phải sử dụng khi khai báo các biến và chức năng trong C. Trong PHP, một loại của biến được xác định bởi giá trị mà nó hiện đang nắm giữ. Vì vậy, trước khi chúng tôi gõ mã này vào một tập tin gọi là dynamic.php, PHP là tự động gõ. Đó là sự thật. Tôi không đồng ý với thực tế rằng điều đó có nghĩa là chúng tôi đang nói lời tạm biệt với char, float, int, và các từ khóa khác. Sự khác biệt chính xác giữa động gõ và thay thế, mà là tĩnh đánh máy, đó là tạo kiểu động, tất cả các kiểm tra kiểu và các công cụ của bạn xảy ra tại thời gian chạy, trong khi tĩnh đánh máy xảy ra tại thời gian biên dịch. Từ tĩnh nói chung dường như có nghĩa là những thứ thời gian biên dịch. Tôi đoán có sử dụng khác cho nó, nhưng trong C khi bạn khai báo một biến tĩnh, lưu trữ của nó được phân bổ tại thời gian biên dịch. Ở đây, động gõ chỉ có nghĩa là - Trong C nếu bạn cố gắng thêm một chuỗi và một số nguyên, khi bạn biên dịch nó, nó sẽ khiếu nại vì nó sẽ nói rằng bạn không thể thêm một int và một con trỏ. Nó chỉ không phải là một hoạt động hợp lệ. Đó là một điều mà chúng tôi sẽ nhận được trong một lần thứ hai. Nhưng đó là loại kiểm tra, thực tế là nó than phiền tại thời gian biên dịch, là kiểm tra kiểu tĩnh. Có những ngôn ngữ mà bạn không cần phải nói char, float, int, và tất cả những điều đó, nhưng ngôn ngữ có thể nói từ bối cảnh của điều gì loại đó là nghĩa vụ phải được, nhưng nó vẫn tĩnh đánh máy. Vì vậy, nếu bạn có 51, OCaml, bạn không bao giờ cần phải sử dụng bất kỳ các loại, nhưng nó vẫn sẽ tại thời gian biên dịch nói rằng bạn không thể làm điều này bởi vì bạn đang trộn một int và một chuỗi. Động gõ chỉ có nghĩa là đôi khi trong thời gian chạy, bạn sẽ nhận được đơn khiếu nại. Nếu bạn cũng đã được sử dụng Java trước, nói chung, hầu như bất kỳ ngôn ngữ C sẽ được tĩnh đánh máy, do đó, C, C + +, Java, tất cả những người thường được tĩnh đánh máy. Trong Java khi bạn biên dịch một cái gì đó và bạn đang nói string s bằng một cái gì đó mới mà không phải là một chuỗi, đó là sẽ phàn nàn vì những loại không phù hợp lên. Điều đó đang xảy ra khiếu nại tại thời gian biên dịch. Nhưng nó cũng có một thời gian năng động, những thứ như nếu bạn cố gắng để đúc một cái gì đó một loại cụ thể hơn so với loại hiện hành của nó, không có gì nó có thể làm tại thời gian biên dịch để kiểm tra cho dù đó là dàn diễn viên sẽ thành công. Java cũng có một số loại động kiểm tra rằng ngay sau khi nó được cho rằng dòng mã khi nó thực sự thực hiện, nó sẽ làm các diễn viên, kiểm tra xem nếu đó là dàn diễn viên là hợp lệ ở nơi đầu tiên, và nếu nó không được, sau đó nó sẽ phàn nàn rằng bạn có một loại không hợp lệ. Năng động, kiểm tra kiểu. Loại này thành một tập tin gọi là dynamic.php. Dynamic.php. Tôi sẽ giải nén định dạng. Chúng tôi có một biến, chúng tôi đặt nó vào các số nguyên 7, sau đó chúng ta sẽ in và% s - Ồ, chúng tôi đang in các loại của nó, do đó, GetType là sẽ trả về kiểu của biến. Chúng tôi chỉ in các loại hơn và hơn nữa. Chúng tôi chỉ php.dynamic.php. Chúng ta sẽ thấy nó thay đổi từ số nguyên để chuỗi Boolean như chúng tôi đi qua. Trong C không có kiểu dữ liệu Boolean, không có dữ liệu kiểu chuỗi. Có char * và Boolean chỉ có xu hướng được int hoặc char hoặc một cái gì đó. Trong PHP các loại tồn tại, và đó là một trong những lợi thế lớn của PHP trên C - chuỗi hoạt động là vô cùng dễ dàng hơn trong PHP hơn C. Họ chỉ làm việc. Vì vậy, chúng tôi quay lại đây. Chúng tôi chạy dynamic.php. Điều này nói với các thông dịch viên PHP, php, để chạy các mã PHP trong dynamic.php. Nếu bạn có bất kỳ lỗi nào trong tập tin, các thông dịch viên sẽ cho bạn biết! Phiên dịch, đây là một sự khác biệt lớn giữa PHP và C. Trong C, bạn phải biên dịch một cái gì đó và sau đó bạn chạy tập tin đó biên soạn. Trong PHP bạn không bao giờ biên dịch bất cứ điều gì. Vì vậy, các thông dịch viên PHP cơ bản chỉ đọc dòng này bằng dòng. Nó cập var = 7 sau đó nó cập printf sau đó nó cập var sau đó nó cập printf và vv. Có một chút biên dịch nó, và nó lưu trữ kết quả vì vậy nếu bạn chạy kịch bản sau đó bạn có thể làm một số người, nhưng về cơ bản nó là một đường bằng cách sắp xếp dòng điều. Điều đó có nghĩa là rất nhiều tối ưu hóa mà chúng tôi nhận được trong C, như biên dịch, nó chỉ nói chung trình biên dịch có thể làm rất nhiều thủ đoạn cho bạn. Nó có thể biến không sử dụng, nó có thể làm tất cả các loại của sự vật, nó có thể làm đệ quy đuôi. Trong PHP bạn sẽ không nhận được rằng lợi thế bởi vì nó sẽ chỉ bắt đầu thực hiện dòng từng dòng, và nó không thực sự nhận ra những điều này một cách dễ dàng vì nó không phải 1 pass biên soạn lớn hơn điều này và sau đó thực hiện; nó chỉ là từng dòng. Vì vậy, đó là các thông dịch viên. Sao gõ năng động của chúng tôi: đẹp, thoáng mát, eh? Bạn chắc chắn không thể làm điều đó trong C! Bây giờ, xem nếu bạn có thể hình dung ra kiểu của mỗi người trong số các giá trị sau. Xem này để tham khảo. Vì vậy, 3,50. Loại nào bạn nghĩ rằng đó sẽ là? Dưới đây là những loại mà chúng ta có. Chúng tôi có bools, số nguyên, điểm nổi, chuỗi, mảng, các đối tượng, và sau đó tài nguyên, mà là loại mơ hồ. Tôi nghĩ rằng có thực sự là một ví dụ ở đây. Sau đó có NULL. NULL là một loại hình đặc biệt. Không giống như C nơi NULL chỉ là một con trỏ với địa chỉ 0, trong PHP, NULL là kiểu riêng của nó điều chỉ có giá trị của loại hình đó là NULL. Điều này là rất hữu ích cho việc kiểm tra lỗi. Trong C, nơi chúng tôi có vấn đề này mà nếu bạn trở về NULL, không có nghĩa là bạn đang trở về một con trỏ NULL hoặc bằng cách sử dụng NULL để biểu lỗi hoặc tất cả của sự nhầm lẫn đó, chúng tôi đã có tại một thời điểm. Ở đây, trở về NULL thường có nghĩa là lỗi. Rất nhiều thứ cũng trở về sai lỗi. Nhưng điểm là loại NULL, điều duy nhất các loại NULL NULL. Sau đó, gọi lại cũng giống như bạn có thể xác định một số chức năng ẩn danh. Bạn không cần phải cung cấp cho các chức năng một tên, nhưng bạn sẽ không phải đối phó với điều đó ở đây. Nhìn vào các loại mà họ mong đợi chúng ta biết, làm những gì bạn nghĩ rằng các loại là 3,50? >> [Sinh viên] nổi. Yeah. Vì vậy, sau đó ở đây, bạn làm những gì nghĩ rằng loại này? >> [Sinh viên] Array. Yeah. Người đầu tiên là thả nổi, điều thứ hai là một mảng. Chú ý rằng mảng này là không giống như một mảng C nơi bạn có chỉ số 0 có một số giá trị, chỉ số 1 có một số giá trị. Các chỉ số a, b, c và các giá trị là 1, 2, và 3. Trong PHP có là không có sự khác biệt giữa một mảng kết hợp và chỉ cần một mảng thường xuyên như bạn sẽ nghĩ về nó trong C. Có chỉ này, và bên dưới mui xe một mảng thường xuyên chỉ là một mảng kết hợp 0 bản đồ để một số giá trị theo cùng một cách một bản đồ để một số giá trị. Vì lý do này, PHP có thể được khá xấu mã / điểm chuẩn những điều thực sự nhanh chóng trong C từ khi bạn đang sử dụng một mảng, bạn biết rằng việc truy cập vào một thành viên là hằng số thời gian. Trong PHP truy cập vào một thành viên là những người hiểu biết bao nhiêu thời gian? Đây có thể là liên tục nếu nó băm một cách chính xác. Ai biết được những gì nó thực sự làm bên dưới mui xe? Bạn thực sự cần phải nhìn vào thực hiện để xem nó như thế nào để đối phó với điều đó. Vì vậy, sau đó fopen. Tôi nghĩ rằng ở đây chúng ta chỉ cần PHP hướng dẫn sử dụng fopen để nhìn vào kiểu trả về. Chúng ta thấy ở đây bạn có thể nhìn lên khá nhiều bất kỳ chức năng trong hướng dẫn sử dụng PHP và đây là loại trang người đàn ông của PHP. Kiểu trả về là có được nguồn tài nguyên. Đó là lý do tại sao tôi nhìn nó, bởi vì chúng tôi đã không thực sự xác định tài nguyên. Ý tưởng của các nguồn tài nguyên, trong C bạn loại có một * FILE hoặc bất cứ điều gì; trong PHP nguồn tài nguyên của bạn tập tin *. Đó là những gì bạn sẽ đọc từ, đó là những gì bạn sẽ được viết. Nó thường là bên ngoài, do đó, nó là một nguồn lực bạn có thể kéo những thứ từ và ném những thứ. Và cuối cùng, loại NULL là gì? >> [Sinh viên] NULL. Yeah. Vì vậy, điều duy nhất mà là NULL là NULL. NULL là NULL. Một trong những tính năng của hệ thống kiểu PHP (cho tốt hơn hoặc tồi tệ hơn) là khả năng của mình để sắp xếp các loại. Khi bạn viết một dòng mã PHP kết hợp các giá trị của các loại khác nhau, PHP sẽ cố gắng để làm điều hợp lý. Hãy thử mỗi trong những dòng sau đây của mã PHP. Những gì in ra? Có gì bạn mong đợi? Tại sao có và tại sao không? Điều này thực tế về PHP là những gì làm cho nó những gì chúng ta gọi là yếu gõ. Yếu gõ và gõ mạnh mẽ, có sử dụng khác nhau đối với những điều khoản, nhưng hầu hết mọi người sử dụng yếu gõ và gõ mạnh mẽ có nghĩa là các loại điều này nơi ("1" + 2), mà các công trình. Trong C mà không làm việc. Bạn có thể tưởng tượng này không làm việc. Rất nhiều người kết hợp gõ năng động và gõ yếu và gõ tĩnh và gõ mạnh. Python là một ví dụ khác của một ngôn ngữ động gõ. Bạn có thể ném xung quanh các loại trong các biến và nó sẽ xác định tại thời gian chạy bất kỳ checkings lỗi. Trong Python nó sẽ thực hiện điều này và nó sẽ thấy ("1" + 2); và điều này sẽ thất bại bởi vì nó nói bạn không thể thêm một chuỗi và một số nguyên. Trong PHP, mà chỉ là động gõ, điều này không sẽ thất bại. Kiểu yếu để làm với thực tế là nó làm những việc với các loại mà không thực sự có ý nghĩa nhất thiết. Vì vậy, ("1" + 2), tôi có thể tưởng tượng rằng là chuỗi 12, tôi có thể tưởng tượng nó là chuỗi 3, Tôi có thể tưởng tượng nó là các số nguyên 3. Nó không nhất thiết phải được xác định, và có lẽ chúng ta sẽ thấy ở đây rằng khi chúng tôi in ("1" + 2), nó có thể sẽ kết thúc sự khác biệt hơn so với in ấn (1 + "2"). Và điều này có xu hướng được, theo ý kiến ​​của tôi, cho tồi tệ hơn. Ở đây chúng ta có thể cố gắng. Một mẹo nhỏ khác về PHP là bạn không cần phải thực sự ghi các tập tin. Nó đã chạy chế độ lệnh. Vì vậy, php-r, sau đó chúng tôi có thể ném vào lệnh ở đây: "Print ('1 '+ 2)", và tôi sẽ ném một dòng mới. Này in 3. Nó trông giống như nó in 3 và đó là số nguyên 3. Vì vậy, bây giờ chúng ta hãy thử cách khác xung quanh: "Print (1 + '2 '); Chúng tôi nhận được 3, và nó cũng sẽ là số nguyên 3? Thực sự tôi không có ý tưởng. Có vẻ như vậy là phù hợp. Không bao giờ có bất kỳ cơ hội của nó là 12 chuỗi hoặc bất cứ điều gì như rằng bởi vì PHP, không giống như JavaScript và Java quá, có một nhà điều hành riêng biệt cho nối. Nối trong PHP là dấu chấm. Vì vậy, in ấn (1 '2 '.); Sẽ cung cấp cho chúng tôi 12. Điều này có xu hướng dẫn đến nhầm lẫn, nơi mọi người cố gắng làm một cái gì đó giống như str + = một số điều khác mà họ muốn để thêm vào cuối của chuỗi của họ, và đó là sẽ thất bại. Bạn cần phải làm str = Vì vậy, không quên nối trong PHP là một dấu chấm. Những điều khác để thử: in ("CS" + 50); Tôi đã nói với bạn rằng không có hy vọng điều này dẫn đến CS50 kể từ khi nối là không +. Những gì bạn nghĩ rằng điều này sẽ kết thúc? Tôi thành thật hoàn toàn không có ý tưởng. Có vẻ như nó chỉ là 50. Nó thấy chuỗi, và tôi đặt cược nếu chúng ta đặt 123CS - Nó thấy các chuỗi đầu tiên, nó sẽ cố gắng để đọc một số nguyên từ hoặc một số từ nó. Trong trường hợp này nó thấy 123CS. "Điều đó không có ý nghĩa như là một số nguyên, vì vậy tôi chỉ cần đi để suy nghĩ của 123." Vì vậy, 123 + 50 là 173. Và ở đây nó bắt đầu đọc sách này như là một số nguyên. Nó không nhìn thấy bất cứ điều gì, vì vậy nó chỉ xử lý nó như là 0. Vì vậy, 0 + 50 sẽ là 50. Tôi giả định là sẽ làm một cái gì đó tương tự. Tôi đang suy nghĩ 99. Yeah, bởi vì nó sẽ mất người đầu tiên - Vì vậy, 99. (10/7), nếu điều này là C, những gì mà có thể trở lại? [Sinh viên] 1. >> Yeah, nó sẽ là 1 vì 10/7 được chia 2 số nguyên. Một số nguyên chia một số nguyên để trả lại một số nguyên. Nó không thể trả lại 1 điểm bất cứ điều gì mà có thể, do đó, nó chỉ cần đi để trở về 1. Đây in (10/7), nó sẽ thực sự giải thích rằng. Và điều này có nghĩa là nếu bạn thực sự muốn làm làm tròn số nguyên và các công cụ như thế, bạn cần làm print (sàn (10/7)); Trong C, nó có thể là lạ mà bạn có thể dựa vào số nguyên cắt ngắn thường xuyên, nhưng trong PHP, bạn có thể không bởi vì nó sẽ tự động biến nó thành một phao. Và sau đó (7 + đúng), bạn làm những gì nghĩ rằng đó sẽ là? Tôi đoán 8 nếu nó sẽ giải thích đúng như 1. Có vẻ như đó là 8. Vì vậy, bất cứ điều gì chúng tôi đã thực hiện trong 10 phút vừa qua bạn nên tuyệt đối không bao giờ làm. Bạn sẽ thấy mã mà thực hiện điều này. Nó không phải là đơn giản như thế này. Bạn có thể có 2 biến, và 1 biến sẽ xảy ra là một chuỗi và biến khác xảy ra là một int, và sau đó bạn thêm các biến này lại với nhau. Kể từ PHP được tạo kiểu động và nó sẽ không làm bất kỳ kiểm tra kiểu cho bạn và kể từ khi nó yếu gõ vì nó sẽ chỉ tự động ném những thứ này lại với nhau và tất cả mọi thứ sẽ làm việc, rất khó để biết rằng biến này phải là một chuỗi, vì vậy tôi không nên thêm biến này, đó là một số nguyên. Tốt nhất, nếu một biến là một chuỗi, giữ nó như là một chuỗi mãi mãi. Nếu một biến là một int, giữ nó như là một int mãi mãi. Nếu bạn muốn để đối phó với số nguyên và chuỗi, bạn có thể sử dụng varsint - đó là JavaScript. Intval. Tôi làm điều này tất cả các thời gian. PHP và JavaScript Tôi kết hợp tất cả mọi thứ. Vì vậy, intval sẽ trả về giá trị số nguyên của một biến. Nếu chúng ta vượt qua trong "print (intval ('123 ')), bạn nhận được 123. Intval chính nó sẽ không làm việc kiểm tra đối với chúng tôi rằng đó là độc quyền một số nguyên. Hướng dẫn sử dụng PHP, có chức năng rất nhiều, do đó, ở đây tôi nghĩ rằng những gì tôi sẽ sử dụng là is_numeric 1. Tôi đoán đó quay trở lại sai. Đó là một điều chúng ta phải đi qua là ===. Vì vậy, is_numeric ('123df '), bạn sẽ không nghĩ rằng đó là is_numeric. Trong C, bạn sẽ phải lặp qua tất cả các ký tự và kiểm tra để xem nếu mỗi ký tự là chữ số hoặc bất cứ điều gì. Đây is_numeric sẽ làm điều đó cho chúng ta, và nó trở về false. Vì vậy, khi tôi in ra, nó được in không có gì, vì vậy ở đây tôi so sánh nó để xem, bạn đã xảy ra là sai lầm? Và vì vậy bây giờ nó in 1. Rõ ràng nó in 1 là đúng thay vì in ấn đúng là đúng. Tôi tự hỏi nếu tôi làm print_r. Không, nó vẫn còn hiện 1. Trở lại ===, == vẫn còn tồn tại, và nếu bạn nói chuyện to Tommy, anh ấy sẽ nói == là hoàn toàn tốt đẹp. Tôi sẽ nói rằng == là khủng khiếp và bạn không bao giờ nên sử dụng ==. Sự khác biệt là == so sánh những thứ nơi nó có thể là sự thật ngay cả khi họ không phải cùng loại, trong khi đó === so sánh những điều đầu tiên nó kiểm tra là họ cùng loại? Vâng. Được rồi, bây giờ tôi sẽ thấy nếu họ thực sự so sánh bằng. Bạn sẽ có được những điều kỳ lạ như 10 bằng - hãy cho xem những gì mà nói. Vì vậy, ('10 '== '1 e1'); Điều này trả về true. Có ai có bất kỳ dự đoán lý do tại sao điều này trả về true? Nó không chỉ là về điều đó. Có lẽ đây là một gợi ý. Nhưng nếu tôi thay đổi đến f - darn nó! Tôi tiếp tục sử dụng dấu ngoặc kép. Lý do các dấu ngoặc kép la tôi là bởi vì tôi đã đặt này trong dấu ngoặc kép. Vì vậy, tôi có thể thoát khỏi dấu ngoặc kép ở đây, nhưng báo giá duy nhất làm cho nó dễ dàng hơn. Vì vậy, ('10 '== '1 f1'); không in đúng sự thật. ('10 '== '1 E1'); in đúng sự thật. [Sinh viên] hex? >> Đó là hex, nhưng nó gần mà nó giống như - 1e1, khoa học ký hiệu. Nó nhận ra 1e1 là 1 * 10 ^ 1 hoặc bất cứ điều gì. Đó là các số nguyên bằng nhau. Nếu chúng ta làm === sau đó nó sẽ là sai lầm. Tôi thực sự không có ý tưởng nếu chúng ta làm == những gì về (10 và '10abc '); Được rồi. Vì vậy, đó là sự thật. Vì vậy, giống như khi bạn đã làm (10 + '10abc '); và nó sẽ là 20, (10 == '10abc '); là sự thật. Thậm chí tệ hơn là những thứ như (false == NULL); là đúng sự thật (false == 0); là đúng, (false == []); Có những trường hợp kỳ lạ của - Đó là một trong những trường hợp kỳ lạ. Chú ý rằng (false == []); là sự thật. ('0 '== False); là sự thật. ('0 '== []); Là sai. Vì vậy == là không có cách nào transitive. có thể là bằng b và có thể là bằng c, nhưng b có thể không được bằng c. Đó là một sự gớm ghiếc với tôi, và bạn nên luôn luôn sử dụng ===. [Sinh viên] chúng tôi có thể làm == cũng! >> [Bowden]. Tương đương sẽ được! = Và ==. Điều này thực sự lớn lên trong spec pset mà rất nhiều các chức năng trở lại - Các hướng dẫn sử dụng PHP là tốt về việc này. Nó đặt trong một hộp lớn màu đỏ, "Điều này sẽ trả về false nếu có một lỗi." Nhưng trở về 0 là một điều hoàn toàn hợp lý để trở về. Hãy suy nghĩ về bất kỳ chức năng dự kiến ​​sẽ trả về một số nguyên. Hãy nói rằng chức năng này được cho là để đếm số lượng các dòng trong một tập tin hoặc một cái gì đó. Trong những trường hợp bình thường, bạn vượt qua chức năng này một tập tin và nó sẽ trả lại một số nguyên đại diện cho số dòng. Vì vậy, 0 là một số hoàn toàn hợp lý nếu tập tin chỉ là trống rỗng. Nhưng chức năng nếu bạn vượt qua nó một tập tin không hợp lệ và điều gì sẽ xảy ra để trả về false nếu bạn vượt qua nó một tập tin không hợp lệ? Nếu bạn chỉ cần làm == bạn không khác biệt là trường hợp giữa tập tin không hợp lệ và tập tin rỗng. Luôn luôn sử dụng ===. Đó là tất cả những người. Trong PHP, kiểu mảng là khác nhau từ những gì bạn đang sử dụng để trong C. Thật vậy, bạn có thể đã nhận thấy điều này ở trên khi bạn thấy rằng đây là kiểu của mảng. Cú pháp khung mới là 5,4 PHP, đó là phiên bản mới nhất của PHP. Trước đây, bạn luôn luôn có để viết array ('a' -> 1, 'b' -> 2. Đó là các nhà xây dựng cho một mảng. Bây giờ PHP cuối cùng đã đến xung quanh cú pháp tốt đẹp chỉ dấu ngoặc vuông, mà chỉ là tốt hơn so với mảng. Nhưng xem xét PHP 5,4 là phiên bản mới nhất, bạn có thể gặp phải những nơi mà thậm chí không có PHP 5.3. Trong mùa hè, chúng tôi chạy vào vấn đề này PHP 5,3 là những gì chúng tôi đã có trên thiết bị, nhưng máy chủ mà chúng tôi triển khai tất cả các sổ điểm của chúng tôi và trình và tất cả các công cụ đó để PHP 5,4. Không biết điều này, chúng tôi phát triển trong 5,3, đẩy đến 5,4, và bây giờ tất cả của một không đột ngột mã của chúng tôi hoạt động vì đã xảy ra đã thay đổi từ 5,3 và 5,4 không tương thích ngược, và chúng tôi phải đi và sửa chữa tất cả những thứ của chúng tôi mà không làm việc cho PHP 5.4. Đối với lớp học này, kể từ khi thiết bị không có PHP 5,4, nó hoàn toàn tốt để sử dụng dấu ngoặc vuông. Nhưng nếu bạn đang tìm kiếm những thứ trên Internet, nếu bạn đang tìm một số loại công cụ mảng, rất có thể bạn sẽ thấy spell ra cú pháp xây dựng mảng kể từ đó được khoảng từ PHP được sinh ra và khung vuông cú pháp đã được khoảng vài tháng qua hoặc bất cứ khi nào 5,4 đến xung quanh. Đây là cách bạn chỉ số. Cũng giống như trong C làm thế nào bạn sẽ chỉ số bởi các dấu ngoặc vuông như $ array [0], $ array [1], $ array [2], bạn chỉ số cùng một cách nếu bạn xảy ra để có chỉ số của bạn là chuỗi. Vì vậy, $ array ['a'] và $ array ['b'. $ Array [b]. Tại sao điều này là sai? Nó có thể sẽ tạo ra một cảnh báo nhưng vẫn làm việc. PHP có xu hướng để làm điều đó. Nó có xu hướng chỉ, "Tôi sẽ cảnh báo bạn về điều này, nhưng tôi chỉ cần đi để tiếp tục đi "Và làm bất cứ điều gì tôi có thể." Nó có lẽ sẽ dịch này cho một chuỗi, nhưng có thể là tại một số điểm trong một ai đó qua cho biết xác định b là 'Hello World'. Vì vậy, bây giờ b có thể là một mảng liên tục và $ [b] thực sự sẽ được làm "HELLO WORLD". Tôi nghĩ rằng tại thời điểm này, hoặc ít nhất là cài đặt PHP của chúng tôi, nếu bạn cố gắng để chỉ mục vào một mảng và khóa đó không tồn tại, nó sẽ thất bại. Tôi không nghĩ rằng nó sẽ cảnh báo bạn. Hoặc ít nhất bạn có thể thiết lập nó để nó không chỉ cảnh báo bạn, nó chỉ thẳng lên không thành công. Cách bạn kiểm tra để xem nếu có thực sự là một chỉ số như vậy là isset. Vì vậy, isset ($ array ['Hello World') sẽ trả về false. isset ($ array ['b']) sẽ trở lại đúng sự thật. Bạn có thể kết hợp các cú pháp này. Tôi chắc rằng mảng này sẽ kết thúc được - Chúng ta có thể kiểm tra nó ra. Oh, tôi cần PHPWord. Này được pha trộn các cú pháp nơi bạn xác định những gì là quan trọng và bạn không chỉ định chính là những gì. Vì vậy, 3 ngay đây là một giá trị. Bạn đã không rõ ràng những gì quan trọng của nó là có được. Những gì bạn nghĩ rằng chính của nó là có được không? [Sinh viên] 0. >> Tôi đoán 0 chỉ vì đây là một trong những đầu tiên chúng tôi đã không được chỉ định. Chúng tôi thực sự có thể làm một vài những trường hợp này. Vì vậy, print_r là in đệ quy. Nó sẽ in toàn bộ mảng. Nó sẽ in subarrays của mảng nếu có bất kỳ. Vì vậy, print_r ($ mảng); php.test.php. Nó trông giống như nó đã cho nó 0. Có thực sự là một cái gì đó để ghi nhớ ở đây, nhưng chúng tôi sẽ lấy lại nó trong một lần thứ hai. Nhưng điều gì sẽ xảy ra nếu tôi xảy ra để làm cho chỉ số 1? PHP không phân biệt giữa các chỉ số chuỗi và chỉ số số nguyên, như vậy vào thời điểm này tôi đã chỉ được xác định một chỉ số 1 và tôi có thể làm cả hai mảng $ [1] và mảng $ ['1 '] và nó sẽ là chỉ số giống nhau và cùng một phím. Vì vậy, bây giờ những gì bạn nghĩ 3 là có được không? >> [Sinh viên] 2. >> [Bowden] Tôi đoán 2. Yeah. Đó là 2. Điều gì sẽ xảy ra nếu chúng tôi đã làm này là 10, đây là 4? Những gì bạn nghĩ rằng chỉ số của 3 là có được không? Tôi đang suy nghĩ 11. Tôi đoán những gì PHP - và tôi nghĩ rằng tôi đã nhìn thấy điều này trước khi - là nó chỉ theo dõi số chỉ số cao nhất nó được sử dụng cho đến nay. Nó không bao giờ sẽ chỉ định một chỉ số chuỗi đến 3. Nó sẽ luôn luôn là một số chỉ số. Vì vậy, theo dõi của một trong những cao nhất được giao cho đến nay, mà sẽ xảy ra là 10, và nó sẽ cung cấp cho 11 3. Những gì tôi đã nói trước, chú ý cách nó được in mảng này. Nó in chính 10, 4 phím, 11 phím, phím d. Hoặc thậm chí chúng ta hãy làm - Tôi đoán tôi đã không đặt một 0, nhưng nó in 1, 2, 3, 4. Điều gì sẽ xảy ra nếu tôi chuyển sang ở đây? Hoặc chúng ta hãy thực sự chuyển đổi các 2. Bây giờ nó in 2, 1, 3, 4. PHP mảng là không giống như bảng băm của bạn thường xuyên. Đó là hoàn toàn hợp lý để nghĩ về chúng như bảng băm 99% thời gian. Tuy nhiên, trong bảng băm của bạn không có cảm giác của trật tự trong đó mọi thứ đã được đưa vào. Vì vậy, ngay sau khi bạn chèn nó vào bảng băm của bạn, giả sử có không có danh sách liên kết và bạn có thể đánh giá trong một danh sách liên kết được chèn đầu tiên. Nhưng ở đây chúng tôi đưa vào lần thứ 2 và nó biết khi nó được in ra mảng này mà 2 đến trước. Nó không in nó ra để chỉ bất kỳ. Cấu trúc dữ liệu kỹ thuật mà nó sử dụng là một bản đồ ra lệnh, vì vậy nó bản đồ phím các giá trị và nó nhớ thứ tự mà các phím đã được đưa vào. Về cơ bản đó là một số biến chứng mà nó gây phiền nhiễu để thực sự - Hãy nói rằng bạn có một mảng 0, 1, 2, 3, 4, 5 và bạn muốn để đưa ra chỉ số 2. Một cách để làm việc đó, chúng ta hãy xem những gì trông giống như. 0, 2, 1, 3, 4. Bỏ xảy ra để bỏ đặt cả hai biến và chỉ số của mảng. Vì vậy, unset ($ array [2]); Bây giờ điều này là những gì sẽ trông giống như? 2 chỉ là đi, vì vậy đó là hoàn toàn tốt đẹp. Gây phiền nhiễu hơn là nếu bạn muốn mọi thứ để thực sự được như một mảng. Tôi sẽ đưa số ngẫu nhiên. Bây giờ nhận thấy chỉ số của tôi. Tôi muốn nó chỉ giống như một mảng C nơi nó đi từ 0 đến dài 1 và tôi có thể lặp qua nó như vậy. Nhưng ngay sau khi tôi bỏ đặt chỉ số thứ hai, những gì trong chỉ mục 3 không trở thành chỉ số 2. Thay vào đó, chỉ cần loại bỏ chỉ mục đó và bây giờ bạn đi 0, 1, 3, 4. Điều này là hoàn toàn hợp lý. Nó chỉ gây phiền nhiễu và bạn phải làm những thứ như mối nối mảng. Yeah. [Sinh viên] Điều gì sẽ xảy ra nếu bạn đã có một vòng lặp for và bạn muốn đi qua tất cả các yếu tố? Khi nó chạm 2, nó sẽ đem lại bao giờ? Iterating trên một mảng. Có 2 cách để bạn có thể làm điều đó. Bạn có thể sử dụng thường xuyên cho vòng lặp. Đây là một phức tạp của PHP. Hầu hết các ngôn ngữ, tôi sẽ nói, có một số loại chiều dài hoặc len hoặc một cái gì đó chỉ ra chiều dài của một mảng. Trong PHP đếm. Vì vậy, count ($ array); $ i + +) Hãy chỉ in ($ array [$ i]); Notice: Undefined offset: 2. Nó chỉ là sẽ thất bại. Đây là lý do rằng, đối với hầu hết các phần, bạn không bao giờ cần để lặp qua một mảng như thế này. Nó có thể là một cường điệu, nhưng bạn không bao giờ cần để lặp qua một mảng như thế này bởi vì PHP cung cấp cú pháp foreach của nó, nơi foreach ($ array là $ mục). Bây giờ nếu chúng tôi in ($ item); - we'll thảo luận về nó trong một giây - hoạt động hoàn toàn tốt đẹp. Cách mà foreach đang làm việc là tham số đầu tiên là mảng mà bạn đang iterating trên. Và đối số thứ hai, mục, thông qua mỗi đường đi qua cho vòng lặp nó sẽ mất điều tiếp theo trong mảng. Vì vậy, hãy nhớ mảng có một đơn đặt hàng. Lần đầu tiên thông qua các vòng lặp for, mục là có được 123 sau đó nó sẽ là 12 sau đó nó sẽ là 13 sau đó nó sẽ là 23 sau đó nó sẽ là 213. Nhận được những điều thực sự kỳ lạ khi bạn làm một cái gì đó như foreach. Hãy xem những gì sẽ xảy ra bởi vì bạn không bao giờ nên làm điều này. Điều gì sẽ xảy ra nếu chúng ta unset ($ array [1]); Đó là có thể dự kiến. Bạn đang iterating trên mảng này, và mỗi khi bạn đang unsetting chỉ số đầu tiên. Vì vậy, đối với chỉ số 0, điều item, đầu tiên có giá trị 0, do đó, nó sẽ là 123. Nhưng bên trong vòng lặp cho chúng tôi unset chỉ số 1, do đó có nghĩa 12 đã biến mất. Vì vậy, in. PHP_EOL. PHP_EOL chỉ là xuống dòng, nhưng đó là kỹ thuật di động nhiều hơn kể từ khi dòng mới trong Windows là khác nhau từ các dòng mới trên Mac và UNIX. Trên Windows dòng mới \ r \ n, trong khi đó ở khắp mọi nơi khác nó có xu hướng chỉ để được \ n. PHP_EOL được cấu hình để sử dụng bất cứ dòng mới của hệ thống của bạn. Vì vậy, in đó. Hãy không print_r ($ mảng) ở cuối. Tôi không có ý tưởng rằng đó sẽ là hành vi. Mục vẫn còn có giá trị 12 mặc dù chúng ta unset 12 trước khi chúng ta từng có từ mảng. Không dùng từ ngữ của tôi về điều này, nhưng có vẻ như foreach tạo ra một bản sao của mảng và sau đó mục có trên tất cả các giá trị của bản sao đó. Vì vậy, ngay cả nếu bạn sửa đổi các mảng bên trong vòng lặp for, nó sẽ không quan tâm. Mục sẽ đảm nhận các giá trị ban đầu. Chúng ta hãy thử unset nó. Nếu điều này là $ array [1] = "hello"; Mặc dù chúng tôi đặt "hello" vào mảng đó, mục không bao giờ mất giá trị đó. Có một cú pháp để foreach vòng nơi bạn đặt 2 biến ngăn cách bởi một mũi tên. Biến đầu tiên này sẽ là chìa khóa của giá trị đó, và điều này biến thứ hai là có được chính xác cùng một mục. Này là không thú vị ở đây, nhưng nếu chúng ta quay trở lại trường hợp ban đầu của chúng tôi 'a' -> 1, 'B' -> 1, nếu chúng ta chỉ lặp cho mỗi mảng như mục, mục là có được 1 mỗi lần duy nhất. Nhưng nếu chúng ta cũng muốn biết phím kết hợp với mục đó sau đó chúng tôi làm là $ key -> $ item. Vì vậy, bây giờ chúng tôi có thể làm print ($ key ':'.. Bây giờ nó iterating trên và in ấn mỗi chìa khóa và giá trị kết hợp của nó. Thêm một điều chúng ta có thể làm trong các vòng lặp foreach, bạn có thể thấy cú pháp này. Ampersands trước tên biến có xu hướng là làm thế nào PHP làm tài liệu tham khảo. Trường hợp tài liệu tham khảo rất tương tự như con trỏ, bạn không có con trỏ, vì vậy bạn không bao giờ đối phó với bộ nhớ trực tiếp. Nhưng bạn không có tài liệu tham khảo 1 biến đề cập đến cùng một điều như là một biến khác. Bên trong đây, chúng ta hãy làm $ item. Hãy trở lại 1, 10. Hãy làm $ item + +; Điều đó vẫn còn tồn tại trong PHP. Bạn vẫn có thể làm + +. php.test.php. Tôi phải in nó. print_r ($ mảng); Chúng tôi in 2, 11. Nếu tôi chỉ cần thực hiện foreach ($ array là $ mục) sau đó hàng sẽ được giá trị 1 lần đầu tiên qua vòng này. Nó sẽ tăng 1 2 và sau đó chúng tôi đang thực hiện. Vì vậy, sau đó nó sẽ đi qua đèo thứ hai của vòng lặp và mặt hàng đó là 10. Nó increments mục đến 11, và sau đó bỏ đi. Sau đó, chúng tôi print_r ($ mảng); và để cho thấy rằng đây chỉ là 1, 10. Vì vậy, tăng chúng tôi đã làm đã bị mất. Nhưng foreach ($ array như & $ item) bây giờ mặt hàng này là cùng một mục như thế này ngay tại đây. Đó là điều tương tự. Vì vậy, $ item + + được sửa đổi mảng 0. Về cơ bản, bạn cũng có thể làm $ k -> $ item và bạn có thể làm $ array [$ k] + +; Vì vậy, một cách khác để làm điều đó, chúng ta được tự do sửa đổi mục, nhưng điều đó sẽ không sửa đổi mảng ban đầu của chúng tôi. Nhưng nếu chúng ta sử dụng k, đó là chìa khóa của chúng tôi, sau đó chúng ta có thể chỉ cần chỉ số vào mảng của chúng tôi bằng cách sử dụng khóa đó và tăng đó. Điều này trực tiếp hơn thay đổi mảng ban đầu của chúng tôi. Bạn thậm chí có thể làm điều đó nếu vì một lý do nào đó bạn muốn có khả năng sửa đổi - Trên thực tế, điều này là hoàn toàn hợp lý. Bạn không muốn phải viết $ array [$ k] + +, bạn chỉ muốn viết $ item + + nhưng bạn vẫn muốn nói nếu ($ k === 'a') sau đó tăng mục và sau đó in mảng của chúng tôi. Vì vậy, bây giờ chúng tôi mong đợi điều gì print_r để làm? Những giá trị này nên được in? [Sinh viên] 2 và 10. >> [Bowden] Chỉ nếu phím 'a' để chúng ta thực sự in. Bạn có thể rất hiếm khi, nếu bao giờ hết, cần phải xác định các chức năng trong PHP, nhưng bạn có thể thấy một cái gì đó tương tự nơi bạn xác định một chức năng như bất cứ chức năng. Thông thường, bạn sẽ nói ($ foo, bar) và sau đó xác định nó là bất cứ điều gì. Nhưng nếu tôi làm điều này thì điều đó có nghĩa rằng bất cứ điều gì gọi là bất cứ điều gì, bất cứ điều gì gọi baz, do đó, đối số đầu tiên được truyền cho baz có thể được thay đổi. Hãy làm $ foo + +; và bên trong ở đây chúng ta hãy làm baz ($ item); Bây giờ chúng tôi đang kêu gọi một chức năng. Đối số được thực hiện bằng cách tham khảo, có nghĩa là nếu chúng ta sửa đổi nó chúng tôi đang sửa đổi các điều đã được thông qua. Và in ấn này, chúng tôi mong đợi - trừ khi tôi sai lầm cú pháp - chúng tôi đã nhận 2, 11, do đó, nó đã thực sự tăng lên. Thông báo chúng ta cần tài liệu tham khảo tại 2 địa điểm. Điều gì sẽ xảy ra nếu tôi đã làm điều này? Điều này có nghĩa là gì? [Sinh viên] Nó sẽ thay đổi. >> Yeah. Mục chỉ là một bản sao của giá trị trong mảng. Vì vậy, mục sẽ thay đổi để 2, nhưng array ['a'] vẫn sẽ là 1. Hoặc nếu tôi làm điều này? Bây giờ mục được gửi như là một bản sao cho baz. Vì vậy, các bản sao của các đối số sẽ được tăng lên đến 2, nhưng mục chính nó không bao giờ được tăng lên đến 2. Và mục là điều tương tự như khung mảng bất cứ điều gì, do đó, mảng đó không bao giờ được tăng lên. Vì vậy, cả những nơi cần nó. PHP thường là khá thông minh về điều này. Bạn có thể nghĩ rằng tôi muốn đi qua tham khảo - Đây thực sự là một câu hỏi về một trong các psets. Đó là một điều questions.txt nơi mà nó nói, Tại sao bạn có thể muốn để vượt qua cấu trúc bằng cách tham khảo? Câu trả lời đó là gì? [Sinh viên] Vì vậy, bạn không cần phải sao chép cái gì đó lớn. >> Yeah. Một cấu trúc có thể được tùy tiện lớn, và khi bạn vượt qua các cấu trúc như một tham số nó cần để sao chép rằng cấu trúc toàn bộ để vượt qua nó để chức năng, trong khi nếu bạn chỉ cần vượt qua các cấu trúc bằng cách tham khảo sau đó nó chỉ cần sao chép một địa chỉ 4-byte như là đối số chức năng. PHP là một chút thông minh hơn đó. Nếu tôi có một số chức năng và tôi vượt qua nó một mảng của 1.000 điều, không có nghĩa là nó sẽ phải sao chép tất cả 1,000 trong những điều để vượt qua nó vào chức năng? Nó không có để làm điều đó ngay lập tức. Nếu bên trong của chức năng này, nó không bao giờ thực sự thay đổi foo, vì vậy nếu ($ foo === 'hello') trả lại đúng sự thật; Lưu ý chúng tôi không bao giờ thực sự thay đổi bên trong đối số của chức năng này, điều đó có nghĩa rằng bất cứ điều gì đã được thông qua tại như foo không bao giờ cần phải được sao chép bởi vì nó không sửa đổi nó. Vì vậy, cách PHP công trình là các đối số luôn luôn được thông qua tham khảo cho đến khi bạn thực sự cố gắng để sửa đổi nó. Bây giờ nếu tôi nói $ foo + +; bây giờ sẽ tạo một bản sao của foo ban đầu và sửa đổi các bản sao. Điều này giúp tiết kiệm một số thời gian. Nếu bạn không bao giờ chạm vào mảng này lớn, bạn không bao giờ thực sự sửa đổi nó, nó không cần phải thực hiện các bản sao, trong khi đó nếu chúng ta chỉ cần đặt dấu "và" điều đó có nghĩa là nó thậm chí không sao chép nó ngay cả khi bạn sửa đổi nó. Hành vi này được gọi là copy-on-viết. Bạn sẽ thấy nó ở những nơi khác, đặc biệt là nếu bạn dự khoá học hệ điều hành. Copy-on-viết là một mẫu khá thông thường mà bạn không cần phải thực hiện một bản sao của một cái gì đó trừ khi nó thực sự thay đổi. Yeah. [Sinh viên] Điều gì sẽ xảy ra nếu bạn đã có thặng dư bên trong thử nghiệm, do đó, chỉ có 1 phần tử trong số 1.000 sẽ cần phải được thay đổi? Tôi không chắc. Tôi nghĩ rằng nó sẽ sao chép toàn bộ điều, nhưng nó có thể đủ thông minh mà Trên thực tế, những gì tôi đang suy nghĩ là tưởng tượng chúng ta đã có một mảng trông như thế này: $ array2 = [ Sau đó, chỉ số 'a' là một mảng [1 2 3 4], và chỉ số 'b' là một mảng của bất cứ điều gì. Tôi cần dấu phẩy giữa tất cả những người. Hãy tưởng tượng có dấu phẩy. Sau đó, 'c' là 3 giá trị. Okay. Bây giờ hãy nói rằng chúng tôi làm $ baz ($ array2); baz không thực hiện việc này bằng cách tham khảo. Vì vậy, $ foo ['c'] + +; Đây là một ví dụ mà chúng ta đang truyền array2 như một tham số và sau đó nó được sửa đổi một chỉ số cụ thể của mảng bằng cách tăng nó. Thực sự tôi không có ý tưởng những gì PHP là sẽ làm. Nó có thể dễ dàng tạo một bản sao của toàn bộ điều, nhưng nếu nó là thông minh, nó sẽ làm cho một bản sao của các phím này sẽ có giá trị riêng biệt của nó nhưng điều này vẫn có thể trỏ đến cùng một mảng 1,2,3,4 và điều này vẫn có thể trỏ đến cùng một mảng. Tôi sẽ iPad nó. Chúng tôi vượt qua trong mảng này mà điểm anh chàng này đến 3, điểm này anh chàng [1,2,3,4], anh chàng này [34, ...] Bây giờ chúng ta đang đi qua nó để baz, chúng ta đang thay đổi này. Nếu PHP là thông minh, nó chỉ có thể làm - Chúng tôi vẫn phải sao chép một số bộ nhớ, nhưng nếu có những subarrays lồng nhau rất lớn chúng tôi không cần phải sao chép những người. Tôi không biết nếu đó là những gì nó làm, nhưng tôi có thể tưởng tượng nó làm điều đó. Đây cũng là một lợi thế khá lớn của C trên PHP. PHP làm cho cuộc sống dễ dàng hơn nhiều cho rất nhiều thứ, nhưng bạn có loại hoàn toàn không có ý tưởng tốt như thế nào nó sẽ thực hiện bởi vì tôi không có ý tưởng bên dưới mui xe khi nó làm cho các bản sao của sự vật, oh, là sẽ là một bản sao thời gian liên tục, là nó chỉ thay đổi 1 con trỏ, nó sẽ là bản sao tuyến tính ridiculously khó khăn? Điều gì sẽ xảy ra nếu nó không thể tìm thấy không gian? Liệu nó sau đó cần phải chạy thu gom rác thải để có được một số chi tiết không gian? Và thu gom rác thải có thể tùy tiện lâu. Trong C, bạn không phải lo lắng về những điều này. Mỗi dòng bạn viết bạn có thể khá nhiều lý do về việc làm thế nào nó sẽ thực hiện. Hãy xem xét ở thời điểm đó. Tốt đẹp là như thế nào mà bạn không phải để đối phó với các hàm băm, danh sách liên kết, hoặc bất cứ điều gì như thế? Kể từ khi làm việc với các bảng băm là dễ dàng như vậy, đây là một câu đố thú vị để làm việc trên. Mở một tập tin gọi là unique.php và trong đó viết một chương trình PHP (Cũng được biết đến như là một "kịch bản"). Chúng ta có xu hướng để gọi cho họ kịch bản nếu họ ngắn mà bạn chạy tại dòng lệnh. Về cơ bản, bất kỳ ngôn ngữ mà bạn không biên dịch nhưng bạn sẽ chạy file thực thi tại dòng lệnh, bạn có thể gọi đó là kịch bản thực thi. Tôi cũng chỉ có thể viết một chương trình C mà thực hiện điều này, nhưng tôi không gọi nó là một kịch bản lần đầu tiên kể từ khi tôi biên dịch nó và sau đó chạy nhị phân. Tuy nhiên, chương trình này PHP chúng ta sẽ gọi một kịch bản. Hoặc nếu chúng tôi đã viết nó trong Python hay Perl hay Node.js hoặc bất kỳ những điều đó, chúng tôi muốn gọi cho họ tất cả các kịch bản bởi vì bạn chạy chúng tại các dòng lệnh nhưng chúng tôi không biên dịch chúng. Chúng ta có thể làm điều này khá nhanh chóng. Chúng tôi sẽ không sử dụng argv. Hãy chỉ thổi qua. Gọi nó là độc đáo, viết một chương trình. Bạn có thể giả định rằng các đầu vào sẽ chứa một từ mỗi dòng. Trên thực tế, argv sẽ được khá tầm thường để sử dụng. unique.php. Điều đầu tiên đầu tiên, chúng tôi muốn kiểm tra xem chúng tôi đã được thông qua 1 đối số dòng lệnh. Cũng như bạn mong chờ argc và argv trong C, chúng tôi vẫn còn có những người trong PHP. Vì vậy, nếu ($ argc == 2) sau đó tôi sẽ không giải quyết in một tin nhắn hoặc bất cứ điều gì. Tôi sẽ chỉ thoát ra, mã lỗi của 1. Tôi cũng có thể trở về 1. Hiếm khi trong PHP là tại tiểu bang này, nơi chúng tôi đang ở - Thông thường, bạn đang ở trong một chức năng được gọi là một chức năng được gọi là một chức năng được gọi là bởi một hàm. Và nếu có điều gì sai và bạn chỉ muốn thoát khỏi tất cả mọi thứ hoàn toàn, xuất cảnh chỉ kết thúc chương trình. Điều này cũng tồn tại trong C. Nếu bạn đang ở trong một chức năng trong một chức năng trong một chức năng trong một chức năng và bạn muốn chỉ cần tiêu diệt chương trình, bạn có thể gọi xuất cảnh, nó sẽ chỉ thoát khỏi. Nhưng trong PHP nó thậm chí còn hiếm hoi mà chúng tôi đang ở cấp cao nhất này. Thông thường chúng ta đang ở trong một số loại chức năng, vì vậy chúng tôi gọi xuất cảnh do đó chúng tôi không phải trả lại 1 điều mà sau đó nhận ra có một lỗi vì vậy mà trả về nếu công nhận có một lỗi. Chúng tôi không muốn để đối phó với điều đó, vì vậy thoát khỏi (1); (1) trở lại, trong trường hợp này sẽ là tương đương. Sau đó, những gì chúng tôi muốn mở, chúng tôi muốn để fopen. Các đối số sẽ trông khá tương tự. Chúng tôi muốn fopen ($ argv [1], và chúng tôi muốn mở nó ra đọc. Mà trả về một tài nguyên mà chúng ta sẽ gọi f. Điều này có vẻ khá giống với C không nó, ngoại trừ chúng tôi không cần phải nói * FILE. Thay vào đó, chúng tôi chỉ nói rằng $ f. Okay. Trên thực tế, tôi nghĩ rằng điều này thậm chí cung cấp cho chúng tôi một gợi ý như PHP chức năng tập tin gọi là. PHP File. Điều này sẽ làm là đọc một tập tin toàn bộ vào một mảng. Bạn thậm chí không cần để fopen nó. Nó sẽ làm điều đó cho bạn. Vì vậy, $ dòng = file ($ argv [1]); Bây giờ tất cả các dòng của tập tin nằm trong dây chuyền. Bây giờ chúng tôi muốn sắp xếp các dòng. Làm thế nào chúng ta có thể sắp xếp các dòng? Chúng tôi sắp xếp các dòng. Và bây giờ chúng tôi có thể in ra hoặc bất cứ điều gì. Có lẽ cách đơn giản nhất là foreach ($ dòng như $ line) echo $ line; [Sinh viên] sẽ không chúng tôi thậm chí vượt qua dòng bằng cách tham khảo một cái gì đó vào loại? Đây là nơi mà loại sẽ được định nghĩa là chức năng loại (& $ array). Khi bạn gọi hàm bạn không vượt qua nó bằng cách tham khảo. Đó là chức năng định nghĩa nó như dùng nó như là tài liệu tham khảo. Điều này thực sự là chính xác những gì đã đi sai khi chúng tôi đặt tất cả mọi thứ đến các máy chủ của chúng tôi khi chúng tôi đi từ 5,3 đến 5,4. Cho đến 5,4, điều này là hoàn toàn hợp lý. Một chức năng không mong đợi để có nó như là tài liệu tham khảo, nhưng bạn có thể vượt qua nó như là tài liệu tham khảo do đó, nếu chức năng không xảy ra để sửa đổi nó, nó vẫn còn thay đổi. 5,4, bạn không phải làm điều này. Vì vậy, bây giờ cách duy nhất bạn đi qua tham khảo là nếu chức năng một cách rõ ràng nó. Nếu bạn không muốn nó để sửa đổi nó, sau đó bạn cần để làm sao chép = $ đường dây và bản sao vượt qua. Vì vậy, bây giờ dòng sẽ được bảo tồn và bản sao sẽ được thay đổi. php.unique.php. Tôi có thể có sai lầm một cái gì đó lên. Bất ngờ 'loại'. Có sẽ là một cái gì đó mà thực hiện điều này cho chúng ta. Nó thậm chí không có. Chú ý khi bạn đọc hướng dẫn sử dụng đối số đầu tiên dự kiến ​​sẽ là một mảng và nó được thực hiện bằng cách tham chiếu. Tại sao điều này phàn nàn với tôi? Bởi vì tôi có chức năng loại này vẫn còn ở đây mà tôi không muốn. Được rồi, php.unique.php. Tôi đã không vượt qua nó một cuộc tranh cãi bởi vì tôi không có một tập tin. Đó là php.unique.php trên test.php. Đây là test.php in ra theo một thứ tự sắp xếp tốt đẹp. Chú ý sắp xếp theo thứ tự là loại lạ cho một tập tin mã bởi vì tất cả các dòng trống của chúng tôi sẽ đến đầu tiên sau đó sẽ đến tất cả của các chỗ lõm cấp 1 của chúng tôi sau đó đến tất cả của các chỗ lõm không của chúng tôi. Yeah. >> [Sinh viên] Vì vậy, cho mã nguồn đã không được thông qua tham khảo? Mà thường thông qua giá trị? Bowden Khi bạn gọi một chức năng, nó không bao giờ xác định cho dù nó đã được thông qua tham khảo. Đó là định nghĩa chức năng mà quyết định cho dù nó đã được thông qua tham khảo. Và nhìn vào định nghĩa chức năng của phân loại hoặc chỉ tìm kiếm này, nó có các đối số theo tham chiếu. Vì vậy, bất kể cho dù bạn muốn nó để có nó bằng cách tham khảo, nó không mang nó theo tham chiếu. Nó thay đổi các mảng tại chỗ. Đây chỉ là không được phép. Bạn không được phép làm điều này. >> [Sinh viên] Oh, okay. [Bowden] Đây, sắp xếp là sẽ mất dòng bằng cách tham khảo và sửa đổi nó. Và một lần nữa, nếu bạn không muốn nó làm điều đó, bạn có thể tạo một bản sao của phân loại. Ngay cả trong trường hợp này, bản sao không phải là thực sự là một bản sao của dòng. Nó chỉ đến cùng một điều đầu tiên cho đến khi nó bị thay đổi, nơi nó đầu tiên sẽ được sửa đổi trong chức năng sắp xếp, , bởi vì nó copy-on-viết, bây giờ là một bản sao của bản sao sẽ được thực hiện. Bạn cũng có thể làm điều này. Đó là nơi khác mà bạn có thể nhìn thấy dấu "và". Bạn nhìn thấy nó trong vòng lặp foreach, bạn nhìn thấy nó trong tờ khai chức năng, và bạn nhìn thấy nó khi chỉ gán biến. Bây giờ chúng tôi đã thực hiện không có gì bằng cách làm này vì sao chép và dòng nghĩa là điều tương tự. Bạn có thể sử dụng đường dây và sao chép thay thế cho nhau. Bạn có thể làm unset (bản sao), và điều đó không có dòng unset, bạn chỉ cần mất bạn tham khảo để điều tương tự. Vì vậy, tính đến thời điểm này, tại dòng là cách duy nhất bạn có thể truy cập các dòng. Câu hỏi? Yeah. [Sinh viên] hoàn toàn tắt chủ đề, nhưng bạn không phải đóng PHP - >> Bạn không. Okay. [Bowden tôi sẽ đi xa như để nói nó là xấu thực hành để đóng chúng. Đó có thể là một cường điệu, đặc biệt là trong một kịch bản, nhưng chúng ta hãy xem những gì sẽ xảy ra nếu tôi làm điều này. Điều đó đã làm gì. Điều gì sẽ xảy ra nếu tôi muốn - [thở dài] Tôi cần phải vượt qua một đối số. Shoot. Tôi gọi nó là sai. Vì vậy, php.unique.php với một tham số. Bây giờ tôi thậm chí không cần điều này. Tôi sẽ vượt qua nó một đối số hợp lệ. Này in bất cứ điều gì đó là in ấn. Tôi đang in bản sao và bản sao không tồn tại. Vì vậy, dòng. Nó được in tất cả mọi thứ, và sau đó nhận thấy tất cả những điều này rác xuống đây, bởi vì trong bất cứ điều gì PHP đó là bên ngoài các thẻ PHP là chỉ cần đi để được in theo nghĩa đen. Đó là lý do tại sao HTML, nó rất tốt đẹp mà tôi có thể làm div blah, blah, blah lớp hoặc bất cứ điều gì, blah, blah, blah và sau đó làm một số mã PHP và sau đó làm div cuối. Và bây giờ in ấn này tôi nhận được div tốt đẹp của tôi lên hàng đầu, tất cả mọi thứ mà PHP in, div ở phía dưới. Tai hại khi một cái gì đó như thế này xảy ra, đó là khá phổ biến, chỉ một dòng mới đi lạc ở dưới cùng của tập tin. Bạn sẽ không nghĩ rằng nó sẽ là lớn của một thỏa thuận cho đến khi bạn xem xét thực tế rằng với trình duyệt Chuyển hướng công việc như thế nào hoặc về cơ bản làm việc bất kỳ tiêu đề, khi bạn thực hiện kết nối của bạn đến một trang web và nó sẽ gửi lại tất cả những tiêu đề và những thứ như đáp ứng 200 hoặc phản ứng chuyển hướng hoặc bất cứ điều gì, tiêu đề là chỉ có giá trị cho đến khi byte đầu tiên của dữ liệu được gửi. Bạn có thể gửi hàng ngàn lần, nhưng ngay sau khi byte đầu tiên của dữ liệu được gửi bạn không được để chuyển hướng một lần nữa. Nếu bạn có một dòng mới đi lạc ở dưới cùng của một tập tin và chúng ta hãy nói rằng bạn sử dụng chức năng này và sau đó bạn muốn - Hãy nói rằng đó là một tập tin đó là index.php và bạn require_once một cái gì đó - Tôi không thể nghĩ ra một ví dụ tốt về nó. Vấn đề xảy ra khi dòng này ở phía dưới được lặp lại. Bạn không muốn bất cứ điều gì đã được lặp lại. Mặc dù bạn không có ý định về bất cứ điều gì bị lặp lại, một cái gì đó đã được lặp lại và vì vậy bây giờ bạn không phải là nghĩa vụ để gửi tiêu đề nữa và bạn sẽ nhận được khiếu nại. Bạn chỉ cần không cần những thẻ đóng. Nếu bạn có kế hoạch làm một cái gì đó với HTML - và đó là hoàn toàn hợp lý để làm ở đây div bất cứ điều gì và sau đó vào thời điểm này, bạn có thể hoặc không có thể bao gồm họ. Nó không thực sự quan trọng. Nhưng trong kịch bản PHP nó hiếm hoi để đóng nó. Khi tất cả mọi thứ là PHP, hoàn toàn tất cả mọi thứ, bạn không thực sự cần phải đóng nó / bạn không nên đóng nó. Đối phó với chuỗi là đẹp hơn nhiều trong C. Trong PHP bạn có thể chỉ định một chuỗi với dấu nháy đơn hoặc đôi. Với báo giá duy nhất, bạn không thể sử dụng "thoát" trình tự. Liên tục trốn thoát, blah, blah, blah. Vì vậy, printf là rất hiếm trong PHP. Tôi đoán tôi sẽ sử dụng printf nếu tôi muốn làm một loại điều - trong pset 5 bạn đã sử dụng sprintf hoặc bất cứ điều gì. Nhưng bạn muốn làm 001.jpg và 002.jpg. Vì vậy, cho rằng loại điều mà tôi thực sự muốn để định dạng văn bản tôi sẽ sử dụng printf. Nhưng nếu không tôi sẽ chỉ sử dụng nối chuỗi. Tôi không bao giờ thực sự sử dụng printf. Chúng tôi chỉ phân biệt các chi tiết giữa dấu nháy đơn và dấu ngoặc kép. Sự khác biệt lớn nhất là báo giá duy nhất, nó sẽ được in theo nghĩa đen. Không có dữ liệu char trong PHP, không giống như C, do đó, điều này là tương đương với điều này. Họ là cả hai chuỗi. Và những điều tốt đẹp về chuỗi giá duy nhất là tôi có thể nói "hello thế giới!" blah, blah, blah, $ $ Wooo. Điều gì sẽ xảy ra khi tôi in này là nó sẽ in nó theo nghĩa đen. Hãy loại bỏ tất cả các công cụ của chúng tôi. Vì vậy, echo $ str1; Nó nghĩa là in tất cả những điều đó: dấu hiệu đồng đô la, dấu gạch chéo ngược n, mà bạn sẽ nghĩ rằng sẽ là dòng mới - tất cả những điều nó in theo nghĩa đen. Điều duy nhất bạn cần phải thoát khỏi dấu nháy đơn bởi vì nếu không, nó sẽ nghĩ rằng nó đóng dấu nháy đơn. Dấu ngoặc kép, hoàn toàn khác nhau. Chúng tôi đã thấy nổi bật cú pháp cluing chúng tôi với những gì sắp gặp rắc rối. php.unique. Không xác định biến: wooo bởi vì điều này được giải thích như là một biến được gọi là wooo. Dấu ngoặc kép cho phép bạn chèn các biến vào - Hãy nói rằng $ name = "Rob"; Vì vậy, echo "Xin chào, tên tôi là $ name!"; Nó nhận ra điều này như một biến. Khi tôi chạy đó - và tôi sẽ chèn một dòng mới - Hi, tôi tên là Rob! và chào thế giới! Điều này là bởi vì tôi không bao giờ loại bỏ việc in ấn của wooo trên. Có thêm 1 bước bạn có thể làm. $ Array = [1, 2, 3]; Điều gì sẽ xảy ra nếu tôi muốn in chỉ số đầu tiên của mảng? Bạn làm $ array [0]. Tô sáng cú pháp là một đầu mối. Này là những gì sẽ làm gì? php.unique. Xin chào, tên tôi là 1! mà không phải là những gì tôi muốn. Nổi bật cú pháp đã nói dối với tôi. Hãy thử một '-> 1,' b '-> 2. Đó là cách tôi sẽ phải viết nó. Bất ngờ nháy đơn (T_ENCAPSED blah, blah, blah, blah, blah). Ý tưởng là rằng nó không công nhận điều này như là một phần của mảng. Nó không nhận ra điều này như là một mảng lập chỉ mục của một lá thư. Bạn muốn làm điều đó được bao quanh bởi các dấu ngoặc nhọn, và bây giờ bất cứ điều gì là trong cú đúp xoăn sẽ được nội suy, đó là từ ngữ chúng tôi sử dụng cho kỳ diệu chèn các biến này vào đúng nơi. Bây giờ làm điều này, php.unique, Xin chào, tên tôi là 1! như mong đợi hay Hi, tôi tên là Rob! Một điều đó là loại tốt đẹp về báo giá duy nhất là - Có một số chi phí để nội suy. Nếu bạn sử dụng dấu ngoặc kép, thông dịch viên có để đi qua chuỗi này, đảm bảo rằng, "Ồ, đây là một biến Bây giờ tôi cần phải đi nhận được rằng biến và chèn nó ở đây." Thậm chí nếu bạn không sử dụng bất kỳ biến, không có gì bên trong các dấu ngoặc kép này cần được nội suy, nhưng nó vẫn sẽ chậm hơn bởi vì nó cần để đi qua các dấu ngoặc kép tìm kiếm những thứ cần được nội suy. Dấu ngoặc kép Vì vậy, duy nhất có thể là nhanh hơn một chút nếu không có gì cần phải được nội suy, và tôi có xu hướng thậm chí sử dụng một dấu ngoặc kép, "Hi, tên của tôi là '. $ Array ['a'] anyway. Đó sẽ là tương đương với những gì chúng ta có trước đây. Nhưng đó là một vấn đề ưu tiên. Nếu bạn đang sử dụng PHP, bạn có thể không quan tâm về sự khác biệt tốc độ. Không có đủ lý do chúng ra để bắt đầu với. Bất kỳ thức câu hỏi? Chúng tôi thực sự không thậm chí có được thông qua tất cả của nó, nhưng công cụ này là nhàm chán. Điều cuối cùng đó là loại tốt đẹp trong PHP là khi bạn đang làm việc với HTML, bạn sẽ sử dụng nó một chút, do đó, các phím tắt cú pháp tốt đẹp cho việc in ấn một biến. Mà không đặt PHP ở đây, điều này được gọi là thẻ ngắn. Chính thức như của PHP 5.4, điều này được phản đối. Bạn đang đề nghị để đưa php. Điều này vẫn còn được hỗ trợ, thẻ quá ngắn với <= vẫn hoàn toàn tốt đẹp. Đó là theo mặc định hỗ trợ, vì vậy bạn có thể sử dụng như bạn muốn, và họ đang khá thuận tiện. Bất kỳ câu hỏi nào? Được rồi. Stay sang trọng, San Diego. [Cười khúc khích] Bye. [Cười] [Vỗ tay] [cười] [CS50.TV]