Nov
19
2010

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

PHP là trình thông dịch, nó không phải con người nên không có tư duy. Và khi thực hiện việc thông dịch, chính bản thân PHP nó cũng đã được lập trình để thông dịch theo những nguyên tắc, chu trình nhất định. Ở đây tôi muốn các bạn hiểu được nguyên tắc thông dịch của PHP và dò theo, nhằm tìm ra lỗi.

Việt vietdht

Ở câu hỏi thứ 2 em không hiểu ý anh mèo mun lắm. << Ý anh muốn hỏi ở đây là tại sao code như vậy thì lại bị báo lỗi. Em phải hình dung, PHP là trình thông dịch, nó không phải con người nên không có tư duy. Và khi thực hiện việc thông dịch, chính bản thân PHP nó cũng đã được lập trình để thông dịch theo những nguyên tắc, chu trình nhất định. Ở đây anh muốn em và các bạn hiểu được nguyên tắc thông dịch của PHP và dò theo, nhằm tìm ra lỗi.

Việc “không có tư duy” được ví dụ như thế này.

Đề bài: hãy lập trình tính tổng 2 số $a và $b. Nếu em viết echo ‘A + B = ‘, $a-$b; thì anh hoặc bất cứ ai khác nhìn vô sẽ thấy sai ngay, vì đề bài kêu tính cộng, em lại làm tính trừ! Nhưng khi cho PHP thông dịch, nó sẽ không báo lỗi, mặc dù chương trình này chắc chắn là… có lỗi, thậm chí lỗi rất nặng.

Đó là lỗi về logic.

Nhưng PHP chỉ phát hiện được lỗi về cú pháp mà thôi. Đây là điều mọi người cần nắm.

Vậy, khi thấy dòng thông báo lỗi của PHP, cái đầu tiên mình có thể trả lời là đoạn mã đã viết sai cú pháp. Nhưng vấn đề là sai như thế nào ?

Khi ra câu hỏi này, anh muốn mọi người đóng vai trò làm trình thông dịch và dịch thử (chạy bộ, tuy nhiên đây là việc chạy bộ đơn giản, chưa liên quan tính toán nên không cần giấy). Anh rất không muốn bạn nào đó trả lời đơn giản rằng « lỗi sai cú pháp » hay « xuất hiện ký tự < không mong muốn » (dịch từ tiếng Anh qua tiếng Việt).

Anh nhớ trong bài tập 2, có bạn đã kết luận rằng đặc điểm của PHP là thông dịch theo thứ tự từ trên xuống dưới. Vậy chúng ta hãy thử chạy bộ từ trên xuống dưới. Anh sẽ để dấu gạch chân làm « con nháy »

Con nháy thông dịch PHP nghĩ gì ? PHP làm gì ? Màn hình
Xin chao cac ban hoc vien. Bắt đầu thông dịch, không thấy cặp ký tự chỉ thị PHP Mode (tag mở) nên hiển thị ký tự này một cách bình thường Xuất ra màn hình chữ « X » X
Xin chao cac ban hoc vien. không thấy cặp ký tự chỉ thị PHP Mode (tag mở) nên hiển thị ký tự này một cách bình thường Xuất ra màn hình chữ « i » Xi
Xin chao cac ban hoc vien. không thấy cặp ký tự chỉ thị PHP Mode (tag mở) nên hiển thị ký tự này một cách bình thường Xuất ra màn hình chữ « n » Xin chao cac ban hoc vien
Xin chao cac ban hoc vien. không thấy cặp ký tự chỉ thị PHP Mode (tag mở) nên hiển thị ký tự này một cách bình thường Xuất ra màn hình chữ (dấu) « . » Xin chao cac ban hoc vien.
Xin chao cac ban hoc vien.

<?php

Phát hiện ký tự « đặc biệt », ký tự này có thể là ký tự bắt đầu chỉ thị chuyển qua PHP Mode nên TẠM THỜI không hiển thị nó ra màn hình Lưu giữ ký tự < vào bộ nhớ riêng của PHP, ra lệnh cho con trỏ thông dịch qua ký tự tiếp theo Xin chao cac ban hoc vien.

