Nov
16
2010

Thảo luận về bài tập 2

Tình hình chung: rất mừng là 100% các bạn đã làm được bài 2.1, tức là TỰ CÁC BẠN đã mày mò tải được bộ thông dịch PHP về và cho thông dịch được.

Ở dưới đây, tôi comment cho các bài 2.2, 2.3 và 2.4

chien minh <chien19842005@

Bạn Chiến có lẽ đã rành về lập trình nên viết code thực hành đưa cả vòng lặp vô nữa J Tuy nhiên, Chiến nói không hiểu lắm về bài 2.3, bạn viết “em đả thử biến đổi đuôi có phần mở rộng ko phải là PHP nhưng vào trình biên dịch php nó vẩn hiêu và biên dịch chính xác ,cho nên đuôi có phân mở rộng php là ko cần thiết với trình biên dịch php,(còn trình duyệt web thì nó đồi hỏi khác)”. Do bạn nói đến trình duyệt web nhưng hiện tại bài học chưa đề cập đến đó nên mình từ chối trả lời. Bạn nhận ra rằng file mã nguồn không nhất thiết phải đặt phần mở rộng .php là chính xác rồi.

Binh Thai <vuthbinh@

Bạn Thái đã thử đổi tên file thành bai1.txt (thay vì bai1.php), sau đó cho chạy thử và thấy kết quả không thay đổi, từ đó kết luận file mã nguồn không nhất thiết phải đặt mở rộng là .txt, như vậy là rất chính xác.

Bài 2.4, bạn nói “Lệnh echo đã được thực thi nhưng vì biến $hoten chưa được khởi tạo nên chỉ in ra Xin chao”, thực ra thì PHP khác một số ngôn ngữ khác ở chỗ bạn không cần khai báo và không cần khởi tạo biến (chúng ta sẽ tìm hiểu kỹ hơn ở các bài sau).

Liên Xô <lienxovn@

Cũng giống như bạn Thái, bạn Liên Xô đã thay đổi phần mở rộng của file mã nguồn để thử. Nhưng bạn Xô làm  hay hơn bạn Thái ở chỗ không những đổi phần mở rộng từ .php qua .txt mà còn “cả gan” đổi qua .exe và bạn chứng minh được rằng PHP vẫn thông dịch file bai1.exe của bạn.

Cá nhân tôi cho rằng những tìm tòi như vậy là cần thiết. Đặc biệt hữu ích cho việc tìm lỗi (debug) và bảo mật web sau này (phải luôn nghĩ tới nhiều tình huống “đặc biệt”, và đôi khi là hơi “quái chiêu”).

Tuy nhiên, bài 2.4 bạn làm chưa tốt, hoặc bạn đã hiểu sai câu hỏi, bạn trả lời thế này:

Bài học rút ra:

– Biết được thế nào là ngôn ngữ lập trình PHP.

– Biết được cách “thông dịch” file mã nguồn bằng PHP thông qua phần mềm

PHP.exe.

Minh Triet <lyminhtriet@

Bạn Triết còn “nhiệt tình” hơn bạn Xô vì đã thử cho PHP thông dịch cả file txt, rtf, doc, jpg, exe… Bạn thấy PHP dịch được một số đuôi nhưng khi bạn kết luận “các đuôi định dạng còn lại như doc, docx, jpg, html, xml nó không hiểu. Đặc biệt là file jpg và docx nó đưa ra một đống mã” làm tôi chột dạ và phải làm thử xem thế nào.

Kết quả cho thấy đổi tên file thành .doc hay .jpg thì PHP đều thông dịch cho mình hết. Vậy nên tôi đoán rằng cách bạn làm không phải là lấy 1 file mã nguồn sau đó đổi tên mà là bạn tự soạn thảo một file bằng notepad đặt tên là bai1.php, 1 file là bai1.txt, rồi bạn tự soạn bằng wordpad file bai1.rtf, tự soạn bằng winword file bai1.doc, rồi bạn copy ở đâu đó một file hình ảnh vô thư mục này và cho PHP thông dịch thử?

Không phải PHP không thông dịch được đâu bạn ạ. Kết quả bạn “nhận được một đống mã” chính là do PHP thông dịch và trả về cho bạn đấy. Tuy nhiên, file jpg không phải là file text, và bên trong nó (nếu bạn mở bằng notepad) cũng chỉ chứa một đống mã như vậy mà thôi.

