การใช้ while loop แทน foreach

ในการทำงานกับ array ถ้าในบางปัญหาเราอาจพบว่าการเขียนด้วย while loop จะง่ายกว่าการเขียน foreach(แน่นอนการทำงานแบบวน loop 99% ถ้าเขียนด้วย foreach จะเหมาะสมกว่า) แต่ในบางกรณีเราอาจไม่อยากใช้ foreach ในการทำงานแล้ว loop อะไรล่ะที่จะมาตอบโจทย์ได้ดีที่สุด

ถ้าทำงานกับ index array สิ่งที่เราเลือกต้องเป็น for อย่างไม่ต้องสงสัย แต่ถ้าต้องการทำงานกับ Associated Array(เป็น array ที่มี key เป็นอะไรก็ได้ตามใจฉัน) ล่ะ จะทำยังไงดีเพราะไม่มี key 0,1,2,… ให้ใช้งานแบบ Indexed Array คราวนี้จะแก้โจทย์นี้ยังไงกันดี

ก่อนอื่นมาวิเคราะห์กันก่อนว่า foreach มีข้อดีอะไรบ้าง

  1. ไม่ต้องระบุรอบที่ชัดเจนเหมือนกับ for loop
  2. ในแต่ละรอบจะสามารถเข้าถึง Value และ Key ของ Array นั้นๆได้

ดังนั้น ถ้าวิเคราะห์จากข้อที่ 1 เราคงต้องเลือก loop ที่ไม่จำเป็นต้องระบุรอบให้ชัดเจนอย่าง while หรือ do-while มาใช้ และข้อที่ 2 เราก็คงจะต้องมี function ที่สามารถดึง Value และ Key ของสมาชิกในรอบ Array ปัจจุบันได้ ซึ่งคำตอบของชื่อ function ที่ว่านี้ก็คือ current และ key

  • current() จะเป็นการเอาสมาชิกตัวปัจจุบันเอามาแสดงผล
  • key() จะเป็นการเอา key ของสมาชิกตัวปัจจุบันออกมาแสดงผล
  • next() จะเป็น function สำหรับเลื่อน pointer ไปยังสมาชิกตัวถัดไป

ดังนั้น code ที่ได้หน้าตาจะออกมาเป็นแบบนี้

ในแต่ละรอบจะทำการดึงค่า current(อย่าลืมใส่ parameter ด้วยนะ) ออกมา ถ้า current ยังคงมีค่าอยู่ก็จะวน loop ไปเรื่อยๆ เลยต้องมี next($arr) เพื่อเลื่อนไปยังสมาชิกตัวถัดไป

ที่สำคัญย้ำกันอีกครั้งว่า ในทุกๆ function ไม่ว่าจะเป็น current, key หรือ next ต้องใส่ parameter ที่เป็น Array เข้าไปด้วยหวังว่าคงจะได้เอาเทคนิคนี้ไปลองใช้กันบ้างจะได้เข้าใจการทำงานของ foreach กันมากขึ้น

ทำความรู้จักกับ interface ที่ชื่อว่า iterator

ทำไมต้องมี interface iterator ก็เหมือนกับบทความก่อนหน้านี้ที่เราต้องการให้ object ที่เราสร้างขึ้นสามารถใช้งานฟังก์ชั่น count ได้เหมือนกับ array เราจะใช้ interface ที่ชื่อว่า countable ในตอนนี้เราก็เลยอยากจะให้ object ที่เราสร้างขึ้นสามารถใช้งาน foreach loop ดูบ้าง

ทบทวนเรื่อง interface กันก่อน ในการเขียน PHP แบบ Object-Oriented หรือ OOP เราจำเป็นต้องรู้จักการใช้งาน interface เพราะจุดประสงค์ของ interface คือการเป็นจุดเชื่อมต่อของ code 2 ส่วนถ้าเราไม่มี interface เข้ามาคั่นกลางเราจะไม่สามารถแยก 2 ส่วนนี้ออกจากกันได้ เช่นการที่เราใช้ interface iterator จะเป็นจุดเชื่อมต่อของ code 2 ส่วนคือคำสั่ง foreach(ซึ่งเป็นของ PHP เอง) และ object ของเรา ดังนั้นจะเห็นว่าถ้าเราอยากได้ object ตัวไหนทำงานกับ foreach ได้ เราก็แค่ implement interface ที่ชื่อว่า iterator แค่นี้เอง แล้ว iterator จะบอกเราเองว่า เราต้อง implement method หรือ function อะไรบ้าง (เราสามารถเอา object ของเราไปทำงานกับ foreach ได้โดยที่ไม่ต้องเข้าไปแก้ไข code ของ PHP นี่คือประโยชน์ของ interface)