(ghi chú của anh : màn hình không thay đổi)

Tạm ngưng ở đây một chút. Anh giả sử đoạn mã của chúng ta không phải như ví dụ trên, mà là :

Xin chao cac ban hoc vien.

<!php

Thì điều gì sẽ xảy ra ? Hãy cùng nhìn vào bảng chạy bộ dưới đây

Con nháy thông dịch PHP nghĩ gì ? PHP làm gì ? Màn hình
Xin chao cac ban hoc vien. Bắt đầu thông dịch, không thấy cặp ký tự chỉ thị PHP Mode (tag mở) nên hiển thị ký tự này một cách bình thường Xuất ra màn hình chữ « X » X
Xin chao cac ban hoc vien. không thấy cặp ký tự chỉ thị PHP Mode (tag mở) nên hiển thị ký tự này một cách bình thường Xuất ra màn hình chữ « n » Xin chao cac ban hoc vien
Xin chao cac ban hoc vien. không thấy cặp ký tự chỉ thị PHP Mode (tag mở) nên hiển thị ký tự này một cách bình thường Xuất ra màn hình chữ (dấu) « . » Xin chao cac ban hoc vien.
Xin chao cac ban hoc vien.

<!php

Phát hiện ký tự « đặc biệt », ký tự này có thể là ký tự bắt đầu chỉ thị chuyển qua PHP Mode nên TẠM THỜI không hiển thị nó ra màn hình Lưu giữ ký tự < vào bộ nhớ riêng của PHP, ra lệnh cho con trỏ thông dịch qua ký tự tiếp theo Xin chao cac ban hoc vien.

(ghi chú của anh : màn hình không thay đổi)

Xin chao cac ban hoc vien.

<!php

Oh, ký tự này không phải là ký tự tiếp theo của chỉ thị chuyển qua PHP Mode nên nó và ký tự trước nó (ký tự <) không cấu thành tag mở PHP, vậy phải hiển thị ký tự vừa lưu giữ ở bộ nhớ tạm ra màn hình, đồng thời hiển thị luôn ký tự này ra màn hình Xuất ra màn hình ký tự < và ký tự !

Sau đó xoá bộ nhớ tạm.

Xin chao cac ban hoc vien.

<!

(ghi chú của anh : màn hình khi này xuất hiện liền một lúc 2 ký tự)

Tiếp tục quay trở lại với ví dụ trong bài tập

Xin chao cac ban hoc vien.

<?php

Phát hiện ký tự « đặc biệt », ký tự này có thể là ký tự bắt đầu chỉ thị chuyển qua PHP Mode nên TẠM THỜI không hiển thị nó ra màn hình Lưu giữ ký tự < vào bộ nhớ riêng của PHP, ra lệnh cho con trỏ thông dịch qua ký tự tiếp theo Xin chao cac ban hoc vien.

(ghi chú của anh : màn hình không thay đổi)

Xin chao cac ban hoc vien.

<?php

Phát hiện ký tự « đặc biệt », ký tự này cùng với ký tự trước đó đã tạo thành cặp ký tự chỉ thị – tag mở của PHP mode nên bắt đầu từ khi này sẽ kiểm tra cú pháp của PHP !!!

Ghi chú của anh : do phiên bản mà chúng ta đang sử dụng chấp nhận cả tag đầy đủ <?php và tag dạng rút gọn <? cho nên bắt đầu từ « đây » (bước này), PHP đã chính thức « turn-on » trình dò lỗi cú pháp PHP

Bắt đầu chuyển qua trình dõ lỗi cú pháp PHP, xoá hết bộ nhớ tạm Xin chao cac ban hoc vien.

(ghi chú của anh : màn hình không thay đổi)

Xin chao cac ban hoc vien.

<?php

Từ giờ sẽ rất … dài dòng nên mời theo dõi ở dưới