Nếu coi bài thực hành này như một cuộc thí nghiệm thì bạn đã thí nghiệm sai dẫn đến kết luận sai. Nhưng tôi đánh giá rất cao các thí nghiệm đó của bạn. Tập được thói quen như vậy là rất tốt bạn ạ J

Bạn viết “Mình nghĩ php.exe có thể xử lý một file nào đó có dạng text thuần túy. Ở mức căn bản nhứt thì php.exe nó sẽ ghi ra toàn bộ nội dung của file text. Nếu file đó phi chuẩn (chuẩn của php) thì nó sẽ cố gắng hiểu và dịch ra theo kiểu của nó”. Thực ra, ở bài học tiếp theo bạn sẽ biết, khi đọc nội dung file mã nguồn, PHP đọc được thế nào sẽ hiển thị ra màn hình đúng y như thế, cho đến khi……… nó gặp được một cụm ký tự thông báo rằng bắt đầu đến đoạn mã lập trình (thường là cụm ký tự <? Hoặc <?php) khi này nó mới coi các ký tự đằng sau <? / <?php là mã lệnh và thực thi.

Tóm lại, chỉ có 2 trường hợp, hoặc là văn bản thuần tuý – PHP sẽ đọc sao thì ghi ra vậy, hoặc là mã lệnh – PHP sẽ thực thi và ghi ra kết quả sau khi thực thi. Không có chuyện cố gắng hiểu và dịch ra theo kiểu của nó đâu bạn ơi, hì hì J

Bài 2.4, bạn viết “Muôn sử dụng biến thì phải gán cho biến một giá trị nào đó”. Thực ra việc sử dụng biến trong PHP khá dễ dãi. Cứ ghi tên biến là được mà không cần khai báo. Tuy nhiên, nếu biến chưa được gán giá trị từ trước thì nó sẽ có giá trị rỗng.

“Để gán cho biến một giá trị, biến phải nằm giữa hai dấu phẩu trên (‘) (không biết gọidấu đó là dấu gì nên gọi đại :) )”. Dấu này gọi là nháy đơn bạn ạ. Và dấu nháy đơn dùng để gán giá trị cho biến có kiểu text. Còn biến kiểu số thì chúng ta không cần dấu nháy đơn đâu. Ví dụ:

$a = 13; $b = 15; $c = “Xin chao”;

“Trong php dấu (‘) hoàn toàn khác với dấu (“) nên phải chú ý khi sử dụng”, bạn nói đúng rồi, và chi tiết hơn thì sẽ là: PHP sẽ hiển thị giá trị của biến khi nó được đặt trong dấu nháy kép.

Ví dụ với khai báo $a, $b, $c ở trên, thì câu lệnh

echo ‘$a $b $c’;

Sẽ hiện ra màn hình dòng chữ $a $b $c

Trong khi echo “$a $b $c”;

Sẽ hiện ra màn hình dòng chữ 13 15 Xin chao

Nguyễn Trung Hiếu <trunghieu.nth@

Bạn gửi bài tập 1 quá trễ, hiện giờ là thời gian comment của bài tập 2, nên sẽ không nhận được comment.

Hữu Quý <quybuius@

“Các tệp tin chứa các đoạn mã PHP đều phải có phần mở rộng là .php Đó là quy ước của ngôn ngữ lập trình PHP tất cả những ai sử dụng đều phải tuân theo quy ước chung này. Nếu đặt tên file khác (abc.*) không phải là file .php thì khi chạy trình thông dịch sẽ không hiểu”. Và để chứng minh cho kết luận này, bạn đưa ra hình minh hoạ:

Tôi đã thử và thấy rằng câu báo lỗi Could not open input file … xuất hiện khi bạn nhập sai đường dẫn file mã nguồn. Cụ thể ở đây, tôi đoán rằng trong thư mục C:\hocphponline\ của bạn không tồn tại file 1.html ? Bạn thử kiểm tra lại nhé.

Nguyễn Quang Phước <babymilu.net@

Bạn có phát hiện rất đúng, chưa thấy các bạn ở trên đề cập tới : « Có thể khai báo biến mọi nơi trong chương trình, tên biến bắt đầu bằng ký tự $. Nếu khai báo biến mà không gán giá trị cho nó và sử dụng biến khi chưa khai báo thì cũng không báo lỗi khi sử dụng. PHP.EXE vẫn thông dịch bình thường”.