คราวนี้ก็มาเริ่มต้นใช้งาน interface iterator โดยเริ่มจาก

ต่อจากนั้นให้ implement method 5 method นี้

เพราะฉะนั้นในรอบแรกจะเข้า

  • rewind
  • valid
  • current (ถ้ามีข้อมูล)
  • key(ถ้ามีข้อมูล)

หลังจากนั้นรอบอื่นๆ ก็จะเป็น

  • next
  • valid
  • current
  • key

จนรอบสุดท้ายก็จะทำงานแค่ 2 method เท่านั้น

  • next
  • valid

สุดท้ายเราก็สามารถใช้ obj ที่เกิดจาก Customer Class กับ foreach ได้แบบนี้

Posted in PHP

จับคู่ Eloquent กับ Codeigniter

ถ้าพูดถึง Framework ที่ดังที่สุดในชั่วโมงนี้น่าจะเป็น Laravel แต่หัวใจหลักที่ทำให้ Laravel เป็นที่ได้รับความนิยมอย่างล้นหลาม ส่วนหนึ่งก็เพราะมี ORM(Object Relational Mapping) อย่าง Eloquent แต่ตัว Eloquent เองก็ไม่ได้จำกัดตัวเองอยู่กับ Coeigniter เท่านั้นเราสามารถเอา Eloquent ไปใช้งานโดยที่ไม่ต้องมี Framework เลยก็ได้ ลองอ่านดูได้จากบทความก่อนหน้านี้

ในบทความนี้เราจะเอาตัว Eloquent นี้มาใช้ใน framework ที่มีขนาดเล็กอย่าง Codeigniter กันดูบ้าง โดยเราจะต้องทำการติดตั้ง Eloquent เข้าไปใน Codeigniter ตามขั้นตอนต่อไปนี้

  1. download Eloquent ผ่านทาง composer ด้วยคำสั่ง

    ชื่อ package ของ Eloquent คือ illuminate/database ซึ่ง Core ของ Laravel จะมีชื่อเดียวกันคือ illuminate
  2. ทำการ require ไฟล์ autoload.php เข้ามา โดยเปิดไฟล์ index.php ใน folder ของ CodeIgniter

    ป้องกันการ Error แนะนำว่าวางไว้ก่อน บรรทัดที่ require ‘core/CodeIgniter.php’ เพื่อความชัวร์
  3. ทำการ load ตัว Eloquent ขึ้นมาใช้งานโดยไปที่ไฟล์ database.php(ที่เลือก database.php เพราะถ้าจะติดต่อ database ยังไงก็ต้อง load ไฟล์นี้ขึ้นมาทำงาน และไฟล์นี้ก็เกี่ยวข้องกับการติดต่อ database โดยตรง)

หลังจากนั้นเราจะสามารถเรียกใช้งาน Query Builder ผ่านทาง DB::(ตามด้วยชื่อ method ที่ต้องการ)
แต่ถ้าต้องการสร้าง Model(ใช้งานแบบ ORM) เราต้องให้ model ของเรา extend จาก Illuminate\Database\Eloquent\Model แทนที่จะเป็น CI_Model แบบของเดิม หลังจากนั้นเราจะสามารถเรียกใช้งานได้โดยใช้ (ชื่อ Model)::(ตามด้วยชื่อ method ที่ต้องการ)

ในรายละเอียดของ Eloquent สามารถเข้าไปอ่านได้ที่ document ของ Laravel หวังว่าคงจะถูกใจสาวก Codeigniter กันนะครับ

การติดตั้ง Phalcon บน XAMPP