Vì theo cú pháp PHP (các bạn sẽ được học sau), ở « vị trí này », các ký tự tiếp theo khi hợp thành chỉ có thể rơi vào một trong cách trường hợp sau đây :

  • Tạo thành một lệnh, ví dụ <? echo …
  • Tạo thành một lời gọi hàm, ví dụ <? rand(100…
  • Tạo thành một yêu cầu thực hiện phép tính, ví dụ <?  $a=$a+1 ;
  • Tạo thành một yêu cầu thực hiện phép gán, ví dụ <?  $a=5;
  • v.v… và v.v…
  • Tạo thành chỉ thị đầy đủ của lời yêu cầu chuyển qua PHP Mode

Trình thông dịch sẽ kiểm tra từng ký tự, gom nhóm, kiểm tra… và nó thấy rằng cụm ký tự php nối ngay sau <? thoả mãn là gộp với <? để tạo thành chỉ thị đầy đủ của lời yêu cầu chuyển qua PHP Mode nên nó sẽ “bỏ qua” và “đi tiếp”.

Và lại một quá trình hàng chục bước để trình thông dịch chắc chắn rằng các ký tự tiếp theo là hợp thành câu lệnh echo cho đến khi nó gặp dấu ; thì nó biết là hết câu lệnh echo và chuyển qua kiểm tra ký tự tiếp theo.

Khi này, nó gặp ký tụ < (của tag mở PHP thứ 2 – ký hiệu open 2), trình thông dịch nó đã được lập trình rằng, ở “vị trí này” (kết thúc 1 câu lệnh), thì các ký tự tiếp theo khi ghép lại phải:

  • Tạo thành một lệnh, ví dụ for…
  • Tạo thành một lời gọi hàm, ví dụ sin(100…
  • Tạo thành một yêu cầu thực hiện phép tính, ví dụ $a=$a+1 ;
  • Tạo thành một yêu cầu thực hiện phép gán, ví dụ $a=5;
  • v.v… và v.v…
  • Tạo thành chỉ thị đầy đủ của lời yêu cầu kết thúc PHP Mode

Nhìn vô sẽ thấy, ở vị trí này, ký tự xuất hiện tiếp theo, hoặc phải là một CHỮ CÁI (a, b, c…) hoặc phải là một chữ số (ví dụ khi bạn viết <?php 1; 2; ?> thì PHP cũng sẽ không báo lỗi, dù nó… chẳng là và chẳng làm gì hết. Rất vô nghĩa, nhưng không sai!) hoặc nếu không phải chữ cái hay chữ số thì chỉ được phép là ký tự $ (trong trường hợp lập trình viên viết $a=$a+1; chẳng hạn), hoặc ký tự + (trong trường hợp lập trình viên viết ++$a; chẳng hạn), hoặc ký tự – (trong trường hợp lập trình viên viết –$a; chẳng hạn)…

Chỉ khi bạn học thật thông thạo PHP, học hết về các câu lệnh, cấu trúc, ngữ pháp… bạn mới hình dung được hết là tại vị trí đó, có thể xuất hiện những ký tự gì (hiện cá nhân tôi cũng không chắc về điều đó). Nhưng tôi chắc chắn một điều rằng ký tự < không được phép xuất hiện ở vị trí đó, vì nó không thể kết hợp với bất cứ một ký tự theo sau nào để trở thành câu lệnh hay hàm hay biến!

Và điều đó giải thích tại sao PHP báo lỗi rằng unexpected ‘<’ tức là PHP không kỳ vọng ký tự < tại vị trí đó, thế mà nó xuất hiện, vậy là lỗi rồi!

Tôi muốn các bạn hiểu một cách thấu đáo câu báo lỗi này như vậy. Nếu bạn nói “báo lỗi vì chưa có tag đóng mà đã lại có tag mở” hay “báo lỗi vì có 2 tag mở PHP liên tiếp” thì đó là học vẹt (mặc dù trong trường hợp này học vẹt không sao cả, tôi chỉ muốn nói rằng học vẹt tức là chưa hiểu tận cùng vấn đề thôi).

Khi biết rõ thực sự những gì đang “diễn ra” bên trong trình thông dịch như thế này, chắc nhiều bạn – những bạn mà đã biết sơ sơ về lập trình – sẽ “Oh” lên, và trả lời được câu hỏi “tại sao tên biến, hàm và câu lệnh lại không được dùng ký tự đặc biệt để đặt tên?”.

Hãy uống một ly café và Relax 😀 Vì tôi biết, một số bạn đang rất nhức đầu. Trong trường hợp chưa thể hiểu hết ngay lúc này, bạn cũng không cần cố. Vì trong suốt quá trình học, sẽ có nhiều ví dụ giúp bạn dần dần hiểu rõ ra hơn.

Bài 2, 3, 4 tôi xin phép không comment vì các bài đó chỉ tương tự như một bài tập viết, tập tô, giúp các bạn quen tay. Còn miễn sao sau khi làm xong các bạn chạy thử thấy không báo lỗi là OK rồi.

Bài 5 có 2 cách sửa, hoặc là

<?php echo ‘3 + 5 =’;echo 3+5;?>

Hoặc

<?php echo ‘3 + 5 =’, 3+5;?>

Bạn Việt đã làm đúng.

Bài 6, thực ra tôi chỉ muốn các bạn làm đơn giản thế này thôi (tôi copy từ bài giải của bạn Chu Văn Tài)

<?php

echo ‘


’; ?>

Với mong muốn gửi gắm một lời nhắn rằng chuỗi ký tự trong PHP có thể “trải” trên rất nhiều dòng! Đơn giản vậy thôi.

Tuy nhiên, có rất rất nhiều bạn đã tự đi tìm hiểu được thông tin về các cặp ký tự điều khiển và dùng \n (chỉ thị xuống hàng) và \t (chỉ thị nhẩy tab) để vẽ. Không sao cả. Điều đó chứng tỏ kiến thức các bạn rất tốt và tìm tòi giỏi.

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

Có nghĩa là đã xảy ra lỗi ở file E:\PHP\MaNguon\dace.txt tại dòng số 4 của file.

Sau khi phân tich lỗi thì trình thông dịch PHP thông báo đây là lỗi về cú pháp, có một dấu ‘<’ bị thừa trong mã nguồn.

Sở dĩ có thông báo lỗi là do lồng các thẻ <?php ?> vào nhau.

Tôi nghĩ với những comment dành cho bài gửi về sớm nhất – bài của bạn Việt, thì tất cả các bạn đều nắm được bản chất vấn đề rồi, nên chắc từ bài của bạn Phước trở về sau tôi không comment nhiều nữa. Tôi chỉ xin nhấn mạnh rằng khi làm bài, tôi không yêu cầu các bạn phải trình bày dài thoòng như phân tích ở trên của tôi đâu, miễn sao các bạn thực sự hiểu là OK.

Như bạn Phước nói có dấu < thừa thì không chính xác. Việc hiểu tại sao PHP báo lỗi như A, như B… khá quan trọng vì giúp các bạn debug chương trình nhanh hơn á. Nếu nói bị thừa dấu < vậy có thể suy ra rằng xoá dấu < đi thì chương trình hết lỗi? Tất nhiên là … không rùi 😀

Bài 6, bạn Phước làm như sau

<?php

//Theo em bai  nay co nhieu cach lam, day la cach thu nhat, cung la cach don gian nhat

//Nhung neu cho in ra nhieu hon 6 dong tren thi cach thu 2 lai ngan hon

echo “+————————+\n|\t\t\t |\n|\t\t\t |\n|\t\t\t |\n|\t\t\t |\n+————————+\n”;

?>

<?php

//Cach thu hai

$l1=”+————————+\n”;

$l2=”|\t\t\t |\n”;

echo “$l1”, “$l2″,”$l2″,”$l2″,”$l2″,”$l1”;

?>

Tức là bạn dùng ký tự điều khiển \n (xuống hàng) và \t nhảy tab. Bạn làm không sai, tôi chỉ xin lưu ý một chút thế này:

1) Hạn chế dùng dấu “ (nháy kép) vì dùng dấu nháy đơn để xuất chuỗi sẽ lẹ hơn (chúng ta đã nói về việc này khi nghiên cứu bài tập 2).

2) Trong quá trình viết code, bất cứ khi nào sử dụng được cách thức đơn giản nhất, hãy áp dụng.

