เอา Zend Framework มาใส่ Codeigniter Framework เพื่อใช้ Zend Component

entry นี้ผมกะจะเขียนตั้งนานแล้ว แต่ว่าไม่มีโอกาสเสียที วันนี้เลยเอาสักหน่อยครับ

ผมไม่เท้าความว่า Codeigniter Framework คืออะไร หาอ่านกันเอานะครับ ติดตั้งอย่างไร เขียนยังไง ทำงานอย่างไร อันนี้หาเอาได้ในเว็บต่างๆ ทั้งไทยและเทศ ผมว่ามีเยอะ ผมลุยเรื่องปรับแต่งเพิ่มเติมเลยดีกว่า

เหตุผลที่เอา Component ของ Zend Framework (ต่อไปเรียก Zend) มาใช้ใน Codeigniter (ต่อไปเรียก CI) เพราะความครบเครื่องในการนำไปใช้งาน ที่หลายๆ อย่างทำได้ดีกว่าตัว CI เยอะมาก แต่โครงสร้างและติดตั้งของ Zend ทำได้ยุ่งยากกว่า ผมเลยเอามาผสมกัน หากใครใช้ Zend มาบ้างจะทราบดีว่ามันอลังการงานสร้างแค่ไหน ครบเครื่องอย่างไร

เอาหล่ะ ไม่พูดอะไรมาก ก่อนอื่นสร้างไฟล์ที่ path ตามด้านล่างครับ

system/application/libraries/Zend.php

ภายในไฟล์ก็ประกอบด้วยโค้ดตามด้วยล่างครับ

<?php
class CI_Zend {
    function __construct ($class = NULL) {

        ini_set('include_path',  ini_get('include_path') . PATH_SEPARATOR . APPPATH . 'libraries');

        if ($class) {
            require_once (string) $class . EXT;
            log_message('debug', "Zend Class $class Loaded");
        } else {
            log_message('debug', "Zend Class Initialized");
        }
    }

    function load ($class) {
        require_once (string) $class . EXT;
        log_message('debug', "Zend Class $class Loaded");
    }
}

โดยเมื่อได้ไฟล์ Zend.php แล้ว ให้เอา Directory “Zend” ทั้งหมดไปใส่ที่

system/application/libraries

เวลาใช้งาน ก็ใช้งานผ่าน Controller ของ CI โดยมี 2 แบบคือ

  1. โหลด Library Zend ที่เขียนสำหรับตั้ง include path ไปพร้อมๆ กับโหลด Component ไปด้วยเลย
$this->load->library('zend', 'Zend/Package/Name');
  1. โหลดตัว Library Zend ที่เขียนสำหรับตั้ง include path ก่อน แล้วค่อยโหลดตัว Component ทีหลังเป็นตัวๆ ไปก็ได้
$this->load->library('zend');
$this->zend->load('Zend/Package/Name');

การโหลด Zend Component แบบนี้ก็ทำให้ดูเป็นระเบียบกว่าการ require_once เข้ามา เพราะอย่างน้อยก็ทำให้เราทำ logs tracking ใน CI ได้ครับ รวมไปถึงการตั้ง include path เพื่อโยกย้าย Zend Framework ไปที่ไหนๆ ก็ได้ตามแต่เราตั้งใน include path โดยไม่ต้องอ้างอิง include path ของ System

เพียงเท่านี้เราก็ลั้นล้ากับ Zend ใน CI ได้สบายใจแล้วหล่ะครับ ;)

Library vs. Framework

จาก Library vs. Framework

A framework is more than a library, and actually maybe has nothing to do with a library.

Here is an interesting article on Martin Fowler’s blog about Inversion of control, but in the article, Martin discuss the difference between the library and the framework, as well he refers to another article about frameworks.

I can summarize the points in both articles in the following:

A library is about reusable functionalities, but a framework is about reusable behaviors.

A library is something you call/inherit from your code, but framework is something that calls your code or provide services for your code.

A library is a collection of components and classes, where framwork is how abstract classes and components interact with each others.

I can explain the framework by this definition: Framework is an abstract design that embodies how the application works, and it has "hooks" where you can "inject" your module, or component.

เป็นบทสรุปที่ดีมาก ๆ ครับ ไม่ขอแปลแล้วกัน ตรงตัวมาก ๆ มองเห็นภาพชัดเลยสำหรับข้อแตกต่างของ Library กับ Framework ครับผม