ในบทความนี้เราจะมาแนะนำการติดตั้ง Phalcon สำหรับคนที่ใช้งาน XAMPP ซึ่งการติดตั้ง Phalcon จะไม่เหมือนกับ Framework ตัวอื่นๆ เนื่องจาก Phalcon จะใช้ implement ด้วย C แล้วทำเป็น extension สำหรับ PHP ดังนั้นเราต้องทำตามขั้นตอนดังนี้

  1. ทำการ Clone sourcecode มาจาก github ด้วย command ด้านล่างนี้ (ถ้าไม่มี git ต้องไปติดตั้ง git ก่อนนะครับ)
  2. หลังจากได้ source code มาแล้วเราต้องทำการ compile source code  ที่ได้ด้วยคำสั่งนี้
  3. เมื่อทำการติดตั้งเรียบร้อยเราจะได้ไฟล์ extension สำหรับใช้งานใน apache มาแล้วเรียบร้อย หลังจากนั้นเราแค่ทำการ incude extension ตัวนี้โดยเข้าไปแก้ไฟล์ php.ini ซึ่งถ้าเป็น XAMPP เราเลือกที่ Configuration จะมี PHP.ini ให้เลือก หรือจะเข้าไป edit ที่ไฟล์โดยตรงก็ได้ ส่วน path ของ php.ini ก็จะขึ้นแยู่กับ OS ที่ใช้งาน(ลอง find หาดูก็ได้ครับ) เมื่อเปิดไฟล์ขึ้นมาได้แล้วให้ทำการเพิ่มบรรทัดนี้เข้าไปใน PHP.ini(วางไว้ล่างสุดก็ได้)
  4. ขั้นตอนสุดท้าย ทำการ restart web server แล้วเข้าไปตรวจสอบโดยเข้า run คำสั่ง

    หรือ

    แล้วลองตรวจสอบดูว่า มีคำว่า phalcon อยู่ในผลลัพธ์หรือไม่ ถ้ามีแสดงว่าการติดตั้งเสร็จสมบูรณ์

PHP Micro framework คืออะไร

หลังๆมี framework ใหม่ๆออกมาแสดงตัวกันเยอะมาก และก็บอกว่าตัวเองเป็น Micro framework แม้แต่ Symfony ใน Version ใหม่ก็ไม่ได้จำกัดตัวเองอยู่แค่ Enterprise เพียงอย่างเดียวยังสามารถทำให้ตัวเองเป็น Micro framework ได้ แถมยังแนะนำให้คนอื่นมาพัฒนา framework บน Core ของ Symfony อีกด้วย

แล้ว Micro framework คืออะไร จากชื่อก็คงนจะพอเดาได้ไม่ยากว่า เป็น framework ที่มีขนาดเล็ก แล้วทำไมต้องมี Micro framework ในภาษาอื่นๆไม่เห็นจะมี Micro framework กันเลย สงสัย PHP เป็นภาษาที่มี Framework เยอะที่สุดในโลกมั้ง เลยทำให้คนทำแข่งกันทำ framework ออกมากันเยอะแยะเต็มไปหมด จุดขายที่สำคัญคือทางเลือกที่ไม่ใช่ Framework แบบ Enterprise อย่างเดียว ถ้าต้องการ MVC framework แต่ไม่ต้องการให้มี folders เป็นสิบๆ folders(อันนี้เวอร์ไป) อยากได้ Project เล็กๆ แบบมีแค่ไม่กี่ folder ตัว Micro framework จะมาตอบโจทย์นี้ได้ดีที่สุด

สรุปแล้วถ้าอยากได้ MVC ที่มี folder น้อย มี library ให้ใช้งานเท่าที่จำเป็น ถ้าอยากได้ library ตัวไหน เพิ่มก็ไปติดตั้งเพิ่มเอาเอง เรียกได้ว่าถ้าเป็นเสื้อนี่เรียกว่าแบบเข้ารูปพอดีเป๊ะ

แล้วจะเลือก Micro framework ตัวไหนดี Micro framework มีให้เลือกมากมาย ตัวที่ค่อนข้างมีชื่อเสียงและได้รับความนิยมน่าจะเป็น Slim, Silex, Lumen, Phalcon, Symfony, F3(Fat-Free Framework) เรามาดูว่าแต่ละตัวจะมีจุดเด่นยังไงบ้าง

Slim

ถ้าพูดถึง Micro framework นี่ต้องนึกถึง Slim เป็นตัวแรกเพราะเป็นตัวที่ Performance ดีมากเคยเป็นตัวที่ Performance ดีที่สุด ข้อเสียคือเริ่มต้น Project แบบไม่มีอะไรให้เลยจริงๆ มัน minimal เกินไปสำหรับคนที่เริ่มเขียน MVC ไม่เหมาะสำหรับมือใหม่