3) Với cách làm thứ hai của bạn, bạn đã rất sáng tạo khi “nhìn thấy” các dong text giống nhau có thể gán vô một biến và xuất liên tiếp biến đó ra màn hình (thú thực là khi ra đề tôi cũng không nghĩ tới trường hợp này :D). Nhưng lại nói về tối ưu, cứ mỗi khi bạn khai báo biến, PHP phải làm rất nhiều thao tác và chuẩn bị bộ nhớ cho việc đó, vậy nên hãy tiết kiệm biến cho chương trình. Hãy tập thói quen SỐNG TIẾT KIÊM VÀ ĐƠN GIẢN ngay từ đầu.

Bài 7, bạn code thế này

<?php

echo “Xin chao. Toi la \”Nam cam\”, la em cua ‘Sau quyt’, la chau cua \”Bay saboche\”…Han hanh lam quen cac ban”;

?>

Là hoàn toàn đúng. Sẽ “tối ưu” hơn nếu bạn dùng nháy đơn cho chuỗi như sau:

<?php

echo ‘Xin chao. Toi la “Nam cam”, la em cua \’Sau quyt\’, la chau cua “Bay saboche”…Han hanh lam quen cac ban’ ;

?>

Như vậy chỉ phải dùng 2 dấu “xuyệt” \ thay vì 4 dấu như khi bạn dùng nháy kép. Và, lại một lần nữa, tôi nhắc lại về tối ưu hệ thống, hãy luôn luôn dùng nháy đơn thay vì nháy kép.