Phạm Đình Thanh Quang <cometome1991@

Bạn làm rất chi tiết (và trình bày rất đẹp :D). Bài của bạn có một chữ chưa chính xác, đó là câu “Chỉ có thể sử dụng nháy kép (“”) khi muốn xuất giá trị của biến ra màn hình”. Câu này không sai về “lý”, nhưng sai về “tình”. Viết như vậy mang tính áp đặt quá, sửa lại là “Sử dụng dấu nháy kép có thể xuất giá trị của biến đặt trong đó ra màn hình” thì nhẹ nhàng hơn.

Nếu tôi nhớ không nhầm thì bài trước bạn làm cũng rất tốt. Ở bài 2 này, tôi cũng quyết định đưa bài của bạn ra làm minh hoạ cho các bạn khác tham khảo. Mọi người truy cập vào đây nhé http://goo.gl/3aM0d

Itwill easy <itwilleasy@

Bạn luôn thể hiện là một người có khả năng trình bày rất khoa học. Chúc mừng bạn J

Tôi đoán cách làm của bạn giống giống như bạn Minh Triet <lyminhtriet@ dẫn tới kết luận sai giống bạn Triết. Bạn tham khảo comment của tôi cho bạn Triết.

Nguyen Dang Thai Huy <ndthaihuy87@

Về nội dung bài thì không có gì sai, nhưng kết luận rút ra hơi sơ sài (tham khảo kết luận của các bạn khác).

Về câu hỏi “ngoài lề” của bạn, tôi trả lời chung cho mọi người: lớp chúng ta là học online nên các bạn cứ học sao cho thoải mái. Việc nộp bài hoặc phải học đúng giờ là không cần thiết lắm. Tuy nhiên, nếu bạn theo học và làm bài đầy đủ thì tôi mới cam kết là bạn sẽ nắm vững kiến thức nền tảng và dễ dàng cho việc nâng cao sau này. Nếu bạn nộp bài trễ thì sẽ không được comment, nhưng ở các bài sau bạn vẫn có thể theo học tiếp, ko sao cả đâu.

Scott Lee <scott.lee318@

Bạn nói phải đặt tên file với phần mở rộng là .php, sau đó chứng minh giả sử ta tạo một file cũng với tên bai1 nhưng đuôi file lại là .txt (nội dung của file .php và txt này là như nhau). Khi mở file này bằng php.exe, ta vẫn chưa nhìn thấy được sự khác biệt. Nhưng khi mở bằng browser (sử dụng xampp để chạy php trên localhost), kết quả lại khác nhau”.

Đọc các comment và các phần chứng minh của mọi người, chắc bạn đã thấy kết luận của bạn là chưa chính xác.

Như trong bài học 2 tôi có nói, hãy nắm chắc rằng PHP là PHP, nó không liên quan gì đến trình duyệt. Tôi muốn các bạn khắc cốt ghi xương điều đó, vì tôi biết các bạn sẽ rất dễ bị lẫn lộn và khó mà hiểu được bản chất vấn đề khi đồng nhất công việc của trình thông dịch PHP với việc truy cập vào một trang PHP trên web. Tôi không giải thích sâu ở bài này (vì các bài tới sẽ đề cập tới). Nếu giải thích ngắn gọn, thì tôi nói thế này: khi bạn thông dịch bằng PHP thì chỉ có sự tham gia của PHP, còn khi bạn làm động tác “mở bằng browser” thì đã có sự tham gia của browser và webserver, và “thành phần hoá học” khác nhau thì kết quả thu được đương nhiên là sẽ khác nhau rồi bạn ạ.

Nguyễn Trung Hiếu <trunghieu.nth@

“Khi một chuỗi được đặt trong dấu ngoặc “ ” thì trình thông dịch sẽ hiểu rằng trong đó có thể chứa cả chuỗi và biến, còn khi 1 chuỗi được đặt trong dấu ngoặc ‘ ’ thì trình thông dịch hiểu rằng trong đó chỉ là chuỗi không có chứa biến”. Mình xin sửa lại thành “khi 1 chuỗi được đặt trong dấu ngoặc ‘ ’ thì trình thông dịch sẽ hiển thị toàn bộ nội dung chuỗi mà không quan tâm nó có chứa gì trong đó. Hay nói theo cách khác, khi gặp chuỗi được đặt trong dấu nháy kép, trình thông dịch sẽ phải mất công tìm xem trong chuỗi đó có thể có biến (và một số thành phần điều khiển khác mà bạn sẽ được học sau này) hay không, nếu có thì sẽ tính giá trị của nó và hiển thị ra màn hình. Các bạn hết sức chú ý điểm này nhé, vì nhờ nó, mà các bạn sẽ trả lời được ngay một câu hỏi liên quan đến vấn đề tối ưu hoá khi lập trình:

Xuất chuỗi trong dấu nháy đơn luôn có tốc độ nhanh hơn khi để trong dấu nháy kép, tại sao?

Hanh Nguyen <hanhnth612@

“Kết thúc mỗi câu trong 1 hàm bằng dấu “;” . “Echo” là 1 hàm trong php cho phép người dùng truyền đối số vào và xuất ra giá trị các đối số này”. Hạnh ơi, một là, dấu ; dùng để kết thúc câu lệnh cho dù nó có nằm trong hàm hay không. Hai là, echo là lệnh chứ không phải hàm. Hàm phải có dạng ten_ham(tham_số). Ví dụ print(‘xin chao”); hoặc strtoupper(‘xin chao’);

LEQUI CafeTinhban <cafetinhban_lequi@

Bạn không thực hiện đúng quy định gửi bài trong file word dưới dạng đính kèm mà paste thẳng vô email nên tôi “phạt” cho bạn nhớ, không comment bài này của bạn 😀

Tuy nhiên, bài của bạn không có gì sai đâu, chỉ hơi sơ sài.

Chou Le <chounble@ /  dtine yax <dtineyax@ / Việt <vietdht@

Đúng – sai giống các bài trên nên tôi không comment riêng đâu ạ (ai kêu gửi trễ hơn mấy bạn ở trên :D)

thtjgkgfitgi jfgntnj <doivonghia_neukhongem@

Bài 1 bạn gửi trễ nên không được comment

Bài 2, cụ thể 2.4 bạn nói « Mở notepad lên đọc file php đấy, nhưng ko hiểu gì hết. Đó là tại sao nguyên nhân mình tham gia lớp php online này », là bạn đã hiểu sai nội dung câu hỏi cũng như không thực hiện đúng hướng dẫn rồi. Thay vì mở lên đọc source code, bạn cần cho PHP thông dịch file đó để coi kết quả trả về nữa, sau đó thì rút ra kết luận J Bạn vô trễ nên cố gắng nhé.

Anh Nguyễn <darkprince1711@

Bạn không thực hiện đúng quy định gửi bài trong file word dưới dạng đính kèm mà paste thẳng vô email nên tôi “phạt” cho bạn nhớ, không comment bài này của bạn 😀

Tuy nhiên, bài của bạn không có gì sai đâu, chỉ hơi sơ sài.

Ho Tri Luan <luan.hotri@ / Uong DuyAnh <uongduyanh@ / Quốc Tưởng Cao <caoquoctuong@ / tinh pari <tinh_pari2000@

Đúng – sai giống các bài trên nên tôi không comment riêng đâu ạ (ai kêu gửi trễ hơn mấy bạn ở trên :D)

Công Khánh <khoaitayto@

Mặc dù bạn rất tha thiết nói rằng mong được hướng dẫn tận tình nhưng bài 1 bạn gửi bây giờ là trễ rồi. Bạn chịu khó đọc lại nội dung comment của tôi cho bài 1 của những người khác để rút ra kết luận nhé. Từ các bài sau mà bạn gửi đúng giơ, tôi hứa sẽ comment tận tình cho bạn.

Duy ‘s <duyism@

Bài rất good, đặc biệt là kết luận về việc PHP thông dịch từ trên xuống dưới, và cách mà bạn chứng minh điều đó. Share bài của Duy cho mọi người tham khảo: http://goo.gl/l7jxm

About the Author:

5 Comments + Add Comment

  • Em cảm ơn anh đã comment rất nhanh, chi tiết và nhiệt tình, nhưng em tên Bình chứ không phải tên Thái đâu ạ 😀

    • Ờ, tại thấy ghi Binh Thai. Sorry em hehe 😀

  • Lại 1 lần nữa không kịp nộp bài :(
    Cái source PHP của mình không dùng được :(

    • Đón xem bài 3 để fix lỗi nhé bạn

  • Càng đọc càng thấy mình chẳng bít gì cả… hoang mang quá :|:|

Leave a comment