<?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>S i X h E a D { ? } &#187; eval</title>
	<atom:link href="http://sixhead.com/tag/eval/feed/" rel="self" type="application/rss+xml" />
	<link>http://sixhead.com</link>
	<description>เมื่อความรู้มีไว้แบ่งปัน</description>
	<lastBuildDate>Mon, 27 Feb 2012 06:23:10 +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>ลองเล่นกัน eval()</title>
		<link>http://sixhead.com/2008/02/27/php-eval/</link>
		<comments>http://sixhead.com/2008/02/27/php-eval/#comments</comments>
		<pubDate>Tue, 26 Feb 2008 17:41:02 +0000</pubDate>
		<dc:creator>Pipo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[eval]]></category>

		<guid isPermaLink="false">http://sixhead.com/2008/02/27/php-eval/</guid>
		<description><![CDATA[คำจำกัดความแบบให้เข้าใจง่ายๆ เลยก็คือ นำข้อความใน string มารันในแบบ PHP ได้ (ถ้าเป็น javascript, ภาษาอื่นๆ&#160; ก็ทำงานลักษณะเดียวกัน) ยกตัวอย่างง่ายๆ นะครับ ถ้าเราต้องมีสูตรคำนวณหลายๆ สูตรใน 1 project เราก็อาจจะต้องเขียน function สำหรับใช้แต่ละสูตรเลยทีเดียว ทำให้ลำบากมากถ้า project นั้นมีสูตรที่ใช้คำนวณเยอะๆ และยิ่งถ้าต้องสามารถเพิ่มเติมสูตรได้ในอนาคตยิ่งไปกันใหญ่ มาดูตัวอย่างง่ายๆ กันเลย $intN = 10; $strCal = '(($intN-5)^2) + ((10)^2)'; $strCal = preg_replace&#40;&#34;/\((.*?)\^(.*?)\)/&#34;, &#34;pow($1,$2)&#34;, $strCal&#41;; &#160; echo $strCal; echo &#34;\n&#34;; &#160; eval&#40;&#34;\$strCal = $strCal;&#34;&#41;; echo $strCal; ผลการรันโปรแกรมด้านบน pow(($intN-5),2) + pow((10),2) 125 [...]]]></description>
			<content:encoded><![CDATA[<p>คำจำกัดความแบบให้เข้าใจง่ายๆ เลยก็คือ นำข้อความใน string มารันในแบบ PHP ได้ (ถ้าเป็น javascript, ภาษาอื่นๆ&nbsp; ก็ทำงานลักษณะเดียวกัน) ยกตัวอย่างง่ายๆ นะครับ ถ้าเราต้องมีสูตรคำนวณหลายๆ สูตรใน 1 project เราก็อาจจะต้องเขียน function สำหรับใช้แต่ละสูตรเลยทีเดียว</p>
<p><span id="more-28"></span> ทำให้ลำบากมากถ้า project นั้นมีสูตรที่ใช้คำนวณเยอะๆ และยิ่งถ้าต้องสามารถเพิ่มเติมสูตรได้ในอนาคตยิ่งไปกันใหญ่ มาดูตัวอย่างง่ายๆ กันเลย</p>
<pre class="php"><span style="color: #0000ff;">$intN</span>	=	<span style="color: #cc66cc;">10</span>;
<span style="color: #0000ff;">$strCal</span>	=	<span style="color: #ff0000;">'(($intN-5)^2) + ((10)^2)'</span>;
<span style="color: #0000ff;">$strCal</span>	=	<a href="http://www.php.net/preg_replace"><span style="color: #000066;">preg_replace</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;/<span style="color: #000099; font-weight: bold;">\(</span>(.*?)<span style="color: #000099; font-weight: bold;">\^</span>(.*?)<span style="color: #000099; font-weight: bold;">\)</span>/&quot;</span>, <span style="color: #ff0000;">&quot;pow($1,$2)&quot;</span>, <span style="color: #0000ff;">$strCal</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> <span style="color: #0000ff;">$strCal</span>;
<a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>;
&nbsp;
<a href="http://www.php.net/eval"><span style="color: #000066;">eval</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\$</span>strCal = $strCal;&quot;</span><span style="color: #66cc66;">&#41;</span>;
<a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> <span style="color: #0000ff;">$strCal</span>;</pre>
<p>ผลการรันโปรแกรมด้านบน</p>
<pre>
pow(($intN-5),2) + pow((10),2)
125
</pre>
<p>อธิบายการทำงานดังนี้<br />
1. จากตัวอย่างเรามี ค่า input คือ $intN โดยมีสูตรคือ (($intN-5)^2) + ((10)^2)<br />
2. ใน PHP ถ้าจะยกกำลังต้องแปลง ^ ให้เป็น function pow() เสียก่อน ก็เลยใช้ regular expression (preg_replace) เข้าช่วย<br />
3. การ echo รอบแรกเพื่อแสดงสูตรที่เปลี่ยนเป็นค่า pow ไปแล้วและพร้อมทำการคำนวณ<br />
4. eval เป็นการสั่งให้ ตัวแปร $strCal นั้นทำการรับค่าจาก $strCal ตัวที่เป็นสูตรอีกที (พอดีตั้งตัวแปรซ้ำกันจะได้ไม่เปลือง)<br />
5. echo รอบ 2 ก็แสดงผลที่ได้จากการสั่ง eval นั่นเอง</p>
<p>ทีนี้การประยุกต์ใช้เหรอครับ จะมีกี่สูตรก็ไม่สนใจแล้ว เก็บแต่ละสูตรลง database ไปเลย แต่อาจจะต้องมีหน้า ทดสอบการรันสูตรใน backend ด้วย จะได้ตรวจสอบการทำงาน ว่าทำได้ถูกต้องหรือไม่</p>
<p><map name='google_ad_map_28_f21c57aff87a446f'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/28?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_28_f21c57aff87a446f' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=28&amp;url= http%3A%2F%2Fsixhead.com%2F2008%2F02%2F27%2Fphp-eval%2F' /></p>]]></content:encoded>
			<wfw:commentRss>http://sixhead.com/2008/02/27/php-eval/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