Khi ra bài tập này, tôi chưa đề cập tới lý thuyết về dữ liệu kiểu chuỗi, nên tôi không kỳ vọng các bạn biết cách sử dụng dấu \ như lời giải của bạn Việt và bạn Phước đâu (trong thực tế, hầu hết các bạn gửi bài giải về đều tự biết và giải như thế này một cách dễ dàng, hihi)

Do bài học của chúng ta nói rằng bạn có thể dùng echo để xuất liên tiếp nhiều kiểu dữ liệu cách nhau bởi dấu phẩy , nên lời giải mà tôi kỳ vọng là như sau :

<?php

echo ‘Xin chao. Toi la “Nam cam”, la em’, « cua ‘Sau quyt’, la chau », ‘ cua “Bay saboche”…Han hanh lam quen cac ban’ ;

?>

Tức là phân tách chuỗi ra thành 3 chuỗi con, chuỗi nào có dấu «  thì bạn bao nó lại bằng dấu nháy đơn ‘ (và ngược lại).

Tôi nhắc lại rằng đó chỉ là cách làm với giả thuyết rằng các bạn chỉ có kiến thức của bài 1 và bài 2.

Cao Minh <minh3d@

Dòng thông báo lỗi, nghĩa là bị lỗi về biểu thức. Em nghĩ lúc mở tag <?php thì tiếp theo sau nó phải là tag đóng ?>.

Nếu mà <?php ?> nằm trong 1 tag <?php ?> thì có lẽ trình biên dịch sẽ không hiểu đâu là code php, đâu là tag mở, đâu là tag đóng.

Đây là lỗi cú pháp sai bạn ạ, không phải lỗi biểu thức. Không nhất thiết tiếp theo sau <?php phải là tag đóng. Tôi lấy ví dụ, bạn gõ thử đoạn code này và nhờ PHP thông dịch xem có lỗi không nhé?

<?php // <?php

?>

Bài 3.5, bạn viết

Em nghĩ kết quả của đoạn code sẽ báo lỗi. Vì echo ‘3+5=’ là 1 dòng lệnh, echo 3+5 là 1 dòng lệnh, mà cuối dòng lệnh phải có dấu chấm phẩy(;) để kết thúc dòng lệnh. Nhưng trong đoạn code t thấy thì ở dòng echo ‘3+5=’ là dấu phẩy(,) nên sẽ xuất ra lỗi.