Silex

Silex เป็นของ Sensiolabs(ทีมพัฒนา Symfony) แล้วก็แน่นอนว่า Silex พัฒนาบน Symfony2 Components ดังนั้นถ้าคนที่คุ้นเคยกับ Symfony อยู่แล้วการดึงเอา Component ของ Symfony มาใช้ใน Silex จะไม่ใช่เรื่องยาก ข้อดีคือมี Components ให้เลือกเยอะ แต่ข้อเสียคือ Performance จะไม่ค่อยดีเท่าไหร่

Lumen

ตัวนี้เป็นทางฝั่งของ Laravel ส่งเข้าประกวด ใครที่คุ้นเคยกับการใช้งาน Laravel การใช้ Lumen จะเป็นเรื่องที่ง่ายมากๆ และข้อดีที่เจ๋งมากของ Lumen คือเราสามารถที่จะ upgrade ขึ้นไปใช้ Laravel ได้ อีกอย่างนึงก็คือ performance ดีที่สุดในกลุ่มที่เขียนด้วย PHP ด้วยกัน (ไม่นับ Phalcon เพราะเขียนขึ้นมาด้วย C) ข้อเสียคือ เริ่มต้นมามี Folder ให้เหมือนกับ Laravel เลยซึ่งอาจดูไม่ค่อยเหมือน Micro framework ซักเท่าไหร่

Fat-Free Framework(F3)

เป็นน้องใหม่ที่เริ่มมีชื่อเสียงมากขึ้นเรื่อยๆ เพราะ F3 มี function ให้ใช้งานเยอะกว่าตัวอื่นๆ แต่ข้อเสียคือตัว ORM จะยังไม่ Support การ Join ซึ่งเป็นปัญหาสำคัญที่ทีมพัฒนายังคงต้องแก้ปัญหากันต่อไป

Phalcon

อย่างที่เรารู้กันอยู่แล้วว่าจุดเด่นของ Phalcon อยู่ที่ Performance แต่ข้อเสียของ Phalcon คือเมื่อมีการ upgrade PHP ก็จะต้องรอให้ทีมพัฒนาทำการ upgrade Phalcon ให้เข้ากับ PHP version ใหม่ๆ อาจไม่ค่อยสะดวกสำหรับยเรื่องของการ upgrade อย่างในตอนนี้คงต้องรอว่า Phalcon จะออก version ใหม่ที่ support PHP 7 เมื่อไหร่ ติดตามได้ที่นี่

ลองศึกษาทั้งข้อดีและข้อเสียของ Framework ต่างๆ แล้วเลือกให้เหมาะกับงานและทีมงานของเรา เพราะแต่ละตัวก็ต่างมีข้อดีและข้อเสียที่แตกต่างกันออกไป หวังว่าคงจะเป็นประโยชน์สำหรับคนที่กำลังเลือกใช้งาน Framework กันอยู่นะครับ

โปรแกรมสำหรับเขียน php

โปรแกรมสำหรับเขียน php นั้นมีให้เราเลือกหลายตัวมากๆ ซึ่งแต่ละตัวก็จะมีข้อดีและข้อเสียที่แตกต่างกัน ดังนั้นเราควรจะเลือกเครื่องมือให้เหมาะสมกับการทำงานของเรา

Dreamwaver เริ่มจาก Tools ที่มีคนใช้งานกันมากที่สุด ข้อดีของการใช้ Dreamwaver คือใช้งานง่ายสร้าง Web ได้อย่างสะดวกรวดเร็ว แค่ลากวางเราก็สามารถสร้างเว็บขึ้นมาได้ โดยที่ไม่ต้องเข้าใจ HTML และ CSS แต่ข้อเสียของการใช้ Dreamwaver คือ แพง(ถ้าไม่ได้ใช้ของเถื่อน) ไม่ใช่ของฟรี และ Dreamwaver ไม่ได้ออกแบบมาสำหรับการเขียน php แต่ออกแบบมาให้ Designer ทำงานกับ HTML และ CSS เป็นหลัก ดังนั้นถ้าต้องการจะใช้เครื่องมืออื่นๆในการทำงานเช่น xDebug อาจต้องเลือกเครื่องมือตัวอื่นแทน

