header-object

Tối ưu khi viết code PHP - Phần 2

1. Đi tìm bản chất vấn đề

Có nhiều bạn, dù là mới học hay đã có kinh nghiệm thực tiễn vẫn hỏi tôi "PrintEcho khác nhau thế nào". Tôi "đớ" người ..., mà cũng thiệt vậy, trên lớp tôi hay nhắc đi nhắc lại cái chân lý: "Không bao giờ có 2 cái cùng tồn tại mà y xì nhau như đúc, dù là 2 giọt nước, chắc chắn nó phải có điểm khác nhau". Và tôi suýt sụp vào cái hố do chính mình đào ra.

PHP Không tồn tại cái gọi là "Command" mà nó chỉ tồn tại một hình thái duy nhất là "Function", bởi lẽ nó là Middle ware. Có bao giờ bạn thắc mắc trình biên dịch PHP được lập trình bằng ngôn ngữ gì không ? Download bản PHP for Linux mở ra là thấy ngay. Hay nói cách khác mọi hoạt động của PHP Environment đều nằm trong đó. Và bạn - PHP Developer nằm ở tầng trên, cuối cùng mới là người dùng tương tác ứng dụng mà bạn viết ra (End user - người dùng cuối).

Và cho dù bạn có tự gọi mình bằng bất kỳ cái tên mỹ miều nào đó như: PHP Developer, PHP Programmer, PHP Coder v.v... thì bạn thực ra cũng chỉ là một User không hơn không kém. Bạn không phải là người tạo ra thế giới mà là người phát triển thế giới từ cái nền PHP đã có sẵn.

2. Yêu "echo" nhưng tơ tưởng "print"

Và điều đó có nghĩa là, 2 em này khác nhau.
Thông thường chúng ta hay viết code dạng như sau:

  [code]
  $str1 = "Hello"; // Lời chào
  $str2 = "Metz"; // Chủ ngữ
  $str3 = "How are you?"; // Vị ngữ
  [/code]

Và ghép nó để xuất ra ngoài:

  [code]
  echo $str1.$str2.$str3;
  

Hoặc

print $str1.$str2.$str3;
[/code]

"Tín đồ C giáo" hay dùng print, và họ có thói quen dùng "print". Tuy nhiên, đây là hình thái "dễ dãi" của PHP, nó là một ngôn ngữ lãng tử thật sự.

Hãy nhớ lại: PHP Không tồn tại cái gọi là "Command" mà nó chỉ tồn tại một hình thái duy nhất là "Function"
Cho nên phải thực sự là:

[code]
echo($str1.$str2.$str3);
print($str1.$str2.$str3);
[/code]

Tuy nhiên, điều đáng nói ở đây, dấu "." nghĩa là nối chuỗi, và bạn vô tình tạo ra thêm 2 tác vụ nối chuỗi cho ứng dụng. Và chúng ta thử

[code]
echo $str1,$str2,$str3;
print $str1,$str2,$str3; // Lỗi
[/code]

Chúng ta có 2 vấn đề cần quan tâm:

  • echo nhanh hơn print, cho một tác vụ thông thường, chúng ta tốn 450ms cho echo và 550ms cho print.
  • echo tối ưu hơn print ở cơ chế xuất ra multiple times, hay nói cách khác là echo xuất ra nhiều đối số vào hàm, còn print thì không.

Tips: tôi chả hiểu "thánh" nào bày ra cái vụ "print" này trong PHP nữa. Hãy cứ chung thủy với echo các bạn nhé.

3. Thói quen lười nhác

