<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jQuery, Ajax, PHP, JSON, XML, Web Technologies &#187; Object Oriented</title>
	<atom:link href="http://blog.chonla.com/category/object-oriented/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.chonla.com</link>
	<description>คุยกันเรื่อง jQuery, Ajax, PHP, JSON, XML และ Web Technologies เป็นภาษาไทยกันดีกว่า</description>
	<lastBuildDate>Tue, 17 Jan 2012 18:27:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Magic Methods เรียกใช้พี่สิจ๊ะ แล้วน้องจะสบาย</title>
		<link>http://blog.chonla.com/2011/11/magic-methods-%e0%b9%80%e0%b8%a3%e0%b8%b5%e0%b8%a2%e0%b8%81%e0%b9%83%e0%b8%8a%e0%b9%89%e0%b8%9e%e0%b8%b5%e0%b9%88%e0%b8%aa%e0%b8%b4%e0%b8%88%e0%b9%8a%e0%b8%b0-%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7/</link>
		<comments>http://blog.chonla.com/2011/11/magic-methods-%e0%b9%80%e0%b8%a3%e0%b8%b5%e0%b8%a2%e0%b8%81%e0%b9%83%e0%b8%8a%e0%b9%89%e0%b8%9e%e0%b8%b5%e0%b9%88%e0%b8%aa%e0%b8%b4%e0%b8%88%e0%b9%8a%e0%b8%b0-%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7/#comments</comments>
		<pubDate>Wed, 23 Nov 2011 10:38:54 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[Object Oriented]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Magic Methods]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=339</guid>
		<description><![CDATA[Magic methods คืออะไร ทำไมผมถึงเกริ่นหัวว่ามันจำอำนวยความสะดวกสบายขนาดนั้น Magic method เป็น method ใน class ทั่วไปที่จะถูกเรียกก็ต่อเมื่อเกิดเงื่อนไขอย่างใดอย่างหนึ่งที่ตรงกับ method นั้น ๆ ในความเป็นจริงแล้ว magic methods นั้น ไม่ได้มีอะไรวิเศษไปกว่า method ธรรมดาเลย เรียกให้ง่ายก็คือจริง ๆ แล้ว ตัว magic method ก็คือ method ธรรมดานี่แหละ เพียงแค่ว่า มันไม่ได้ถูกเรียกตรง ๆ เหมือนกับการเรียกใช้งาน method อื่น ๆ แต่อย่างที่บอกตอนต้น คือเมื่อเกิดเหตุการณ์ที่มีเงื่อนไขตรงแล้ว method นี้จะถูกเรียกโดยอัตโนมัติ ตัว magic methods เองจะขึ้นต้นด้วยตัว underscore สองตัวติดกัน ( __ ) ดังนั้นเราควรหลีกเลี่ยงการตั้งชื่อ method ที่ขึ้นต้นด้วย __ นะครับ [...]]]></description>
			<content:encoded><![CDATA[<p>Magic methods คืออะไร ทำไมผมถึงเกริ่นหัวว่ามันจำอำนวยความสะดวกสบายขนาดนั้น</p>
<p>Magic method เป็น method ใน class ทั่วไปที่จะถูกเรียกก็ต่อเมื่อเกิดเงื่อนไขอย่างใดอย่างหนึ่งที่ตรงกับ method นั้น ๆ ในความเป็นจริงแล้ว magic methods นั้น ไม่ได้มีอะไรวิเศษไปกว่า method ธรรมดาเลย เรียกให้ง่ายก็คือจริง ๆ แล้ว ตัว magic method ก็คือ method ธรรมดานี่แหละ เพียงแค่ว่า มันไม่ได้ถูกเรียกตรง ๆ เหมือนกับการเรียกใช้งาน method อื่น ๆ แต่อย่างที่บอกตอนต้น คือเมื่อเกิดเหตุการณ์ที่มีเงื่อนไขตรงแล้ว method นี้จะถูกเรียกโดยอัตโนมัติ</p>
<p><span id="more-339"></span>ตัว magic methods เองจะขึ้นต้นด้วยตัว underscore สองตัวติดกัน ( __ ) ดังนั้นเราควรหลีกเลี่ยงการตั้งชื่อ method ที่ขึ้นต้นด้วย __ นะครับ</p>
<p>เรามารู้จัก magic methods ที่ php เตรียมไว้ให้เรากัน</p>
<p><strong><span style="color: #0000ff;">__sleep()</span></strong> และ <strong><span style="color: #0000ff;">__wakeup()</span></strong></p>
<p>จะถูกเรียกเมื่อมีการเรียกใช้งานคำสั่ง serialize() และ unserialize() โดยเมื่อเราเรียก serialize() กับ object ของ class ที่มี method __sleep() มันจะทำการเรียกใช้งาน method __sleep() ก่อนที่จะทำการ serialize object ของเรา และจะเอาค่าที่ return จาก __sleep() ไป serialize() (ถ้าไม่มีการคืนค่าอะไรกลับไป คำสั่ง serialize จะทำการ serialize ค่า NULL)</p>
<p>ในทำนองเดียวกัน คำสั่ง unserialize() จะไปเรียกคำสั่ง __wakeup() ก่อนที่จะทำการ unserialize(); นั่นเอง</p>
<p><span style="color: #0000ff;"><strong>__tostring()</strong></span></p>
<p>ชื่อ method ค่อนข้างชัดเจน method นี้เอาไว้ใช้สำหรับการประมวลผล object แบบ string เช่น เรามี object ตัวหนึ่ง คือ $obj เราสามารถใช้คำสั่ง echo $obj ได้เลย โดยที่มันจะไปเรียก magic method __tostring อัตโนมัติ ค่าที่ส่งกลับจาก method นี้จะถูกส่งต่อให้ echo อีกทีหนึ่งนั่นเอง</p>
<p><span style="color: #0000ff;"><strong>__invoke()</strong></span></p>
<p>magic method __invoke() นี้จะถูกเรียกเมื่อมีการเรียกใช้งาน object ของเราเป็น function เช่น เรามี object ชื่อ $obj เราสามารถเรียกใช้เป็น $obj(&#8216;test&#8217;) ได้เลย โดยที่ค่า &#8216;test&#8217; จะถูกส่งผ่านไปให้ __invoke() นั่นเอง</p>
<p><span style="color: #0000ff;"><strong>__set_state()</strong></span></p>
<p>เป็น method ที่ถูกเรียกเมื่อมีการเรียกใช้งานคำสั่ง var_export กับ object ของ class ค่าที่ถูกส่งคืนกลับมาจะถูกส่งไปให้ var_export อีกทีหนึ่ง</p>
<p><span style="color: #0000ff;"><strong>__construct()</strong></span></p>
<p>สำหรับคนที่เขียน object oriented น่าจะรู้จัก method นี้ดี method นี้จะถูกเรียกเมื่อ class ของเราถูก instantiate เป็น object ครับ</p>
<p><span style="color: #0000ff;"><strong>__destruct()</strong></span></p>
<p>จะถูกเรียกเมื่อ object ของเราถูกทำลาย (ทำลายแบบทั้ง implicit คือ ถูกทำลายไปเอง ไม่ได้สั่งทำลาย เช่น ออกจาก variable scope และทำลายแบบ explicit คือ ทำลายด้วยคำสั่ง unset)</p>
<p><span style="color: #0000ff;"><strong>__call()</strong></span></p>
<p>จะถูกเรียกเมื่อมีการเรียกใช้ method ที่ใช้งานไม่ได้ (ไม่มี method นั้นใน class หรือ method นั้นเข้าถึงไม่ได้ เช่น private method)</p>
<p><strong><span style="color: #0000ff;">__callStatic()</span></strong></p>
<p>เหมือน __call() เพียงแค่ใช้กับ static method ครับ</p>
<p><span style="color: #0000ff;"><strong>__get()</strong></span></p>
<p>ถูกเรียกเมื่อมีการอ้างถึง property ที่เข้าถึงไม่ได้ของ class (ไม่มี property นั้น หรือเข้าถึงไม่ได้จากสาเหตุอื่น เช่น private property)</p>
<p><span style="color: #0000ff;"><strong>__set()</strong></span></p>
<p>ถูกเรียกเมื่อมีการกำหนดค่าให้กับ property ที่เข้าถึงไม่ได้ของ class</p>
<p><span style="color: #0000ff;"><strong>__isset()</strong></span></p>
<p>ถูกเรียกเมื่อมีการเช็คค่า property ที่เข้าถึงไม่ได้ ของ class ว่าถูกกำหนดค่าไว้หรือไม่ผ่านคำสั่ง isset()</p>
<p><span style="color: #0000ff;"><strong>__unset()</strong></span></p>
<p>ถูกเรียกเมื่อมีการทำลาย property ที่เข้าถึงไม่ได้ ของ class ผ่านคำสั่ง unset()</p>
<p><span style="color: #0000ff;"><strong>__clone()</strong></span></p>
<p>ถูกเรียกเมื่อมีการสั่ง clone object ผ่าน คำสั่ง clone</p>
<p>ตัวอย่างการนำ magic methods มาประยุกต์ใช้คือการทำ data binding แบบง่าย ๆ ครับ</p>
<pre class="js">&lt;?php
class DataBind {
	public $buffer;

	public function __construct() {
		$buffer = array();
	}

	public function __call($fn, $args) {
		if (preg_match('/^Get([A-Z][a-zA-Z0-9]*)$/', $fn, $m)) {
			return $this-&gt;buffer[$m[1]];
		} elseif (preg_match('/^Set([A-Z][a-zA-Z0-9]*)$/', $fn, $m)) {
			$this-&gt;buffer[$m[1]] = $args[0];
		} else {
			echo 'No method found: ' . $fn . "\n";
		}
	}
}

$data = new DataBind();
$data-&gt;SetBook('Harry Potter');
$data-&gt;SetName('John Doe');
$data-&gt;NoMethod();
echo "My name is " . $data-&gt;GetName() . ".\n";
echo "I love a book titled " . $data-&gt;GetBook() . ".\n";
?&gt;</pre>
<p>จะได้ output เป็น</p>
<pre class="js">No method found: NoMethod
My name is John Doe.
I love a book titled Harry Potter.</pre>
<pre class="js">ลองเอาไปประยุกต์ใช้กันดูนะครับ <img src='http://blog.chonla.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </pre>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.chonla.com%2F2011%2F11%2Fmagic-methods-%25e0%25b9%2580%25e0%25b8%25a3%25e0%25b8%25b5%25e0%25b8%25a2%25e0%25b8%2581%25e0%25b9%2583%25e0%25b8%258a%25e0%25b9%2589%25e0%25b8%259e%25e0%25b8%25b5%25e0%25b9%2588%25e0%25b8%25aa%25e0%25b8%25b4%25e0%25b8%2588%25e0%25b9%258a%25e0%25b8%25b0-%25e0%25b9%2581%25e0%25b8%25a5%25e0%25b9%2589%25e0%25b8%25a7%2F&amp;title=Magic%20Methods%20%E0%B9%80%E0%B8%A3%E0%B8%B5%E0%B8%A2%E0%B8%81%E0%B9%83%E0%B8%8A%E0%B9%89%E0%B8%9E%E0%B8%B5%E0%B9%88%E0%B8%AA%E0%B8%B4%E0%B8%88%E0%B9%8A%E0%B8%B0%20%E0%B9%81%E0%B8%A5%E0%B9%89%E0%B8%A7%E0%B8%99%E0%B9%89%E0%B8%AD%E0%B8%87%E0%B8%88%E0%B8%B0%E0%B8%AA%E0%B8%9A%E0%B8%B2%E0%B8%A2" id="wpa2a_2"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2011/11/magic-methods-%e0%b9%80%e0%b8%a3%e0%b8%b5%e0%b8%a2%e0%b8%81%e0%b9%83%e0%b8%8a%e0%b9%89%e0%b8%9e%e0%b8%b5%e0%b9%88%e0%b8%aa%e0%b8%b4%e0%b8%88%e0%b9%8a%e0%b8%b0-%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Method Chaining ใน PHP ทำเองก็ได้ง่ายจัง</title>
		<link>http://blog.chonla.com/2009/09/method-chaining-%e0%b9%83%e0%b8%99-php-%e0%b8%97%e0%b8%b3%e0%b9%80%e0%b8%ad%e0%b8%87%e0%b8%81%e0%b9%87%e0%b9%84%e0%b8%94%e0%b9%89%e0%b8%87%e0%b9%88%e0%b8%b2%e0%b8%a2%e0%b8%88%e0%b8%b1%e0%b8%87/</link>
		<comments>http://blog.chonla.com/2009/09/method-chaining-%e0%b9%83%e0%b8%99-php-%e0%b8%97%e0%b8%b3%e0%b9%80%e0%b8%ad%e0%b8%87%e0%b8%81%e0%b9%87%e0%b9%84%e0%b8%94%e0%b9%89%e0%b8%87%e0%b9%88%e0%b8%b2%e0%b8%a2%e0%b8%88%e0%b8%b1%e0%b8%87/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 19:03:09 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Object Oriented]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Chainability]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=228</guid>
		<description><![CDATA[บทความนี้ได้แรงบันดาลใจมาจาก chainability ของ jQuery และ query builder ของ kohana (จริง ๆ ผมเข้าใจว่า query builder มีอยู่ใน php framework ตัวอื่นด้วย แต่พอดีท่านรุ่งจากบ้าน PHP.DeeServer.net ซึ่งแนะนำให้ผมรู้จักกับ kohana เค้าแนะนำตัวที่อยู่ใน kohana มาครับ) ไอเดียหลัก ๆ ของการทำ chaining ก็คือ การทำให้มันสามารถเรียกต่อกันได้เป็นทอด ๆ นั่นเอง ยกตัวอย่างใน jQuery ซึ่งมีคุณสมบัติที่เรียกว่า chainability อยู่ ทำให้เราสามารถเรียกคำสั่งได้แบบนี้ $("#submenu").addClass("whitemenu").show("slow"); จะเห็นได้ว่า เราสามารถเรียก .show ต่อเนื่องได้เลย นี่เองที่ทำให้เกิดการเรียกอย่างต่อเนื่อง หรือ การทำ Method chaining นั่นเอง ใน PHP เราสามารถทำให้ object มีคุณสมบัติเดียวกันนี้ได้เช่นกัน [...]]]></description>
			<content:encoded><![CDATA[<p>บทความนี้ได้แรงบันดาลใจมาจาก <a href="http://blog.chonla.com/2008/11/เมื่อฟ้าส่ง-chainability-มาให้กับ-jquery/" target="_blank" title="เมื่อฟ้าส่ง Chainability มาให้กับ jQuery">chainability</a> ของ <a href="http://www.jquery.com" target="_blank" title="jQuery - The Write Less, Do More, JavaScript Library">jQuery</a> และ query builder ของ <a href="http://www.kohanaphp.com/" target="_blank" title="Kohana - The swift PHP Framework">kohana</a> (จริง ๆ ผมเข้าใจว่า query builder มีอยู่ใน php framework ตัวอื่นด้วย แต่พอดีท่านรุ่งจากบ้าน <a href="http://php.deeserver.net" target="_blank" title="PHP.DeeServer.Net">PHP.DeeServer.net</a> ซึ่งแนะนำให้ผมรู้จักกับ kohana เค้าแนะนำตัวที่อยู่ใน kohana มาครับ)</p>
<p>ไอเดียหลัก ๆ ของการทำ chaining ก็คือ การทำให้มันสามารถเรียกต่อกันได้เป็นทอด ๆ นั่นเอง ยกตัวอย่างใน jQuery ซึ่งมีคุณสมบัติที่เรียกว่า chainability อยู่ ทำให้เราสามารถเรียกคำสั่งได้แบบนี้</p>
<pre name="code" class="js">
$("#submenu").addClass("whitemenu").show("slow");
</pre>
<p>จะเห็นได้ว่า เราสามารถเรียก .show ต่อเนื่องได้เลย นี่เองที่ทำให้เกิดการเรียกอย่างต่อเนื่อง หรือ การทำ Method chaining นั่นเอง<br />
<span id="more-228"></span></p>
<p>ใน PHP เราสามารถทำให้ object มีคุณสมบัติเดียวกันนี้ได้เช่นกัน เพียงแต่น่าเสียดายที่คุณสมบัตินี้ มีอยู่ใน PHP ตั้งแต่เวอร์ชั่น 5 ขึ้นไปเท่านั้น สำหรับคนที่ยังใช้ PHP4 อยู่ ผมต้องขอแสดงความเสียใจด้วยครับ ฮ่า ๆ และคาดว่าเหตุนี้เองที่ทำให้ kohana สามารถใช้งานได้กับ PHP5 ขึ้นไปเท่านั้น</p>
<p>หลักการง่าย ๆ ที่ทำให้เราสามารถทำ Method chaining ได้ก็คือ การเขียน class และทำการคืนค่าของ object มันเองกลับออกมาหลังจากที่จบ method ทำนองเดียวกับใน jQuery ตอนที่เขียน plugin </p>
<p>ตอนจบ เราก็จะทำการ return jQuery object กลับออกมาให้เช่นเดียวกัน</p>
<p>ลองมาดูตัวอย่างใน PHP กันดีกว่าครับ</p>
<pre name="code" class="js">
// php5 only
class Database
{
	private $link;

	private $table;
	private $field;
	private $condition;
	private $order;
	private $result;

	// connection functions
	function __construct($config)
	{
		$this->flush();
		$this->link = null;
		$this->connect($config["hostname"],
				$config["username"],
				$config["password"],
				$config["database"]);
	}

	function __destruct()
	{
		$this->disconnect();
	}

	function connect($host = "",
				$user = "",
				$password = "",
				$db = "")
	{
		if ($this->link !== null)
			$this->disconnect();

		$this->link = mysql_connect($host, $user, $password);

		if ($this->link === FALSE)
		{
			echo $this->err();
		}
		else
		{
			if ($db !== "")
			{
				return $this->db($db);
			}
		}
		return $this;
	}

	function disconnect()
	{	// break chain
		if ($this->link !== null)
			mysql_close($this->link);
		$this->link = null;
	}

	function db($db)
	{
		if (mysql_select_db($db, $this->link) === FALSE)
			echo $this->err();
		return $this;
	}

	function errno()
	{
		return mysql_errno($this->link);
	}

	function ok()
	{
		return ($this->errno() == 0);
	}

	function err()
	{	// break chain
		return mysql_error($this->link);
	}

	function execute($sql)
	{
		$this->result = mysql_query($sql, $this->link);
		return $this;
	}

	function records()
	{
		$result = array();
		if ($this->result !== FALSE)
		{
			while (($row = mysql_fetch_assoc($this->result)) !== FALSE)
			{
				$result[] = $row;
			}
		}
		return $result;
	}

	function flush()
	{
		$this->table = "";
		$this->field = "";
		$this->condition = "";
		$this->order = "";
		$this->result = null;
		return $this;
	}

	function safe($value)
	{
		if (!get_magic_quotes_gpc())
		{
			$value = addslashes($value);
		}
		return "'$value'";
	}

	function table($table)
	{
		$this->table = $table;
		return $this;
	}

	function field($field)
	{
		$this->field = $field;
		return $this;
	}

	function condition($condition)
	{
		if (is_array($condition))
		{
			$cond = array();
			foreach ($condition as $f => $v)
			{
				$cond[] = "($f = " . $this->safe($v) . ")";
			}
			$condition = implode(" AND ", $cond);
		}
		$this->condition = $condition;
		return $this;
	}

	function top($num = 1)
	{
		$field = $this->field;
		if ($field == "") $field = "*";
		$sql = "SELECT {$field} FROM {$this->table}";
		if ($this->condition !== "")
			$sql .= " WHERE {$this->condition}";
		if ($this->order !== "")
			$sql .= " ORDER BY {$this->order}";
		$sql .= " LIMIT 0, {$num}";
		return $this->execute($sql)->records();
	}

	function all()
	{
		$field = $this->field;
		if ($field == "") $field = "*";
		$sql = "SELECT {$field} FROM {$this->table}";
		if ($this->condition !== "")
			$sql .= " WHERE {$this->condition}";
		if ($this->order !== "")
			$sql .= " ORDER BY {$this->order}";
		return $this->execute($sql)->records();
	}

	function order($order)
	{
		$this->order = $order;
		return $this;
	}
}
</pre>
<p>code ด้านบนนี้ เป็น code ที่ผมทดสอบ โดยทำเป็นไอเดียเริ่มต้นง่าย ๆ สำหรับการทำ query builder จะเห็นได้ว่า หลาย ๆ method จะมีการ return ตัว object มันเอง ($this) ไอเดียหลักในการกำหนดว่า method ไหนที่ผม return หรือไม่ return $this ก็คือ มีความจำเป็นในการเรียก method ต่อจากนี้หรือไม่นั่นเอง</p>
<p>การใช้งานก็ไม่ได้ยุ่งยากอะไร</p>
<pre name="code" class="js">
$dbconf = array(
	"hostname" => "localhost",
	"username" => "root",
	"password" => "123456",
	"database" => "test"
);
$db = new Database($dbconf);
$rows = $db->table("products")
		->field("product_id, product_name")
		->condition(array(
				"product_group"=>"tyre",
				"product_model"=>"Eagle"))
		->top();
print_r($rows);
</pre>
<p>จากตัวอย่างด้านบน เป็นการ select หา product จาก table products โดยกำหนด criteria ในการค้นหาเป็น product_group = &#8216;tyre&#8217; และ product_model = &#8216;Eagle&#8217; โดยจะเลือกเอาเฉพาะ record แรกสุดเท่านั้น</p>
<p>เห็นมั๊ยครับ หลักการง่าย ๆ แค่ return $this เองครับ ที่สำคัญ อย่าลืมนะครับ PHP5 ขึ้นไปนะครับ</p>
<p>ขอให้สนุกกับการเขียนโปรแกรมครับ</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.chonla.com%2F2009%2F09%2Fmethod-chaining-%25e0%25b9%2583%25e0%25b8%2599-php-%25e0%25b8%2597%25e0%25b8%25b3%25e0%25b9%2580%25e0%25b8%25ad%25e0%25b8%2587%25e0%25b8%2581%25e0%25b9%2587%25e0%25b9%2584%25e0%25b8%2594%25e0%25b9%2589%25e0%25b8%2587%25e0%25b9%2588%25e0%25b8%25b2%25e0%25b8%25a2%25e0%25b8%2588%25e0%25b8%25b1%25e0%25b8%2587%2F&amp;title=Method%20Chaining%20%E0%B9%83%E0%B8%99%20PHP%20%E0%B8%97%E0%B8%B3%E0%B9%80%E0%B8%AD%E0%B8%87%E0%B8%81%E0%B9%87%E0%B9%84%E0%B8%94%E0%B9%89%E0%B8%87%E0%B9%88%E0%B8%B2%E0%B8%A2%E0%B8%88%E0%B8%B1%E0%B8%87" id="wpa2a_4"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2009/09/method-chaining-%e0%b9%83%e0%b8%99-php-%e0%b8%97%e0%b8%b3%e0%b9%80%e0%b8%ad%e0%b8%87%e0%b8%81%e0%b9%87%e0%b9%84%e0%b8%94%e0%b9%89%e0%b8%87%e0%b9%88%e0%b8%b2%e0%b8%a2%e0%b8%88%e0%b8%b1%e0%b8%87/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>MVC Design Pattern (MVC ไม่ได้ย่อจากการ์ตูน Mavel Comic นะเฟ้ย)</title>
		<link>http://blog.chonla.com/2009/01/mvc-design-pattern-%e0%b9%84%e0%b8%a1%e0%b9%88%e0%b9%83%e0%b8%8a%e0%b9%88%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%8c%e0%b8%95%e0%b8%b9%e0%b8%99-mavel-comic-%e0%b8%99%e0%b8%b0%e0%b9%80%e0%b8%9f%e0%b9%89/</link>
		<comments>http://blog.chonla.com/2009/01/mvc-design-pattern-%e0%b9%84%e0%b8%a1%e0%b9%88%e0%b9%83%e0%b8%8a%e0%b9%88%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%8c%e0%b8%95%e0%b8%b9%e0%b8%99-mavel-comic-%e0%b8%99%e0%b8%b0%e0%b9%80%e0%b8%9f%e0%b9%89/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 16:10:41 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[MVC]]></category>
		<category><![CDATA[Object Oriented]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Design Pattern]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=142</guid>
		<description><![CDATA[MVC ที่ผมจะพูดถึงนี้ ย่อมาจาก Model-View-Controller ครับ เป็นรูปแบบการออกแบบระบบ โดยหลักการคือ จะแบ่งระบบที่เราออกแบบเป็น 3 ส่วนประกอบหลัก ๆ คือ Model, View และ Controller โดยที่แต่ละส่วนจะมีความสำคัญดังนี้ Model  จะหมายถึง Object ที่แทนข้อมูล หรือกิจกรรมต่าง ๆ ในระบบ เช่น ตารางใน database หรือจะเป็นโพรเซสงานหนึ่ง ๆ ก็ได้ครับ เราจะไม่นับข้อมูลดิบในระบบเป็น Model เพราะข้อมูลเหล่านั้นจะถูกครอบ (Encapsulated) ด้วย Model นั่นเองครับ ถ้าใครเคยเรียน Object Oriented มาน่าจะพอเข้าใจได้ดีนะครับ View จะหมายถึงการแสดงผลข้อมูลต่าง ๆ ที่ได้รับมาจาก Model ครับ ไม่ว่าจะอยู่ในรูปแบบของรูปภาพกราฟิคต่าง ๆ หรือข้อความก็ตาม นอกจากนี้เรายังสามารถแสดงผลที่ได้รับจาก Model หนึ่ง ๆ ได้หลายรูปแบบอีกด้วย Controller จะหมายถึง [...]]]></description>
			<content:encoded><![CDATA[<p>MVC ที่ผมจะพูดถึงนี้ ย่อมาจาก Model-View-Controller ครับ เป็นรูปแบบการออกแบบระบบ โดยหลักการคือ จะแบ่งระบบที่เราออกแบบเป็น 3 ส่วนประกอบหลัก ๆ คือ Model, View และ Controller โดยที่แต่ละส่วนจะมีความสำคัญดังนี้</p>
<p><span id="more-142"></span></p>
<ol>
<li>Model  จะหมายถึง Object ที่แทนข้อมูล หรือกิจกรรมต่าง ๆ ในระบบ เช่น ตารางใน database หรือจะเป็นโพรเซสงานหนึ่ง ๆ ก็ได้ครับ เราจะไม่นับข้อมูลดิบในระบบเป็น Model เพราะข้อมูลเหล่านั้นจะถูกครอบ (Encapsulated) ด้วย Model นั่นเองครับ ถ้าใครเคยเรียน Object Oriented มาน่าจะพอเข้าใจได้ดีนะครับ</li>
<li>View จะหมายถึงการแสดงผลข้อมูลต่าง ๆ ที่ได้รับมาจาก Model ครับ ไม่ว่าจะอยู่ในรูปแบบของรูปภาพกราฟิคต่าง ๆ หรือข้อความก็ตาม นอกจากนี้เรายังสามารถแสดงผลที่ได้รับจาก Model หนึ่ง ๆ ได้หลายรูปแบบอีกด้วย</li>
<li>Controller จะหมายถึง กิจกรรม การกระทำ หรือการตอบสนองต่อเหตุการณ์ต่าง ๆ ที่เกิดขึ้น โดยอาจจะมีผลทำให้ข้อมูลใน Model เปลี่ยนสถานะไปได้ครับ</li>
</ol>
<div id="attachment_144" class="wp-caption aligncenter" style="width: 294px"><a href="http://blog.chonla.com/wp-content/uploads/2009/01/model-view-controller-01.png"><img class="size-full wp-image-144" title="model-view-controller-01" src="http://blog.chonla.com/wp-content/uploads/2009/01/model-view-controller-01.png" alt="MVC diagram" width="284" height="340" /></a><p class="wp-caption-text">MVC diagram</p></div>
<p>รูปภาพด้านบนจะแสดงให้เห็นถึงความสัมพันธ์ระหว่าง Model, View และ Controller ในรูปแบบ Diagram (ขอบคุณภาพจาก <a href="http://www.tonymarston.net/php-mysql/model-view-controller.html">http://www.tonymarston.net/php-mysql/model-view-controller.html</a> ด้วยครับ)</p>
<p><strong>ข้อดีของการออกแบบระบบด้วย MVC Pattern</strong></p>
<ul>
<li><strong>การออกแบบที่ชัดเจน</strong> เมื่อเรากำหนดให้ Model อยู่ในรูปแบบของ Object ในระบบ ส่งผลให้เราสามารถมองภาพระบบโดยรวมได้ชัดเจนมากขึ้นว่า Model ใด สัมพันธ์กับ Model ใดในลักษณะใด รวมไปถึงคำสั่งต่าง ๆ ใน Object ที่เราสามารถเรียกใช้งานได้ จะทำให้เรามองเห็นภาพของพฤติกรรมของ Model นั้น ๆ อีกด้วย</li>
<li><strong>การปรับปรุง/แก้ไขได้โดยง่าย</strong> เมื่อเราออกแบบตาม MVC Pattern ทำให้เราสามารถปรับปรุง แก้ไขส่วนใด ๆ ได้อย่างง่ายดายโดยที่ไม่กระทบกับส่วนที่เหลือ เนื่องจากทั้ง 3 ส่วนต่างอิสระต่อกัน เพียงเรากำหนด Interface ของแต่ละส่วนให้ชัดเจน และทำการพัฒนา แก้ไข หรือปรับปรุงภายใต้ Interface ที่กำหนดเท่านั้น</li>
<li><strong>View ที่หลากหลาย</strong> หลังจากที่เราแยก View กับ Model ออกจากกัน ทำให้เราสามารถออกแบบ View ได้หลายรูปแบบ เปรียบเทียบได้กับ Model หนึ่งที่คอย Generate XML Data รายงานดัชนีหุ้น และมี View ที่นำข้อมูล XML ไปใช้สร้างเป็นกราฟ หรือตารางนั้นเอง</li>
<li><strong>Maintain ระบบได้ง่าย</strong> เพราะเราได้ออกแบบระบบที่มีโครงสร้างชัดเจน ทำให้ยืดหยุ่นต่อการเพิ่มเติม รวมไปถึงการนำส่วนใด ๆ กลับมาใช้ซ้ำได้อีกด้วย (Reusability)</li>
</ul>
<p><strong>แล้วข้อเสียล่ะ?</strong></p>
<p>เมื่อพูดถึงข้อดีแล้ว ต่อไปเราก็มาพูดถึงข้อเสียกันบ้าง ข้อเสียหนึ่งที่เห็นได้ชัดเลยคือ มันซับซ้อนเกินไป ถ้าเราจะนำมาใช้กับระบบขนาดเล็ก เทียบง่าย ๆ มันก็คงไม่ต่างจากภาษิตที่ว่า ขี่ช้างจับตั๊กแตน นั่นเองครับ</p>
<p><strong>นอกจากนี้แล้ว</strong></p>
<p>นอกจากนี้แล้ว ทางฝั่งภาษา PHP เองก็มี Framework ที่สนับสนุนการพัฒนาระบบที่มีพื้นฐาน MVC design pattern อยู่หลายตัวครับ ผมขออนุญาตลอกมาจาก Wiki ให้ดูกัน (<a href="http://en.wikipedia.org/wiki/Model-view-controller#PHP">http://en.wikipedia.org/wiki/Model-view-controller#PHP)</a></p>
<ul>
<li></li>
<li>Akelos PHP Framework &#8211; a Ruby on Rails port to PHP4/5.</li>
<li>CakePHP &#8211; webapplication framework modeled after the concepts of Ruby on Rails.</li>
<li>CodeIgniter &#8211; A PHP MVC framework.</li>
<li>FUSE &#8211; A powerful but easy-to-use PHP 5 Framework for MVC development modeled after the concepts of Ruby on Rails.</li>
<li>Jelix (web framework)</li>
<li>Jaws &#8211; is a Framework and Content Management System for building dynamic web sites.</li>
<li>Joomla v1.5.x &#8211; is an open source Content Management System that employs the MVC model for its extensions, called components and modules.</li>
<li>Kohana &#8211; is an open source MVC oriented framework, originally forked from CodeIgniter.</li>
<li>LISA MVC &#8211; is an open source object oriented web application framework.</li>
<li>Odin Assemble &#8211; Small footprint PHP based MVC Framework.</li>
<li>Orinoco Framework &#8211; is a full-stack yet lightweight framework written in PHP5. It implements the Model 2 design paradigm.</li>
<li>PHPonTrax &#8211; A PHP 5 MVC framework modeled after Ruby on Rails.</li>
<li>phpXCore &#8211; A MVC design pattern based PHP content management framework compatible with PHP4 and PHP5.</li>
<li>Prado &#8211; A PHP 5 MVC framework modeled after ASP.NET web forms.</li>
<li>Qcodo &#8211; is an open-source PHP 5 web application framework</li>
<li>SilverStripe &#8211; contains a fully fledged PHP 5.2 ORM/MVC Framework focused on building websites. Much like Ruby on Rails.</li>
<li>Solar</li>
<li>Switch board (framework) &#8211; with Routing PHP 5 MVC Framework with Routing.</li>
<li>Symfony Framework- PHP 5 MVC Framework modeled after the concepts of Ruby on Rails.</li>
<li>Zend Framework &#8211; A PHP 5-based MVC framework modeled after the concepts of Ruby on Rails.</li>
<li>ZNF &#8211; PHP5 MVC framework for enterprise web applications</li>
<li>Zoop &#8211; Framework A Mature PHP 4/5 MVC framework.</li>
<li>PureMVC &#8211; Framework for PHP</li>
</ul>
<p><strong>เอกสารอ้างอิง</strong> </p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Model-view-controller">http://en.wikipedia.org/wiki/Model-view-controller</a></li>
<li><a href="http://www.tonymarston.net/php-mysql/model-view-controller.html">http://www.tonymarston.net/php-mysql/model-view-controller.html</a></li>
<li><a href="http://cristobal.baray.com/indiana/projects/mvc.html">http://cristobal.baray.com/indiana/projects/mvc.html</a></li>
<li><a href="http://aspalliance.com/1562_Implementing_the_MVC_Design_Pattern_in_ASPNET.1">http://aspalliance.com/1562_Implementing_the_MVC_Design_Pattern_in_ASPNET.1</a></li>
</ul>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.chonla.com%2F2009%2F01%2Fmvc-design-pattern-%25e0%25b9%2584%25e0%25b8%25a1%25e0%25b9%2588%25e0%25b9%2583%25e0%25b8%258a%25e0%25b9%2588%25e0%25b8%2581%25e0%25b8%25b2%25e0%25b8%25a3%25e0%25b9%258c%25e0%25b8%2595%25e0%25b8%25b9%25e0%25b8%2599-mavel-comic-%25e0%25b8%2599%25e0%25b8%25b0%25e0%25b9%2580%25e0%25b8%259f%25e0%25b9%2589%2F&amp;title=MVC%20Design%20Pattern%20%28MVC%20%E0%B9%84%E0%B8%A1%E0%B9%88%E0%B9%84%E0%B8%94%E0%B9%89%E0%B8%A2%E0%B9%88%E0%B8%AD%E0%B8%88%E0%B8%B2%E0%B8%81%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%8C%E0%B8%95%E0%B8%B9%E0%B8%99%20Mavel%20Comic%20%E0%B8%99%E0%B8%B0%E0%B9%80%E0%B8%9F%E0%B9%89%E0%B8%A2%29" id="wpa2a_6"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2009/01/mvc-design-pattern-%e0%b9%84%e0%b8%a1%e0%b9%88%e0%b9%83%e0%b8%8a%e0%b9%88%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%8c%e0%b8%95%e0%b8%b9%e0%b8%99-mavel-comic-%e0%b8%99%e0%b8%b0%e0%b9%80%e0%b8%9f%e0%b9%89/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>