Framework , Library , Platform, Architecture และ AJAX

ผมมีคำถามที่ไม่เข้าใจ ให้ช่วยแนะนำแนวทาง ดังนี้ครับ
1. framework คืออะไร เกี่ยวข้องกับ library ไหม
2. แพลตฟอร์มกับสถาปัตยกรรมต่างกันอย่างไร
3. AJAX คืออะไรครับ

Framework นั้นใน Software development เป็นการสร้างโครงสร้างของ software project ที่สามารถรวบรวม และพัฒนาสิ่งต่าง ๆ ได้ โดยที่ framework นั้นจะมีโปรแกรมสนับสนุน (IDE), library, scripting language และซอฟต์แวร์อื่นๆ ที่ช่วยในการพัฒนา ตัวอย่าง Framework ก็ Eclipse ที่เป็น Java Framework จาก IBM, NetBeans จาก Sun Microsystems, Microsoft .NET จาก Microsoft, Ruby On Rails สำหรับเขียน Ruby, Cocoa จาก Apple Computer ฯลฯ ส่วนถ้าใน Hardware development เป็นพวกการรวมกันของระบบ เช่น SuperComputer ที่ต้องใช้ Hardware เฉพาะที่เข้ากันได้, Macintosh ที่ต้องใน CPU ที่ออกแบบมาเฉพาะสำหรับการทำงานร่วมกับ Mac OS เป็นต้น
ซึ่งในส่วนของ Framework ที่เป็น Software development นั้น บางครั้งก็สามารถแยกย่อยได้เป็น 2 ส่วนคือ Runtime และ SDK (Software Develop Kits) ซึ่ง Runtime นั้นเป็นการทำให้ซอฟต์แวรที่พัฒนาจาก SDK สามารถทำงานได้ โดยที่ไม่ต้องลง SDK ทั้งหมด ถ้าคิดง่ายๆ คือ SDK เป็น super set ของ Runtime อีกที

Library เป็นการรวมกันของ subprogram ที่ช่วยในการพัฒนาซอฟต์แวรต่าง ๆ ถ้าใน c/c++ ก็พวก stdio, iostream, string ฯลฯ ซึ่งเราต้อง include ถ้าใน java ก็พวก import ต่างๆ เช่น swing อะไรพวกนี้เข้ามาใน code ของเราเพื่อช่วยให้เราไม่ต้องเขียนในส่วนนั้น ๆ ตัวอย่างเช่นใ น MFC ที่สามารถ include Library พวก win32 เข้ามาเพื่อสร้าง GUI ในภาษา visual c++, visual basic

Architecture เป็นศาสตร์ และศิลปของการออกแบบสิ่งของ และโครงสร้างต่าง ๆ โดยมุ่งเน้นในความเป็นกลางของระบบที่เข้ากันได้ในแต่ละรายละเอียด ทั้ง Software และ Hardware

Platform เป็นรายละเอียดต่างๆ ที่นำมารวมกันของ framwork (ทั้ง hardware หรือ software) ที่ยินยอมให้ทำงานได้ ซึ่งมันเป็นการรวมกันของ Computer architecture, operating system หรือ programming language และรวมไปถึง runtime library ตัวอย่างเช่น Wintel เป็นการรวมกันของ Intel x86 หรือ compatible hardware และ Windows operating system, Macintosh เป็นการจัดจำหน่วยบน platform ของ Apple Computer hardware และ Mac OS operating system และพวก video game console ต่าง ๆ พวก xbox, ps(1,2,3) game cube ฯลฯ

AJAX หรือ Asynchronous JavaScript and XML นั้นเอง ซึ่งมันทำงานโดยใช้

  • HTML/XHTML/CSS เพื่อแสดงผล
  • Document Object Model ทำการส่งค่า html และทำงานโดยผ่าน JavaScript เพื่อทำการแสดงผลแบบ dynamic ให้กับ HTML/XHTML/CSS มากขึ้น
  • XMLHttpRequest เพื่อทำการส่งข้อมูลเข้า และออก web server เพื่อประมวลผล

Web browser ที่สนับสนุนคือ

  • Apple Safari 1.2 ขึ้นไป
  • Konqueror ทุกรุ่น
  • Microsoft Internet Explorer (and derived browsers) 4.0 ขึ้นไป
  • Mozilla Firefox (and derived browsers) 1.0 ขึ้นไป
  • Netscape 7.1 ขึ้นไป
  • Opera 7.6 ขึ้นไป
  • ฯลฯ ในอนาคต