Để sửa lổi này, ta thay dấu phẩy thành dấu chấm phẩy là được.

<?php echo ‘3 + 5 =‘; echo 3+5; ?>

echo 3+5 là một dòng lệnh: ĐÚNG.

Mà cuối dòng lệnh phải có dấu chấm phẩy (;) để kết thúc dòng lệnh (ĐÚNG. Hiểu thế là đúng, tất nhiên ở các bài sau tôi sẽ chỉ cho các bạn thấy, kết thúc lệnh không nhất thiết phải có dấu ; và cũng giải thích tại sao ở trường hợp đặc biệt nào đó, dấu ; là không cần thiết).

Tuy nhiên câu « trong đoạn code t thấy thì ở dòng echo ‘3+5=’ là dấu phẩy(,) nên sẽ xuất ra lỗi” là hoàn toàn sai!

Ở bài lý thuyết, tôi có nói rõ là bạn có thể dùng dấu , để ghi dữ nhiều dữ liệu ra màn hình một lúc với lệnh echo nên lỗi không nằm ở dấu ,

Chính vì xác định lỗi nằm ở dấu , nên bạn mới đề nghị thay dấu , thành dấu ;

Tất nhiên khi này chương trình sẽ chạy đúng, nhưng giả sử mỗi lệnh echo cần 1/100 giây để thực thi thì chương trình của bạn mất 2/100 giây.

Còn nếu nhìn vấn đề theo cách “Vì echo có thể ghi nhiều dữ liệu, công thức ra màn hình và phân cách bởi dấu , nên lỗi phát sinh vì phía sau dấu , trong trường hợp này là chữ echo – là một câu lệnh chứ không phải dữ liệu hay biểu thức”, thì chúng ta có thể sửa bằng cách xoá chữ echo đi để vế còn lại là 3+5 là một biểu thức. Vậy kết quả sẽ là

<?php echo ‘3 + 5 =‘ , 3+5; ?>

Vẫn với giả sử mỗi lệnh echo thực hiện hết 1/100 giây thì chương trình này chỉ có 1 lệnh echo duy nhất nên thực thi trong vòng 1/100 giây, tăng tốc lên tới 50% so với cách dùng 2 lệnh echo.

Sau này được học về vòng lặp, các bạn càng thấy rõ lợi ích của việc này. Giả sử bạn đang thực hiện vòng lặp 1000 lần, và trong vòng lặp đó có câu lệnh echo kể trên, thì tức là bạn đã tăng tốc chương trình của bạn lên 1000*1/100 giây = 10 giây! Rất quý giá phải không ạ?

Bài 3.6, bạn không ghi mã nguồn mà chỉ chụp lại màn hình kết quả nên tôi không comment được.

Nhìn hình thì tôi thấy, có vẻ như bạn đang xài linux. Bạn có thể viết một bài hướng dẫn làm sao để sử dụng trình thông dịch PHP trên linux nhằm hướng dẫn một số bạn chưa biết không? Tôi thấy có nhiều bạn hỏi, nhưng tôi không xài linux nên không hướng dẫn cho các bạn đó được.

Bài 3.7 bạn làm đúng rồi ạ.

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

Bài 3.1 bạn ghi

Dòng báo lỗi ở hình trên nghĩa là câu lệnh php được thông dịch bị sai về lỗi cú pháp, PHP báo lỗi như vậy vì câu lệnh trên chúng ta đặt các thẻ đóng mở php lồng nhau. Tại sao lồng nhau không được? thì theo mình khi PHP thông dịch thì nó chỉ cho phép bật thẻ <?php 1 lần và khi nào thẻ này được tắt đi ?> thì nó mới cho phép bật thẻ <?php tiếp theo.

Có một ý theo tôi rất hay, đó là bạn tự đặt câu hỏi “tại sao lồng nhau không được?”. Tôi rất mong trong quá trình học, các bạn hãy tự đặt ra các câu hỏi như vậy càng nhiều càng tốt.

Bạn Hiếu viết chỉ cho phép bật thẻ một lần, giống như bài của bạn Cao Minh, tôi lấy ví dụ về việc tôi chèn 2 thẻ mở liên tiếp mà PHP không báo lỗi