Netbean ตัว Netbean พัฒนาขึ้นมาเพื่อทำงานกับ Java ก่อนแล้วก็แตกสาขาออกมาทำงานกับภาษาอื่นๆ ดังนั้นจึงเป็นเครื่องมือที่เรียกได้ว่าครบเครื่องเลยทีเดียวกับการทำงานแบบโปรแกรมเมอร์ ไม่ว่าเราจะทำงานกับ xDebug หรือ Git ก็มีเครื่องมือช่วยให้เราทำงานได้ง่ายมาก การค้นหา Code ต่างๆ เช่นการ Go to Definition ทำได้ดีมาก สามารถไล่การทำงานของ code ใน Project ใหญ่ๆ ได้สบาย แต่ข้อเสียคืออาจทำงานได้ไม่ง่ายเท่ากับ Dreamwaver(สำหรับมือใหม่) แต่ก็เป็นของฟรีที่ควรจะเอาไปใช้งานเป็นที่สุด (reccommend)

Sublime เป็น Editor ที่มาแรงที่สุดในตอนนี้เนื่องจากใช้งานได้ง่าย สามารถเปิดได้เร็ว เวลาใช้งานจะรู้สึกเหมือนกับใช้ notepad การใช้งานบน sublime ไม่มี Interface ให้เราทำงานด้วยมากนักเลยจำเป็นต้องใช้ Short cut เป็นหลัก เราต้องจำ key ให้ได้ถึงจะใช้งาน Sublime ได้อย่างเต็มประสิทธิภาพ การตั้งค่า property ของระบบก็จะใช้งาน Json เป็นหลักไม่มีหน้า Interface ให้เราเลือก ดังนั้น Sublime จะเหมาะกับผู้ที่เป็น Programmer ที่ต้องการทำงานรวดเร็วและใช้ Short key ในการทำงานเป็นหลัก ไม่เหมาะกับมือใหม่หรือผู้ที่เริ่มต้นเขียนโปรแกรมใหม่ๆ

นี่เป็น 3 เครื่องมือหลักที่เป็นทางเลือกให้เราตอนนี้ จริงๆ ยังมีอีกหลายตัวจะเอามาเพิ่มเติมให้ในบทความต่อไป

 

การใช้งาน Twig Template Engine ตอนที่ 10

ในตอนนี้เราจะพูดถึงการใช้ expression ใน {{ … }} ซึ่งใน Twig จะเปิดโอกาสให้เราสามารถที่จะใช้  expression ได้

จากในตัวอย่างจะเป็นการแสดงผล username เป็นตัวอักษรตัวเล็กทั้งหมด

หรือการต่อข้อความ

 

expression ใน Twig จะทำการแบ่งออกเป็นกลุ่มต่างๆ ดังนี้

  • Literals กลุ่มที่เกี่ยวกับ Data Type ใน PHP ทั้งเรื่องของ เลขทศนิยม, Array และอื่นๆ
  • Math กลุ่มที่เกี่ยวข้องกับการคำนวณ ตัวที่เพิ่มเติมขึ้นมาก็คือ **(หมายถึงยกกำลัง) และ // (หมายถึง หารแล้วตัวทศนิยมออก)
  • Logic กลุ่มนี้จะเป็นเรื่องของ Logic ตามชื่อ มี and, or, not แล้วก็ ()
  • Comparisons เป็นกลุ่มของการเปรียบเทียบ เช่น ขึ้นต้นด้วยตัว “A” รึเปล่า รวมทั้งการเปรียบเทียบด้วย Regular Expression ในกลุ่มนี้มี opertor อยู่ 3 ตัวคือ starts, ends และ matches
  • Containment เป็นการใช้ operator “in” และ “not in”
  • Test เป็นการใช้ “is” และ “is not”
  • String Interpolation เป็นการใช้ #{expression} จะเป็น expression ซ้อน expression
  • Other กลุ่มของ expression อื่นๆ ที่ถูกเพิ่มขึ้นมาใน version 1.12.0 ซึ่งไม่สามารถระบุกลุ่มที่อยู่ได้ชัดเจน

ในการใช้งานเราสามารถดูเพิ่มเติมในรายละเอียดจากใน Document ของ Twig

การใช้งาน Twig Template Engine ตอนที่ 9