ซึ่งจริงๆ แล้วเป็น Technology ที่ใช้ใน Outlook Web Access อยู่แล้ว ซึ่งทำงานผ่าน Microsoft Exchange Server โดยทำงานบน Microsoft Internet Explorer 4.0 ต่อมาในปี 2005 นั้น Google ก็เอามาใช้ใน Google Groups, Google Maps, Google Suggest และ Gmail
ถ้าไล่ตามลำดับแล้ว จากขนาดใหญ่ไปเล็กก็ไล่จาก
Platform -> Architecture -> Framework -> Library -> AJAX

เรียนโปรแกรมมิ่ง หรือ Computer Science จงเป็นเจ้านายภาษา …

ขอท้าวความนิดนึง ว่าทำไมผมถึงเขียนแบบนี้

คืออันนี้ผมไป ได้มาจากพี่เดฟ (ithilien_rp) post ตอบไว้ใน pantip.com โดยที่เจ้าของกระทู้เขียนว่า ในlonghorn นั้น microsoft จะใช้ภาษาใหม่ ซึ่งก็คือ mc++ ดังนั้นขอให้พวกโปรแกรมเมอร์ทั้งหลายระงับการเรียนโปรแกรมกันไว้ก่อนเพราะว่าอีกไม่นานต้องเปลี่ยนอีก

อะไรทำนองนี้แหละครับ เนื้อหาบทความีดังนี้ครับ


         การเรียนรู้ platform/library/language ใหม่ๆ เป็นเรื่องปกติของ programmer อยู่แล้ว ดังนั้นผมว่ามีของใหม่มา ก็ไม่ใช่เรื่องแปลกอะไร

         การเรียนรู้อะไรผมไม่อยากให้ดูที่เปลือกนอกมากไปนักน่ะครับ อย่าไปดูที่ syntax, libraryอะไรให้มากนัก ดูที่แนวความคิด หรือว่าปรัชญาของการเขียนโปรแกรมจะดีกว่ารวมไปถึง algorithm flow หรือว่า program design ด้วย เพราะว่า ถึงแม้ภาษาต่างๆ มันจะเปลี่ยนไป หรือว่า library/framework ต่างๆ มันเปลี่ยนไปตามกาลเวลาของมัน ไอ้พวก algorithm หรือว่า design philosophyพวกนี้ไม่ค่อยเปลี่ยนตามหรอกครับ หรือว่าเปลี่ยนตามก็ช้ากว่าไม่รู้กี่เท่า

         เรียนprogramming language ใหม่ๆ ภาษานึงนี่ ผมว่ามันไม่ใช่เรื่อง big dealอะไรเลย ตอนที่ผมเปลี่ยนมาใช้ mac os x ใหม่ๆ แล้วอยากจะเขียนโปรแกรมบน osx ผมก็ต้องเรียน objective-c ซึ่งผมไม่เคยเห็นมาก่อนในชีวิตก็ไม่มีอะไรมาก ใช้เวลาครึ่งวันอ่าน syntax, keyword ใหม่ๆ ว่ามีอะไรบ้างอีกครึ่งวันหาพวก FAQ ว่ามันมีอะไรต่างจาก c/c++/java มั่งวันที่สองวันที่สาม ก็เขียนอะไรใน objective-c ได้แล้วส่วนเรื่องการเขียนโปรแกรมใน os x นี่ แน่นอนว่า architecture มันต่างจากwindows โดยสิ้นเชิง ดังนั้นความรู้อะไรก็ตามที่ผมรู้มาจาก win32, mfc,.net ใช้ไม่ได้เลย (ของตาย ยกเว้น M$ จะ port ไปลง แต่ว่า .net ก็มีdotGNU ก็พอจะใช้กันได้บ้าง) แต่ว่าก็เรียนรู้ Cocoa framework (ที่เป็นnative framework ของ mac os x) ก็ใช้เวลาไม่นานเท่าไหร่ ก็เขียน GUIapplication ได้แล้ว ใช้ system service ได้พอสมควร (ก็อ่านๆ พวก basicแล้วที่เหลือก็เปิด reference เอา)

         ขอสรุปความคิดคร่าวๆละกันนะครับ ก่อนจะนอกเรื่องไปมากกว่านี้ผมอยากจะเสนอความคิดแบบนี้ดีกว่าครับ สำหรับคนที่จะหัดเขียนโปรแกรม