Nháy đơn (') và nháy đôi (") là một mối tình khó hiểu, lung tung lang tang không bờ bến.

  [code]
  $a = 2;
  echo "Đây là $a"; // Đây là 2
  echo 'Đây là $a'; // Đây là $a
  echo 'Đây là '.$a; // Đây là 2
  [/code]
  

Thế ta dùng (") cho lành, dùng (') chi cho mắc công nối chuỗi nhỉ. Như bạn thấy, dấu (") có tác dụng nhốt chuỗi khi xuất ra hay khi thể hiện một giá trị, và đồng thời nó sẽ dò tìm bên trong nó để xác định đâu là biến để thay thế giá trị cho biến. Tôi không cần thiết phải nói đến sự tối ưu gì hay không, bạn chắc phải cảm nhận được cái nào thật sự nhanh hơn. Giống như:

  • Ra đầu ngõ mua cho tui ổ bánh mì, đói quá.
  • Ra đầu ngõ mua cho tui ổ bánh mì, sẵn tiện trên đường đi để ý chỗ nào bán cafe mua dùm một ly luôn.

02 công việc này, bạn sẽ tiến hành cái nào nhanh hơn. Và đây gọi là sự tồi tệ hơn khi quên luôn dấu nháy:

  [code]
  echo email;
  echo metzdown;
  [/code]
  

Ví dụ này sẽ xuất ra ngoài: emailmetzdown
Nó sẽ tuyệt vời và tôi hy vọng là trước đó bạn không có quên khi define một hằng:

define('email',' This email address is being protected from spambots. You need JavaScript enabled to view it. ');

Và thảm họa: phoenix@duc.commetdown;

Tips: Chung quy lại, chúng ta sẽ viết như thế này là tốt nhất:

  [code]
  echo 'Đây là '.$a; // Đây là 2
  [/code]

SAI RỒI, ĐỌC LẠI BÀI SỐ 1 ĐI NÀO. ỨNG DỤNG NGAY ĐI CHỨ, NÓ PHẢI THẾ NÀY:

  [code]
  echo 'Đây là ',$a; // Đây là 2
  [/code]
  -- 

Phần 1 http://danweb.vn/lap-trinh-website/php-mysql/315-toi-uu-khi-viet-code-php-phan-1.html

GV Huỳnh Công Đức

Bình luận  

 
0 #25 5snhadat Thứ 6-09-15 23:10
Cần tìm người tối ưu và quản trị site http://5snhadat.com/

Liên hệ: admin: 0989 810 87
Xin cảm ơn
Trích dẫn
 
 
0 #24 PHP Devil Thứ 5-08-14 20:00
Xin lỗi cho chửi 1 câu. Thằng viết bài này ngu vl :D
Trích dẫn
 
 
0 #23 Nguyển Minh Long Thứ 4-11-13 10:11
Theo mình nghĩ, bài viết này thật sự quá sáo rỗng, không cần thiết. Nếu được thì thấy Đức hãy làm một bài giống như thấy Giang, viết về cách sử dụng biến trong PHP. Bạn đi mổ xẻ 1 vấn đề hiển nhiên trong PHP, chẳng giúp ích gì cho developers hoặc những người đang theo học PHP
Tôi dùng echo hay print, sử dụng ' hoặc " thì cũng chẳng ảnh hưởng gì nhiều đến performance. Một dự án ngoài việc sử dụng PHP native, còn phải xem có thư viện nào không, framwork nào, query database the nào. Nếu thật sự có khả năng, thấy Đức hãy làm một bài viết gì đ1o cụ thể hơn như: cách tối ưu hoá, security cho các PHP framework như Yii, Zend, Laravel .... còn hơn là ngồi tụng lại nào là print, echo ....
Trích dẫn
 
 
+3 #22 Sand Thứ 5-10-13 19:33
Và theo em thì PHP có 2 bản là bản Build (bản này cho Window khác, cho Linux khác tuy nhiên đều đã được biên dịch thành mã nhị phân rồi) và bản Source (Cái này là nguyên project PHP viết bằng C trước khi đem đi biên dịch). Tác giả nói PHP for LInux cũng chứng tỏ tác giả còn lơ mơ hơn cả em :D :D
Trích dẫn
 
 
+1 #21 Sand Thứ 5-10-13 19:27
Theo em biết thì PHP là Thông Dịch chớ hổng có Biên Dịch chút nào, tác giả nên xem lại :eek: :eek: :eek:
Trích dẫn
 
 
0 #20 Huỳnh Công Đức thứ 7-03-13 17:02
Và mong các bạn bình tĩnh, đừng nói nặng với nhau làm gì. Mình viết bài này, hiển nhiên có trách nhiệm. Mời các bạn bình luận thoải mái , vì điều đó tốt cho tất cả :P

Cảm ơn tất cả
Trích dẫn
 
 
-6 #19 Huỳnh Công Đức thứ 7-03-13 16:51
echo is not actually a function (it is a language construct), so you are not required to use parentheses with it. echo (unlike some other language constructs) does not behave like a function, so it cannot always be used in the context of a function

Từ php.net là không sai nhưng theo mình, hãy cứ TẠM HIỂU nó là function đã. Còn như thế nào thì hẹn part kế, không có bạn mình cũng tự phản biện mình.

Xin cảm ơn các bạn. :D và bình tĩnh đón xem part kế, dự là sẽ có nhiều tình tiết cho các bạn bức xúc nữa.
Trích dẫn
 
 
+1 #18 Huỳnh Công Đức thứ 7-03-13 16:51
Đầu tiên xin cảm ơn bạn "người qua đường" và những bạn khác đã ủng hộ bài viết.
Mình rất hiểu cảm giác và suy nghĩ của các bạn khi đọc qua bài viết này. Và đó cũng là những phản ứng mà mình dự trù trước khi submit nội dung.
Bạn "người qua đường" có lập luận luận vững, sắc. Mình thừa nhận.
Nhưng hình bạn hơi hiểu lầm ý mình. Có những điều không thể diễn tả hết bằng chữ, và càng đào sâu, nó lại nảy sinh ra những rắc rối không cần thiết. Cái mình muốn nhấn mạnh ở đây là print & echo chứ không xoáy mạnh vào những vấn đề khác.

Hơn nữa, mình viết bài này dành cho đối tượng là những bạn mới tập làm quen với PHP không phải bỡ ngỡ bởi những điều gọi là "tại sao tùm lum hết vậy". Có đôi khi mình nên trả lời là "tại con chuột gặm mất mặt trăng" :sad: để giải thích lờ đi những điều không cần thiết.
Trích dẫn
 
 
0 #17 Anh hùng bàn phím??? thứ 7-03-13 16:35
Trích dẫn Robert Hoang:
Anh hùng bàn phím vừa thôi mấy bố,

Bạn ơi, giải thích hộ mình cụm từ "anh hùng bàn phím" chỗ này với bạn. Mình không hiểu. Một vấn đề tin học, bạn không dùng bàn phím để gõ bình luận thì làm cách nào bạn.
Mình thì ủng hộ tinh thần chia sẻ của tác giả, nhưng cũng ủng hộ bạn "người qua đường" vì có phản biện cho những gì tác giả viết. Mong rằng sau này tác giả viết bài sẽ chú ý hơn để không mắc các lỗi như vầy nữa.
Mình ủng hộ bạn phản biện vì bạn ấy nói cũng hợp lý, và nhờ những người cho ta thấy cái phản biện thì ta mới biết sai chỗ nào mà sửa. Chẳng phải ai cũng hay nói câu: "Ai cũng có chỗ sai, nhưng cái quan trọng nhất là biết sai mà sửa." Bạn phản biện chỉ chỗ sai thì mình cũng nên nhìn lại và học hỏi chứ nhỉ. Sao mọi người lại ném đá bạn ấy dữ thế không biết nhở :)
Trích dẫn
 
 
+2 #16 người qua đường thứ 7-03-13 14:39
php.net là nơi chính thống của PHP, điều gì trên đó điều đúng về PHP. Cải gì trên đó. Những điều mà tác giả nói, tôi điều minh chứng dựa vào trang php.net để có chứng cứ cụ thể chứ không phải tự tôi cho rằng tôi là giáo sư như bạn nghĩ.
Nếu một sự chia sẻ sai mà luôn được ủng hộ, tác giả sẽ không nhận ra mình bị sai và sẽ rất có khả năng chia sẻ tiếp những điều sai. Các bạn thích học hỏi những điều sai ah???
Tác giả chia sẻ, tôi cũng rất hoan nghênh tinh thần open của tác giả, và tôi viết comment lại để cho chúng ta nhìn thấy khía cạnh vấn đề không giống tác giả nói, không ý nói rằng tác giả không được chia sẻ.
Nếu chỉ đọc bài viết thầy nó sai rồi không nói gì bỏ đi, vậy tinh thần chia sẻ ở đâu, tôi không phải những người thuộc website này, nên chỉ dùng comment để chia sẻ những gì mình biết thôi.
Thanks all,
Trích dẫn
 

Thêm ý kiến


Security code
Làm mới


2

Facebook

Thống kê truy cập

Hiện có 393 khách đang truy cập
2546519