ในตอนที่ 9 เราจะพูดถึงการใช้ การ encode กันอย่างละเอียด โดยในบทความตอนที่ 5 เราจะพูดถึงการใช้ filter escape โดยการใช้ชื่อตัวแปร แล้วตามด้วยคำว่า escape

ซึ่งเราสวามารถทำการย่อได้โดยใชแค่ตัว e ตัวเดียวเท่านั้น

การ ใช้ escape แบบนี้จะเป็นการใช้ใน context ที่เป็น HTML เท่านั้น เพราะการเขียน เฉพาะคำว่า escape หรือ e หมายถึง

นอกจาก context ที่เป็น HTML เราสามารถใช้ใน context อื่นๆได้อีก

จากในตัวอย่างเราสามารถเลือกได้ว่าเราจะทำการ escape character แล้วนำไปแสดงผลใน context ไหน

แต่ถ้าเราต้องการให้ default เป็น context อื่นที่ไม่ใช่ HTML เราก็สามารถ set ค่า default ใหม่ได้

ในคำสั่ง autoescape ก็เช่นเดียวกันเราสามารถกำหนด strategy หรือ context ที่จะแสดงผลได้

แต่โดยปกติแล้วการ escape จะมี strategy เป็น HTML อยู่แล้ว เนื่องจากส่วนมากเรามักจะแสดงผลใน HTML เป็นหลัก

ถ้าเราต้องการแสดงผลอักขระพิเศษใน {{ … }} ก็ให้ทำการใส่ qoute ครอบอักขระพิเศษนั้นซะ

 

การใช้งาน Twig Template Engine ตอนที่ 8

จากตัวอย่างการสร้าง Master Page ใน ตอนที่แล้ว เราได้สร้างตัว base.html ขึ้นมาเป็น Template ตัวแม่

ในตอนนี้เราจะทำการเรียกใช้ base.html โดยในตัวอย่างจะ base.html จะมีอยู่ด้วยกัน 4 block คือ header, title, contentและ footer เวลาสร้าง Template ที่เป็น client จะเรียกใช้เป็น

ในส่วนของ Template ที่เป็นตัวลูกจะใช้ keyword extend มาจาก Template ตัว Master หรือตัวแม่ หลังจากนั้นในแต่ละ block ก็จะใส่ content ของตัวเองลงไป content ของตัวลูกจะไปทับ content ของตัวแม่ใน block นั้นๆ ถ้าอยากให้ แสดง content ของตัวแม่เราจะใช้ function parent() เหมือนในส่วนของ block header

ส่วนใน block ของ footer จะไม่ได้ใส่ไว้ในตัวลูก เวลา render() Twig ก็จะไปเอา content ใน Template ตัวแม่มาแสดงแทน

การใช้งาน Twig Template Engine ตอนที่ 7

ในตอนที่ 7 นี้เราจะพูดถึงการสร้าง Template หรือ Master Page ด้วย Twig เพราะแน่นอน การสร้าง Web ไม่ได้มีเพียงหน้าเดียวแน่นอน ดังนั้นถ้าเราต้องการจะให้ทุกหน้ามี Header หรือ Footer เหมือนกัน เราก็ต้องสร้าง Template หรือ Master Page ขึ้นมา

การสร้าง Template ใน Twig นั้นเริ่มต้นจากการที่เราต้องสร้างตัว Template ที่เป็นตัว Master(ตัวที่เป็นโครงสร้างของ Template ตัวอื่นๆ) ขึ้นมาก่อน

ใน Template ตัวที่เป็น Master จะทำการระบุ block ไว้ให้ใส่ content ดังนั้นถ้ามี content อะไรใน Template ตัวลูกก็ทำการระบุชื่อ block ได้เลย หลังจากนั้น save file เป็น HTML ได้เลย เช่นในตัวอย่างจะตั้งชื่อเป็น base.html

ใน base.html นี้จะประกอบไปด้วย block ทั้งหมด 4 block คือ

  • header (ใน block นี้จะมี content อยู่ใน block)
  • title (จะซ้อนอยู่ใน header อีกที และไม่มี content อยู่ใน block เลย)
  • content (เป็น block ที่ไม่มี content อยู่เลย)
  • footer (ใน block นี้ก็จะมี content ของตัวเองอยู่เหมือนกัน)

ในตอนต่อไปเราจะทำการสร้าง Template ตัวลูกเรียกใช้ base.html นี้