<?php // <?php

?>

Tại sao không báo lỗi? Vì thực chất ở trên tôi chèn thẻ mở chứ không “bật” PHP Mode. Vì dấu // trong PHP là dấu ghi chú, tất cả những gì theo sau dấu đó trên cùng một dòng là hoàn toàn vô nghĩa, PHP sẽ không quan tâm! Vì vậy, việc ghi 2 thẻ mở liên tiếp thực chất cuối cùng chỉ có 1 thẻ có giá trị mà thôi.

Bài 3.5 bạn Hiếu đã làm đúng như tôi kỳ vọng

<?php echo ‘3 + 5 = ‘, 3+5; ?>

Nhưng tôi không hiểu tại sao bạn làm thế 😀 Dù sao cũng chúc mừng bạn nhé.

Bài 3.7 của bạn Hiếu và kết quả khi chạy chương trình như sau

Tôi không biết vô tình hay cố ý mà kết thúc lệnh echo của bạn không có dấu ;

Và như tôi đã comment trong bài của bạn Cao Minh, ở một số vị trí nhất định, dấu ; không cần có mặt khi kết thúc câu lệnh.

Vậy giờ các bạn thử nghĩ xem tại sao ở vị trí này, “thiếu” dấu ; mà PHP không báo lỗi? Tại sao có nơi thì kết thúc lệnh cần ; có nơi lại không? Riêng bạn Hiếu, vui lòng PM hoặc email cho tôi vì sao bạn làm thế, không trả lời public nhé.

Chu Văn Tài <chuvantai@

Bạn Tài là một trường hợp đặc biệt, phải nói bạn rất… tài 😀 Khi chưa chính thức comment cho các bạn, tôi cũng đã đọc sơ qua các bài tập gửi về, và ngay khi đọc bài của bạn Tài, tôi liền reply email và nói “Very good”.

Lời giải cho bài 3.1 của bạn ấy thế này

Lỗi ở hình trên gọi là lỗi cú pháp. Ta cũng có thể hiểu lỗi này cũng giống như lỗi chính tả trong văn bản vậy.

Để thực thi các câu lệnh trong mã nguồn, PHP yêu cầu mã phải nhập theo những quy tắc cú pháp nhất định. Có nghĩa là phải có quy tắc khai báo biến, đặt tên biến, khai báo hàm,…

Ở lỗi này ta có thể giải thích như sau: PHP bắt đầu thực thi các câu lệnh khi gặp tag mở <?php cho đến khi gặp tag  đóng ?>. Như vậy, ở đoạn code này, tag <?php được xem là một câu lệnh hoặc một dòng khai báo. Mà trong ngôn ngữ PHP chẳng có quy định khai báo hay lệnh nào bắt đầu bởi dấu < cả. Vậy lúc này PHP sẽ báo lỗi cú pháp. Thực chất là lỗi không hiểu ký tự <

Chỗ highlight màu vàng là chỗ tôi tự highlight vô. Và dòng đó là dòng mà tôi muốn nhìn thấy trong bài tập của mọi người. Các bạn không cần “chạy bộ” dài dòng như comment đầu tiên của tôi, chỉ cần các bạn hiểu như thế này là quá tốt.

Tiếp tục đến bài 3.5, bạn Tài cũng trả lời hoàn toàn đúng và xuất sắc. Hoan hô bạn Tài.

Các bạn khác có thể tham khảo bài giải của bạn Tài tại đây http://goo.gl/i36iy

Huu Long Nguyen <moonlightfanciful@

Tôi không thấy bài 31 và 37 của bạn nên không comment được. Các bài khác thì đã comment ở trên rồi.

It Chidung <gakon.it_89@

Bài 3.7, ngoài lời giải, bạn còn phân tích và phân tích hoàn toàn đúng. Hoan hô bạn ạ J

Bài 3.7 Hãy dùng duy nhất 1 câu lệnh echo để ghi ra màn hình dòng chữ