1. แยกการเรียน “ภาษา” กับการเรียน “library/framework” ออกจากกัน
         เดี๋ยวนี้library/framework ใหม่ๆ ส่วนมากจะ support หลายภาษา และ codeที่เขียนเรียกใช้ library เหล่านั้นในแต่ละภาษาจะไม่ต่างกันมากเท่าไหร่(ลองดู code ที่ใช้ .NET framework ที่เขียนใน VB.NET, C#.NET หรือว่าManaged C++.NET สิครับ ออกมาแทบจะเหมือนกันเลย ผมอ่านหนังสือ VB.NET นี่แปลง code เป็น C# ได้แบบแทบไม่ต้องคิดเลย เกือบจะบรรทัดต่อบรรทัด แปลงแค่syntax กับ keyword แล้วก็ structure นิดหน่อย)
         ดังนั้นการแยกการเรียนรู้ library/framework ออกจากการเรียนภาษาเป็นเรื่องที่สำคัญครับ ตามความคิดของผม

2. อย่าไป focus กับภาษามากเกินไป ดูที่ algorithm + program design มากๆ
         ภาษาก็เป็นแค่เครื่องมือแม้ว่าภาษาแต่ละภาษาจะมีข้อดีข้อเสียไม่เหมือนกัน แต่ว่าอย่างไรก็ดี การdesign program นั้น design framework, design patternsส่วนมากจะไม่ขึ้นกับภาษา คือ จะใช้ในภาษาไหนก็ได้ เช่นเดียวกับ algorithm
         ดังนั้นเมื่อต้องถึงเวลาที่จะเปลี่ยน platform ไม่ว่าจะเป็นการไปใช้ platformตระกูลใหม่ (เช่น windows->linux, windows->macหรือว่ากลับกันก็ตาม) หรือว่าตระกูลเดิม แต่ update architectureใหม่จนจำไม่ได้ (เช่น windows 3.11->windows 95, win32->.net หรือmac os 9->mac os x) ก็ตาม สิ่งที่ต้องทำก็คือ
         – เรียนรู้ syntax และลักษณะเฉพาะของภาษาใหม่ (ถ้าจำเป็น)
         – เรียนรู้ basic ของ framework ของ platform นั้นๆ (เช่น การเรียกใช้component, การใช้ memory, ฯลฯ)
         จากนั้นในการเขียนโปรแกรมหรือว่าสร้าง application อะไร ในภาพรวม ก็คิดตามหลักprogram design เดิม และใช้ algorithm ตัวเดิม แต่ว่าเรียกใช้ componentจาก framework ตัวใหม่ (ซึ่งตรงนี้ ถ้า basic แน่นดี ก็เปิดดูจากreference ได้เลย) และอาจจะปัญหาเรื่องรายละเอียดปลีกย่อยนิดหน่อยในส่วนที่เป็นลักษณะเฉพาะของภาษาใหม่ ที่ต่างไปจากภาษาที่เคยชินเท่านั้นเอง เช่นตอนที่เขียน objective-c ใหม่ๆ งงกับมันอยู่พักนึง กับsemi-automatic memory management ของมัน เพราะว่าเคยแต่ใช้ manual แบบc/c++ หรือว่า fully automatic แบบ java
         ส่วนถ้าใครอยากจะลองเล่นกับmanaged c++ ก็หาตัวอย่างได้ทั่วไปครับ ส่วนหนังสือเล่มที่อยากจะแนะนำนอกจากหนังสือของสำนักพิมพ์ microsoft ที่น่าจะเป็นมาตรฐานที่ต้องอ่านแล้วก็มี Developing Applications with Visual Studio.NET โดย RicardGrimes เล่มนี้จะเน้นการใช้ Managed C++และจากพูดถึงส่วนของรายละเอียดต่างๆ ข้อเหมือนและข้อแตกต่างระหว่างmanaged c++ กับ c++และ c# ไว้ดีพอสมควรทีเดียว แต่ว่าอาจจะไม่มี codeตัวอย่างมากนัก เหมาะกับคนที่เขียนโปรแกรมเป็นอยู่แล้ว

อยากจะเขียนโปรแกรม ควรจะศึกษาโปรแกรมอะไรก่อน ?

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

พี่ๆที่พอจะช่วยผมได้ ช่วยผมทีนะครับ อยากจะศึกษา แต่ไม่รู้จะเริ่มจากตรงไหนดี

ขอบพระคุณมากครับ

ขอบคุณจากใจจริงครับ

จากคุณ : NismoO -[ 22 พ.ย. 47 – 01:25:56 ]

กระทู้จาก Pantip.com ครับ http://www.pantip.com/tech/coffee/topic/JX1662452/JX1662452.html

พอดีว่า พี่เดฟ (ithilien_rp) มาตอบให้ …. เลือกภาษาซักตัว อะไรก็ได้ แล้วก็หา compiler ของภาษานั้นๆ แล้วก็มาหัดเขียนโปรแกรมง่ายๆ พวกรับ input แสดง output คิดเลขง่ายๆ แล้วก็หัดใช้พวก loop

compiler หลายตัวก็ฟรี หลายตัวก็เป็น commercial … แต่ว่าตอนแรกอยากให้หัดกับพวก free compiler ก่อน อันนี้ก็แล้วแต่ภาษาน่ะแหละ ว่าจะหาได้ยากง่ายแค่ไหน เช่น Java กับ .NET สามารถที่จะหา compiler ฟรีได้เลยจาก Sun กับ Microsoft โดยตรง ส่วนภาษาที่มีมาตรฐานกลาง เช่นพวก C/C++ ก็ต้องหา compiler เอา จริงๆ ใช้ MinGW ก็ไม่เลวหรอก หรือว่าจะใช้ Borland C++ command line edition ก็ได้

ไม่อยากให้ไปบ้าตามกระแสบางอย่าง ที่ต้องเล่น professional tools พวก visual studio.net enterprise ตั้งแต่ยังทำอะไรไม่เป็น ….

ค่อนข้าง ok มากสำหรับคนทีี่เพิ่งจะเริ่มทำหรือศึกษาด้านการเขียนโปรแกรมครับ

อีกคำถามนึงจาก ThaiDev.com ครับ http://www.thaidev.com/board-c/view.php?1068

คำถาม … ความสามารถของ C “ตอนนี้ผมสามารถเขียน C ได้แต่ก็แค่ใช้แก้บัญหาคณิตศาสตร์เท่านั้นอยากทราบความสามารถอืนและแหล่งรวบรวมความรู้ดังกล่าว”

ตอบ …
1) ตอบแบบวิชาการหน่อยๆ ก็ programming language ไม่ว่าจะภาษาไหน .. ก็ถือว่าเป็น universal turing machine (UTM) ทั้งหมด และด้วยความเป็น UTM ทำให้มันมีความสามารถที่จะทำอะไรก็ได้ที่ UTM ตัวอื่นทำได้ และสามารถ emulate การทำงานของ UTM ตัวอื่นได้หมด และเนื่องจากคอมพิวเตอร์แบบที่เราใช้กันอยู่ทุกวันนี้มันก็เป็น UTM ดังนั้นการทำงานทุกอย่างของ computer ตลอดจนโปรแกรมทุกลักษณะ ก็สามารถใช้ภาษา C เขียนได้หมด

2) ตอบแบบสั้นๆ ง่ายๆ ก็ จะเขียนอะไรก็ได้หมดน่ะแหละ ที่คุณเคยเห็นบนคอมพิวเตอร์น่ะ (ไม่ว่าจะเป็นกราฟฟิค เสียง ฯลฯ หรือว่าระบบอะไรก็ช่าง .. เขียน OS ยังได้เลย)

ดังนั้น…… ก็แล้วแต่ว่าคุณจะออกแบบโปรแกรมถูกหรือเปล่า จะใช้ data structures กับ algorithm เหมาะสมมั้ย และจะใช้ library อะไร (หรือว่าจะเขียน library ใหม่เอง) เช่นถ้าจะเขียนโปรแกรมเกี่ยวกับทางกราฟฟิคก็อาจจะใช้ OpenGL อะไรประมาณนั้น เป็นต้น

จากคุณ rp@jp เมื่อ 11:22am (20/11/2004)

ทุกๆ คำถามมีคำตอบครับ วันนี้ผมรวบรวม คำถาม และคำตอบมาให้้อ่านกันเดี่ยวจะหายไปครับ หวังว่าคงมีประโยชน์กันนะครับ