Xin chao. Toi la “Nam cam”, la em cua ‘Sau quyt’, la chau cua “Bay saboche”… Han hanh lam quen cac ban

<?php

echo ‘Xin chao. Toi la “Nam cam”, la em cua \’Sau quyt\’, la chau cua “Bay saboche” Han hanh lam quen cac ban’;

?>

Dấu \ để trình thông dịch PHP hiểu được ký tự đi theo sau nó là tự đặc biệt. Vì nếu không có dấu đó thì khi trình thông dịch PHP dịch đến chỗ la em cua ’ thì sẽ kết thúc câu lệnh vì đã đủ 2 nháy đơn đóng và mở. Sau nháy đơn tại vị trí này la em cua ’ thì trình thông dịch sẽ yêu cầu dấu chấm phẩy để kết thúc câu lệnh echo. Nhưng câu lệnh trên lại là 1 chuỗi ký tự Sau quyt’, la chau cua…như vậy chắc chắn dẫn đến sai.

Nguyen Dang Thai Huy <ndthaihuy87@

Bài 3.7, bạn Huy làm gần giống như tôi kỳ vọng, đó là đã tách các dấu nháy đơn và nháy kép ra. Ở đâu có nháy đơn thì bạn bao bằng nháy kép, ở đâu có nháy kép thì bạn bao bằng nháy đơn. Sau đó bạn dùng dấu . để nối chuỗi (tôi thì mong bạn dùng dấu , để ghi nhiều lần dữ liệu ra màn hình thôi chứ không cần thiết nối chuỗi).

<?php echo ‘Xin chao Toi la’.’“’.’Nam cam’.’”’.’la em cua’.’‘’.’Sau quyt’.’’’.’la chau cua’.’“’.’Bay saboche’.’”’.’… Han hanh lam quen cac ban’;?>

Nhưng tôi vẫn đánh giá cao bài của bạn, vì bạn đã biết vận dụng hoàn toàn những kiến thức đã học để làm bài mà không cần thêm kiến thức phụ trợ. Pls keep up your good job!

Quốc Tưởng Cao <caoquoctuong@

Bạn Tưởng có một số câu hỏi tại đây http://goo.gl/G0jSv

Tôi đề nghị tất cả các bạn đã từng được khen, đã từng được tôi đưa bài lên làm ví dụ trong các bài 1, 2, 3 thì có trách nhiệm vô trả lời cho bạn Tưởng phụ thôi 😀

Phạm Đình Thanh Quang <cometome1991@

Hai bài trước Quang làm tốt, nhưng bài này Quang làm chưa tốt. Cụ thể thế nào thì em đọc các comment trên của anh sẽ biết sai đúng ở đâu. Riêng bài 3.6

Cái này là em tự sáng tác ra nhé. Anh đâu có yêu cầu các bạn vẽ hình này 😀

Các bạn khác: toàn bộ các bài còn lại thì sai hay đúng đều rơi vào những trường hợp tôi đã comment. Các bạn đọc và rút kinh nghiệm nhé.

5 Comments + Add Comment

  • càm ơn anh mun nhiều lắm anh rất nhiệt tình với anh em,em lúc nào củng theo dổi các bài trên fakebook của anh,em ko có làm bài tập 3 này nhưng em có đọc và có gắn hiểu,
    em đang tìm việc làm nào ổn định theo tiếp học với các bạn , em vẩn theo dổi thường xuyên các bài tập của anh đưa ra, em ho vọng anh mèo mun sẻ giúp em và các bạn cho hết khóa học này !

    • You are welcome

  • Cái source PHP của em vẫn ko chạy được, nó vẫn báo lỗi :( em nghĩ là do win lỗi :(
    Tối em cài lại win xem sao 😀

  • Đây là bái viết hướng dẫn Cài đặt và sử dùng php trên Linux http://goo.gl/uCEGl

  • THầy dạy hay và nhiệt tình quá…., xin hỏi thầy là nếu em làm bài tập từ 1 – 7 và muốn làm học sinh ” dự bị ” thì thầy có thể bổ sung vào danh sách lớp khóa 1 được không ạ?

Leave a comment