กระทู้รณรงค์ ตอน "มาเขียน php แบบ OOP กันเถอะ" คือผมก็เห็นว่า community ที่นี่มีคนเก่งเยอะ
คือผมก็เห็นว่า community ที่นี่มีคนเก่งเยอะพอสมควร
จะเป็นการดีถ้าจะเริ่มสอนคนที่เขียน php แบบ functional ให้เปลี่ยนมาเขียนแบบ OOP
เพราะที่ community นี้จะมีคนให้ถามเยอะครับ ^^
โดยส่วนตัวแล้วผมเห็นว่า หลายๆคนเริ่มเขียนแบบแยกไฟล์กันแล้ว แต่ก็ยังมีอีกหลายๆ คนยังเขียนแบบยาววววว ยืดกันอยู่
(สังเกตจาก code ที่เอามาถามกันน่ะคับ) ผมก็เลยเห็นว่าตอนนี้ภาษาอื่นๆ ก็พัฒนาไปค่อนข้างไกลแล้ว (support OO กันหมดแล้ว)
ผมก็เลยอยากให้เพื่อนๆ พัฒนาโคดเป็นแบบ OO กันให้มากขึ้นน่ะคับ ผมว่านะเขียนแบบ OOP โคดของเราจะเป็นระเบียบมากขึ้นคับ
จะเขียน php แบบ OOP ต้องใช้ PHP 5 ขึ้นไปนะคับ
ใครรู้ตัวว่าเก่ากว่า 5 upgrade ตามโลกได้แล้วนะคับ
(ตอนนี้ php 6 ก็กำลัง develop กันอยู่แล้วนะคับ)
ถ้าใครสงสัยว่า OO หรือ OOP คืออะไรลองอ่าน ที่นี่ดู
ส่วนว่าจะเริ่มเขียนยังไง ที่จริงที่ thaicreate ก็(เกือบจะ)มี tutorial เกี่ยวกับ class แล้ว ที่นี่ แต่เห็นว่ายังไม่เสร็จคับ
พอดีผมไป search เจอการเขียน php oop เบื้องต้นที่เป็นภาษาไทยลองเข้าไปดูๆ กันได้ ที่นี่ คับ
ส่วนผมลองเขียน แบบ OOP ง่ายๆ พอเป็นแนวคิดมาให้ดูมาให้ลองรันกันดูคับ
เป็นตัวอย่างการเขียนติดต่อกะ db เพื่อดึงข้อมูลธรรมดาคับ
เพียงแต่ถ้าเราเขียน OOP แบบนี้แล้ว sql เราจะรวมอยู่ที่ class class เดียว ไม่กระจัดกระจายไปหลายๆ ไฟล์
สามารถ reuse ได้หลายรอบโดยไม่ต้องเขียนใหม่
Code (PHP)
<?php
class CReturn {
const FAIL = false;
const SUCCESS = true;
public static function error($error_msg){
return array(self::FAIL, $error_msg);
}
public static function success($value){
return array(self::SUCCESS, $value);
}
}
class initDb {
private static $host = "localhost";
private static $user = "root";
private static $pass = "mysql";
private static $db = "db_test1";
public static function connect(){
$db_conn = mysql_pconnect(self::$host, self::$user, self::$pass) or die(mysql_error());
mysql_select_db(self::$db, $db_conn) or die(mysql_error());
mysql_query("SET NAMES UTF8;");
return $db_conn;
}
}
class DbAbstract {
protected $db_conn;
protected $table_name;
public $_data;
public function __construct($db_conn){
$this->db_conn = $db_conn;
}
protected function _get($sql){
$this->_data = null;
$result = mysql_query($sql);
if(mysql_errno($this->db_conn) !== 0)
return CReturn::error("Mysql error [".mysql_errno($this->db_conn)."] : ".$sql."<br />".mysql_error($this->db_conn));
while($res = mysql_fetch_assoc($result)) {
$this->_data[] = $res;
}
return CReturn::success(mysql_num_rows($result));
}
protected function getTableName(){
return $this->table_name;
}
public function getAll(){
return $this->_get("SELECT * FROM {$this->getTableName()}");
}
}
class DbTable1 extends DbAbstract {
protected $table_name = "table1";
public function getById($id){
return $this->_get("SELECT * FROM {$this->getTableName()} WHERE user_id = {$id}");
}
}
print "<pre>";
$db_conn = initDb::connect();
// แบบ error
$oTb1 = new DbTable1($db_conn);
list($result, $value) = $oTb1->getById("id_is_not_string");
print "<b>Query result</b> = ".var_export($result,true)."<br />";
print "<b>Num rows/Error msg</b> = '".$value."'<br />";
print "<b>data</b> = ".var_export($oTb1->_data,true)."<br />";
print "<br />";
// แบบ ดึงข้อมูลไม่เจอหรือไม่มีใน db
$oTb1 = new DbTable1($db_conn);
list($result, $value) = $oTb1->getById(5);
print "<b>Query result</b> = ".var_export($result,true)."<br />";
print "<b>Num rows/Error msg</b> = ".var_export($value,true)."<br />";
print "<b>data</b> = ".var_export($oTb1->_data,true)."<br />";
print "<br />";
// แบบดึงข้อมูลได้ 1 record
$oTb1 = new DbTable1($db_conn);
list($result, $value) = $oTb1->getById(1);
print "<b>Query result</b> = ".var_export($result,true)."<br />";
print "<b>Num rows/Error msg</b> = ".var_export($value,true)."<br />";
print "<b>data</b> = ".var_export($oTb1->_data,true)."<br />";
print "<br />";
// แบบดึงข้อมูลได้หลาย records
list($result, $value) = $oTb1->getAll();
print "<b>Query result</b> = ".var_export($result,true)."<br />";
print "<b>Num rows/Error msg</b> = ".var_export($value,true)."<br />";
print "<b>data</b> = ".var_export($oTb1->_data,true)."<br />";
print "<br />";
?>
ส่วน db ใช้แค่
Code sql
CREATE TABLE `table1` (
`user_id` int(11) NOT NULL auto_increment,
`fname` varchar(255) collate utf8_unicode_ci NOT NULL,
`lname` varchar(255) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
INSERT INTO `table1` (`user_id`, `fname`, `lname`) VALUES
(1, 'นายกอ', 'ไก่'),
(2, 'นายขอ', 'ไข่');
ลองดูกันคับ
"ความคิดเปลี่ยน อนาคตก็เปลี่ยน แค่เปิดใจ"
ถ้าเราไม่เริ่มพัฒนาตัวเองตั้งแต่วันนี้ แล้วเราจะเริ่มวันไหน ใช่มั๊ยครับ !!
ร่วมสร้างสรรค์ community นี้ให้ดียิ่งๆ ขึ้นไปคับ
สงสัยเรื่องอะไรโพสถามพี่ๆ เค้าได้เลยคับTag : - - - -
Date :
2009-05-14 11:58:32
By :
nut_t02
View :
139925
Reply :
419
ยกตัวอย่างได้ดีมาก ๆ ครับ
Date :
2009-05-14 12:08:15
By :
webmaster
เห็นด้วยครับ ไม่ต้องไปคิดว่ามันยากน่ะครับ เพราะมันง่ายมากๆเลยอาจจะง่ายกว่า function อีกพอดีเคยเขียนอยู่
ของดีต้อง +1 ครับ
Date :
2009-05-14 12:18:28
By :
kanchen
กำลังพยายามให้เป็น OOP แต่ก้อชอบเผลอเขียนแบบ ฟังก์ชั่น (เพระมันชิน ฮ่า ๆ )
Date :
2009-05-14 12:29:58
By :
หนุ่มคุง
สิ่งดีๆ ที่ควรปักหมุด เผื่อมีใครเอาโค๊ดดีๆ มาแปะอีก อิอิ
Date :
2009-05-14 12:55:22
By :
plakrim
ว่าจะลองเขียนหลายทีแล้ว
แต่ไม่มีเวลาซักที งานหน้าต้องลองใช้ดู
(ถ้ามันไม่เร่งนะ)
Date :
2009-05-14 20:14:42
By :
ttong
ผมว่าพอเราเขียนกันไปซักพักนึง ก็น่าจะพอรวบรวมโคดที่เราเอามา share กันออกมาได้เป็น framework ตัวนึงได้
ทีนี้ล่ะ เราก็จะมี framework สำเร็จรูปที่สร้างด้วยฝีมือพวกเราเองจริงๆ สามารถเอาไป apply กับโปรเจคใดๆ ก็ได้
เพียงแค่เปลี่ยนโคดนิดหน่อยเท่านั้นเอง
โดย framework ตัวนี้ไม่ได้เลิศเลออย่างจูมล่า หรือแมมโบ ที่แทบจะไม่กล้าแก้ core อะไรเลยเพราะกลัวทำงานไม่ได้
โดย framework ตัวนี้ก็ไม่ได้แย่ขนาดที่ทำออกมาแล้วใช้ได้แค่โปรเจคเดียว
ร่วม share กันไปคับ
เดี๋ยวก็สำเร็จเอง
โดยส่วนตัวแล้วผมก็พอมีที่ทำๆ เอาไว้บ้าง
รวมรวบ lib โน้น lib นี้มารวมกัน พยายามทำให้ configurable มากที่สุดเท่าที่จะเป็นไปได้
อาจไม่สมบูรณ์ เท่าใดนัก เพราะเขียนด้วยความรู้อันน้อยนิด
ก็รออาศัยเทพทั้งหลายในนี้ช่วยขัดเกลาเอาล่ะคับ แหะๆ ^^'
จะผิดจะถูกอย่างไรถ้าสงสัยก็โพสถามเลยคับ
แล้วมาช่วยกันเกลา
"ถ้ายังไม่คิดพัฒนา เราก็ยังล้าหลังเหมือนเดิมนะคับ"
ปล. ดูเหมือนเรื่อง OOP ที่นี่ยังไม่ค่อยเป็นที่น่าสนใจของคนทั่วไปในนี้นะคับ
ตัวอย่าง ก็เริ่มมีให้เห็น อันที่จริงเห็นมานานแล้วมากกว่าว่า concept การเขียนโปรแกรมแบบเดิมมันไม่ได้ผล
แต่ก็ไม่ได้สนใจที่จะเปลี่ยนแปลงมัน - -'
Date :
2009-05-14 20:42:16
By :
nut_t02
ขอคุณกระทู้นี้ และท่านเทพฯ ทั้งหลายนะครับ
Date :
2009-05-14 22:16:27
By :
panyapol
ทำไมหลายคนไม่ใช้ OOP
ตามความคิดของผมเอง ที่ประสบมาคือ
1. OOP จริงๆแล้ว ต้องมีประโยชน์ในการ reuse เป็นอันดับแรกในการเลือก สำหรับการออกแบบคลาส แล้วจะต้องสามารถ ถ่ายทอดคุณสมบัติ และมีแพทเทิร์นที่วางกันไว้ก่อน และควรจะมีเอกสารกำกับเพื่อคนที่ใช้จะได้สามารถเอาไปปรับใช้ได้ถูกต้อง ซึ่งต้องใช้เวลาการออกแบบคลาสให้ เป็นกลางๆ ไม่มากไม่น้อยไปสำหรับ เบสคลาส
2. เรื่อง interface กับ abstract class หลายๆคนยังไม่เข้าใจวิธีการทำงานของมัน ซึ่งมีเพิ่มขึ้นใน php5 นี้ ซึ่งหลักการทำงานของมัน อาจทำให้ Over head สำหรับหลายๆคน ทำให้ทำงานหนักมากกว่าเขียนแบบธรรมดามาก
3. การเขียนโดยใช้ OOP เป็นการทำให้เครื่อง ทำงานหนักเกินจำเป็น ในหลายกรณี
4. OOP ใน php ยังไม่สามารถเทียบกับภาษาอื่นได้ ซึ่งจะสามารถใช้แพทเทิร์น ต่างๆที่มีความแตกต่างกันได้หลากหลายตามแต่กรณีที่จำเป็น (แต่ตอนนี้ ก็ มี abstract กับ interface ให้ใช้)
5. เรื่องการออกแบบให้เป็นกลาง และสามารถปรับปรุงคลาสโดยการ inherit, implement นั้นเป็นงานที่ยากมาก มีเรื่อง scop ให้ต้องวางไว้ก่อน และการออกแบบกับโปรเจกต์บางที อาจมีส่วนที่ต้อง hard code ซึ่งเป็นส่วนที่ไม่สมควรใน Object คับ
6. คนที่จะใช้ OOP กับงานได้จริงๆนั้น ยังหาได้น้อยเพราะว่าจะใช้กับงานได้จริง ก็ต้องชำนาญพอสมควรก่อน ไม่งั้น ยังไงก็ต้องมานั่งแก้โค้ด ในคลาส ซึ่งอาจมีปัญหากับคลาสต่างๆ ที่สืบทอดกันไป ทำให้มีความเสี่ยงสูง
7. ผมว่า OOP เหมาะสำหรับโปรเจกต์ขาดกลาง ขึ้นไป ถึงจะคุ้มค่า
8. php เองไม่ค่อยมี library ให้เรียนมากซึ่งต่างกันกับภาษาอื่น ที่จำเป็นต้องเรียน standard library ซึ่งเป็น OOP มากมาย เช่น Java, Ruby เพราะ php เองเน้นให้ใช้งานแบบทั่วไปได้ไม่ค่อยเจาะจง และทำให้เรียนได้ง่ายกว่า(การตลาด) แต่ก็มี library ภายนอกหลายตัวที่ใช้ OOP ของ php5 ซึ่งคนส่วนใหญ่มักไม่ค่อยได้ใช้ library ภายนอกกัน
http://gunner.freetzi.com
Date :
2009-05-15 13:40:22
By :
pjgunner
ขอแก้โค้ดตัวเองหน่อยนะคับ ไม่รู้ว่าจะทำงานไหม ผมก็ยังไม่แน่ใจ ไม่รู้ว่า interface ประกาศเป็น static ได้ไหม
Code (PHP)
<?php
interface DBConnect{
public static function defaultConnect();
public static function connect();
}
class MySQLConnect implements DBConnect{
const DEF_HOST = 'localhost';
const DEF_USER = 'root';
const DEF_PASSWORD = '';
const DEF_DB = 'dbhanler';
public static function defaultConnect(){
return self::connect(self::DEF_HOST, self::DEF_USER, self::DEF_PASSWORD, self::DEF_DB);
}
public static function connect($host, $user, $pass, $db_name, $pconnect = false){
global $conn;
if($pconnect)
$conn = mysql_pconnect($host, $user, $pass);
else
$conn = mysql_connect($host, $user, $pass);
if(!$conn) exit( mysql_error() );
if( !mysql_select_db($db_name, $conn) ) exit('Cannot select database.');
mysql_query("SET NAMES UTF8");
return $conn;
}
}//DBHandler class
?>
Date :
2009-05-15 15:54:07
By :
pjgunner
ลืมบรรทัดที่ 4 ไปนิดนึงนะคับ
Code (PHP)
<?php
interface DBConnect{
public static function defaultConnect();
public static function connect($host, $user, $pass, $db_name, $pconnect = false);
}
class MySQLConnect implements DBConnect{
const DEF_HOST = 'localhost';
const DEF_USER = 'root';
const DEF_PASSWORD = '';
const DEF_DB = 'dbhanler';
public static function defaultConnect(){
return self::connect(self::DEF_HOST, self::DEF_USER, self::DEF_PASSWORD, self::DEF_DB);
}
public static function connect($host, $user, $pass, $db_name, $pconnect = false){
global $conn;
if($pconnect)
$conn = mysql_pconnect($host, $user, $pass);
else
$conn = mysql_connect($host, $user, $pass);
if(!$conn) exit( mysql_error() );
if( !mysql_select_db($db_name, $conn) ) exit('Cannot select database.');
mysql_query("SET NAMES UTF8");
return $conn;
}
}//DBHandler class
?>
Date :
2009-05-15 16:23:38
By :
nut_t02
ผมก็อยากเขียนแนว oop นะครับ แต่เพื่อนร่วมงานเขาไม่เขียนนี้ซิ
เราเลยต้องเลยตามเลย
พวก framework ทั้งหลายก็อยากใช้ แต่ไม่ได้ใช้ซักที
อย่างว่าแหละครับไม่มีเวลาให้ทดลอง ทำเอาของใหม่มา
พอถึงกำหนดส่ง แล้วมันไม่ไ้ด้อย่างหวัง ก็โดนปรับ โดนด่าไปอีก
Date :
2009-05-15 17:17:37
By :
kuznetsova
555 อันนี้ผมก็เป็นคับ
ผมเลยใช้วิธีทำนอกเวลา แล้วเอาผล + วิธีเขียนมาให้ดูคับ
แล้วบอกว่ามันทำให้ชีวิตง่ายขึ้นอย่างไร
ได้ผลคับตอนนี้ศึกษากันใหญ่เลย !!
แต่ทั้งนี้ทั้งนั้นปัญหาหลักๆ น่าจะเป็นที่ผู้อาวุโสกว่าเราทั้งหลายใน office
เค้าอาจจะไม่ค่อยเห็นด้วยที่จะมีการเปลี่ยนแปลงอะไร
เอาเป็นว่าคิดว่าจะเริ่มผมก็ยินดีด้วยแล้วคับ
ดีกว่าอ่านประทู้นี้แล้วปล่อยผ่านมันต่อไป
Date :
2009-05-15 17:26:34
By :
nut_t02
สิ่งไหนที่คิดว่าดี ควร หรือว่าไม่เหมาะสมอย่างไร ให้ผู้ใช้งานเลือกเอาครับ ว่าสะดวกอันไหน แต่ทุกความคิด ที่สนุบสนุนการเป็น Web Programmer ที่ดีผมก็ยินดีสนับสนุนครับ
หุหุ
Date :
2009-05-15 17:30:03
By :
ddsure
กำลังหัดเขียนอยุ่อะ
ชอบๆ เพลินดีครับ
ยังไม่ชำนาญเท่าไร
ผลงานล่าสุดของผม ก้เขียนปฏิทินด้วย OOP เนี้ยแหละ
http://www.danya-reload.com/home/article/viewArticle.php?id=42
Date :
2009-05-15 18:14:59
By :
danya
php จำเป็นต้อง backward compatibility สำหรับ oop ใน php4 ดังนั้น เมธอดที่ ไม่ได้เป็น static ก็ยังสามารถถูกเรียกได้ โดยไม่จำเป็นสต้องสร้าง instance แต่ไม่ควรอย่างยิ่งสำหรับการใช้งานแบบนี้นะครับ
ตย.
class Test{
public function tt(){
echo 'Test';
}
}
Test::tt(); // ทำงาน
สมมติว่า ลอง ให้เมธอดนี้ เรียกใช้ reference ของตัวเอง
class Test{
public $ok = 'ok';
public function tt(){
echo $this->ok;
}
}
Test::tt(); // คราวนี้ Error
ซึ่งอาจเป็นกับดัก ในการโค้ดนะครับ ควรออกแบบตามสถาปัตยกรรมใหม่ โดยใช้ static แยก เพื่อให้บ่งบอกสถานะการเรียกใช้ ว่า static ไม่สามารถใช้ reference ของตัวเองได้
Date :
2009-05-15 19:34:35
By :
pjgunner
ผมเองกะว่าจะใช้ OOP กับโปรเจกต์ที่กำลังวางแผนไว้ หลังจากศึกษา javascript library ตัวหนึ่ง
เห็นกระทู้นี้ ก็เลยมาชำเลืองดูก่อน
แต่ว่า OOP ใน php ยังไม่เป็น แบบ stable หรือ standard ซักเท่าไหร่ หลังจากลองอ่านดู OOP สำหรับ php 5
ซึ่งปัจจุบันผมใช้ php 2.2.3
As of PHP 5.3.0, it's possible to reference the class using a variable. Keywords like self, parent or static are not allowed in dynamic class references.
ตย.
Code (PHP)
<?php
// Copy from php manual ^^!
class Foo
{
public static $my_static = 'foo';
public function staticValue() {
return self::$my_static;
}
}
class Bar extends Foo
{
public function fooStatic() {
return parent::$my_static;
}
}
print Foo::$my_static . "\n";
$foo = new Foo();
print $foo->staticValue() . "\n";
print $foo->my_static . "\n"; // Undefined "Property" my_static
print $foo::$my_static . "\n"; // ตามที่เข้าใจ น่าจะบรรทัดนี้ ว่า ไม่ควร
$classname = 'Foo';
print $classname::$my_static . "\n"; // หรือว่าจะ บรรทัดนี้
print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";
?>
ดังนั้นควรใช้ Foo::$my_satatic; จะดีกว่านะคับ
ผมเองก็ยังไม่ได้ไปอ่านรายละเอียด OOP ที่น่าจะ stable ของ php6
Date :
2009-05-15 19:58:07
By :
pjgunner
โอ้ว เป็นประโยชน์มาก ขอบคุณคับ
สำหรับความรู้คับ
สำหรับ php 6 ผมอ่านคร่าวๆ (คร่าวมากๆ เพราะอ่านไม่ค่อยออก เหอๆ)
แต่ถ้ามีความรู้เกี่ยวกับ js lib ผมก็เอานะคับ
ตอนนี้ผมใช้ jquery เป็นแค่พื้นๆ นิดหน่อย แล้วก็ต้องไปหัดใช้ ext js อีกตัว
ตอนนี้ผมก็กำลังลองผิดลองถูกเหมือนกัน
ยังไงก็ share กันได้นะคับ ^^
(อันที่จริงต้องเรียกว่าผมมาขอความรู้ถึงจะถูก หุหุ)
Date :
2009-05-15 22:50:42
By :
nut_t02
ext รู้สึกจะไม่ฟรีแล้วนะครับ
Date :
2009-05-15 23:22:34
By :
plakrim
กำลังหัดเหมือนกันครับ
ตอนแรกมีหนังสือ แล้วอ่านเห็นผ่านๆ
แต่ไม่ได้ลองศึกษาจริงๆ
เวลาเขียน ก็เขียนแค่
Ex. My Code
<?
class db
{
public function query ($cmd)
{
return @mysql_query ($cmd);
}
public function fetch ($cmd)
{
return @mysql_fetch_array ($cmd);
}
public function num ($cmd)
{
return @mysql_num_rows (self::query ($cmd) );
}
public function quickfetch ($cmd)
{
return self::fetch ( self::query ($cmd) );
}
public function connect ()
{
global $data;
$connect = @mysql_connect ($data['host'], $data['user'], $data['pass']);
@mysql_select_db ($data['db']);
return $connect;
}
public function close ($con = "")
{
@mysql_close ($con);
}
}
?>
ผมใช้แค่นี้เองครับ แถมใส่ $db = new db(); ไว้ในหน้าพวก config ที่จะต้องถูก include โดยหน้าอื่นๆ
สรุปคือ ทำไว้เท่ๆ ไปงั้น
ตอนนี้เขียนเว็บบอร์ดเล่นๆ ตอนเริ่มก็ยังไม่เห็นกระทู้นี้ เลยอัด function ไปยาวเลย
พอมาเห็นกระทู้นี้เลยลองหยิบหนังสือ PHP มาอ่าน OOP ดู
ตอนนี้เพิ่งมาเปลี่ยนเป็น OOP ไป คลาส 2 คลาสเองครับ (คิดไม่ออกว่าจะใช้ยังไงดี)
เลยอยากให้ ท่านไหนใจดี มาช่วยเด็ก ม.4 คนนี้ คิดหน่อยครับ ว่าจะใช้ยังไงดี
ใครอยากช่วยคิดก็แอดมาเลยครับ bank[at]th-gaming.com
ปล. ไม่ได้ใช้ในเชิงพาณิชย์แน่นอนครับ ลองเขียนเล่นๆ ไว้ใช้เอง ก่อนเปิดเทอม งุงิ
Date :
2009-05-15 23:37:36
By :
PoseidonX
รู้สึกว่าถ้าเพื่อการศึกษาจะยังฟรีอยู่นะคับ
แต่ถ้าเพื่อธุรกิจคงต้องซื้อ license อยู่
Date :
2009-05-15 23:43:10
By :
nut_t02
เพื่อการศึกษา มันจะได้ใช้กี่ครั้งเนี้ย
Date :
2009-05-15 23:44:47
By :
plakrim
ผมก็กำลังเขียน database แบบ oop อยู่
อีกประมาณ 3 ปีก็เสร็จแล้วล่ะ (ล้อเล่นได้ประมาณ 90% แล้ว) เหลือ debug อีกหน่อย
Date :
2009-05-16 01:02:21
By :
num
นี่ก็เยี่ยมคับ ไว้เอามาแชร์กันนะคับ
หนับหนุนความคิดดีดี แหะๆ
Date :
2009-05-16 07:21:01
By :
nut_t02
ขอโทษนะคับ ผมเพิ่งเข้าไปดูปฏิทิน rep No. 16 เยี่ยมมากคับ
ถ้าประยุกต์กะ ajax หน่อยคงสามารถเขียน note ลงไปได้ เหมือน google calendar เลย
ถ้าเขียนได้ แล้วก็คงมีแนวความคิดแล้วล่ะคับ ว่า google doc ทำงานยังไง
พอเป็น idea ไปทำอย่างอื่น
ปล ผมชอบนะที่คุณเขียน comment ด้วยใครที่อ่าน code ไม่ค่อยรู้เรื่องก็เดาๆ ได้จาก comment นี่แหละ
อันที่จริง comment ควรเขียนประมาณนี้อ่ะคับ เพราะ tool บางตัวสามารถนำ comment มาแสดงได้เช่น เขียนโคดแบบนี้
Code (PHP)
<?php
/**
* Enter description here...
*
*/
class test {
/**
* Enter description here...
*
* @param string $d (1-31)
* @param string $m (1-12)
* @param string $y
* @return integer
*/
public function getWeek($d = '', $m = '', $y = '')
{
$day = date('j');
$month = date('n');
$year = date('Y');
if ( is_numeric($d) && $d > 0 ) $day = $d;
if ( is_numeric($m) && $m > 0 ) $month = $m;
if ( is_numeric($y) && $y > 0 ) $year = $y;
$firstWeek = date('w', mktime( 0, 0, 0, $month, 1, $year));
return ceil( ( $day + $firstWeek ) / 7 );
}
}
?>
เวลา tool ที่ใช้เขียนจะแสดงแบบนี้คับ
จะเป็นประโยชน์มากสำหรับคนที่นำไปใช้ต่อ ลองนึกดูสิว่าถ้าเรามีโคดยาวๆ เยอะๆ หลายบรรทัด หรือบางทีแยกออกเป็นหลายไฟล์
คงจะไม่มีคนไปนั่งไล่หรอกคับ ว่า function นี้รับ parameter อะไร return อะไรยังไง
เค้าก็อาศัยดูไอ้ตรงนี้อ่ะแหละ อีกอย่างนะคับ comment ที่ผมเขียนให้ดูมาสามารถใช้ phpDocumentor gen
ออกมาเป็นรูปแบบ html สวยๆ ได้ เช่น ที่นี่คับ
อ่อ อีกเรื่องนึงคับ (หลายเรื่องจังแหะ )
programmer เราๆ ท่านๆ เนี่ยส่วนใหญ่ไม่ค่อย validate parameter ที่รับเข้ามากันคับ
อย่างน้อยก็ควรมีการดัก error ไว้ จะไม่ validate ก็ได้ถ้าใช้คนเดียว
หรืออย่างน้อยก็มีค่า default ให้ดูเป็นตัวอย่าง ซึ่งค่า default นี่อย่างน้อยก็ให้ program ทำงานต่อได้โดย
ไม่ error ออกมา php fatal error หรือ php warning คับ
แพร่มซะยาวเลยผม
เด๋วผมขอเอาไปใช้มั่งนะคับ ปฏิทินนี่ ^^
Date :
2009-05-16 08:02:13
By :
nut_t02
rep 16. เขียน calendar ได้ขนาดนี้ไม่ใช่มนุษย์แล้วครับ (เหนือมนุษย์) อิๆ
Date :
2009-05-16 08:37:46
By :
num
ทดสอบใหม่อีกรอบ เพราะลืมเรื่อง dynamic paramiter ไป
Code (PHP)
<?php
interface DBConnect{
public static function connect($host ='', $user ='', $pass ='', $db_name ='', $flag ='');
public static function endConnection();
}
?>
Code (PHP)
<?php
class MySQLConnect implements DBConnect{
const DEF_HOST = 'localhost';
const DEF_USER = 'root';
const DEF_PASSWORD = '';
const DEF_DB = 'mysql';
//@implement inteface DBConnect::connect()
public static function connect($host = self::DEF_HOST, $user = self::DEF_USER, $pass = self::DEF_PASSWORD, $db_name = self::DEF_DB, $flag = false){
global $conn;
if($flag)
$conn = mysql_pconnect($host, $user, $pass); // persistent connection
else
$conn = mysql_connect($host, $user, $pass);
if(!$conn) exit( mysql_error() );
if( !mysql_select_db($db_name, $conn) ) exit('Cannot select database.');
mysql_query("SET NAMES UTF8");
return $conn;
}
//@implement interface DBConnect::endConnection()
public static function endConnection(){
return mysql_close($conn);
}
}//MySQLConnect class
?>
Code (PHP)
<?php
// ไม่เคยใช้ oracle แต่ลองมั่วๆ ตามแมนน่วนดู ไม่รู้ว่าจะทำงานป่าว
class OracleConnect implements DBConnect{
const DEF_USER = 'root';
const DEF_PASSWORD = '';
const DEF_DB = 'oracle';
//@implement interface DBConnect::connect()
public static function connect($host='', $user = self::DEF_USER, $pass = self::DEF_PASSWORD, $db_name = self::DEF_DB, $flag = ''){
global $conn;
if($flag) //if 1
if( is_array($flag) ){//if 2
foreach($flag as $key=>$val)
$$key = $val;
if($charset && $session_mode)
$conn = ocilogon($user, $pass, $db_name, constant($charset), constant($session_mode));
else if($charset)
$conn = ocilogon($user, $pass, $db_name, constant($charset));
else if($session_mode)
$conn = ocilogon($user, $pass, $db_name, NLS_LANG, constant($session_mode));
else
exit('พารามิเตอร์ไม่ถูกต้อง'); // หรือ trow Exception
}else{ // if 2
$conn = ocilogon($user, $pass, $db_name, constant($flag));
}
else //if 1
$conn = ocilogon($user, $pass, $db_name);
if(!$conn) exit('Error: connect to oracle.');
return $conn;
}
//@implement interface DBConnect::endConnect()
public static function endConnection(){
return oci_close($conn);
}
}//end OracleConnect
?>
ปล.ยังไม่สามารถทีละหลาย คอนเน็คชั่นได้ แค่ทดสอบเขียนดู
Date :
2009-05-16 09:52:37
By :
pjgunner
ลืมสร้าง Factory class ให้ด้วย - -!
Code (PHP)
<?php
//คลาสโรงาน ^^
class DBConnectFactory{
//to establish default connection
public static function createDefaultConnection($db_type ='MySQL'){
switch($db_type){
case 'MySQL':
return MySQLConnect::connect();
break;
case 'Oracle':
return OracleConnect::connect();
break;
default:
exit("Sory No Connection to '$db_type' database");
}
}
//to establish user connection
public static function createConnection($db_type = 'MySQL', $host='', $user ='', $pass ='', $db_name ='', $flag =''){
switch($db_type){
case 'MySQL':
return MySQLConnect::connect($host, $user, $pass, $db_name, $flag);
break;
case 'Oracle':
return OracleConnect::connect($host, $user, $pass, $db_name, $flag);
break;
default:
exit("Sory No Connection to '$db_type' database");
}
}
}// DbConnectFactory class
?>
Date :
2009-05-16 10:11:17
By :
pjgunner
มันช่างน่าปวดหัว... มากกว่าที่โรงเรียนอีก ฮ่าๆ
ปล. public function กับ public static function มันแสดงผลเหมือนกันหรือเปล่าครับ เห็นในหนังสือบอกว่าให้ผลเหมือนกัน แล้วก็ static ใช้กับตัวแปร แล้วเรียกแบบ function::$var; อะครับ หรือมันเปลี่ยนไปแล้วหว่า
Date :
2009-05-16 10:57:52
By :
PoseidonX
สักวันจะเขียนแบบ OOP ให้ได้ค่ะ
แต่ตอนนี้ขอเขียนแบบธรรมดาให้รอดก่อนดีกว่า แหะๆ
Date :
2009-05-16 11:15:52
By :
Avrill
อยากให้เขียน tutorail เรื่อง OOP ของ PHP5 ครับ จะได้มีคนเริ่มใช้จริงๆ เลยอิๆ
Date :
2009-05-16 12:56:09
By :
num
ตอบ rep No 30 นะคับ
ขอตอบเรื่อง "static ใช้กับตัวแปร แล้วเรียกแบบ function::$var;"
ตอบว่า ผิดคับต้องเป็นแบบนี้คับ "class::$var;" ^^'
ขอตอบเรื่อง "public function กับ public static function มันแสดงผลเหมือนกันหรือเปล่าครับ"
ตอบว่า ถ้าเรื่องการแสดงผลก็แสดงผลเหมือนกันคับ แต่ที่ต่างกันคือวิธีการเรียกใช้งาน
สำหรับผม ผมว่าควรจะเรียกใช้งานให้ต่างกัน (แม้ว่าจะเรียกเหมือนกันก็ได้ แต่ php error จะไม่เหมือนกัน) คือ
สำหรับ static function ควรเรียกแบบ
<?php
class test {
public static function functionStatic(){
}
}
test::functionStatic();
?>
สำหรับที่ไม่ใช่ static function ควรเรียกแบบ
<?php
class test {
public function functionNonStatic(){
}
}
$test = new test();
$test->functionNonStatic();
?>
php สามารถเรียกแบบ ตัวอย่าง 1 และ 2 นี้ได้โดยไม่ error ใดๆ (ย้ำนะคับว่า เฉพาะ php ภาษาอื่นผมไม่แน่ใจคับ)
แต่ผมว่า ควรเรียกให้ต่างกัน เพื่อกันความสับสนคับ
ตัวอย่าง 1
<?php
class test {
public function functionNonStatic(){
}
}
// แบบ initiate object ก่อน
$test = new test();
$test->functionNonStatic();
// แบบ static
test::functionNonStatic();
?>
ตัวอย่าง 2
<?php
class test {
public static function functionNonStatic(){
}
}
// แบบ initiate object ก่อน
$test = new test();
$test->functionNonStatic();
// แบบ static
test::functionNonStatic();
?>
Date :
2009-05-17 07:58:53
By :
nut_t02
factory class ที่ rep No. 28-29 ของคุณเอี่ยวคับ
จากตัวอย่างของคุณเอี่ยว พวกเราก็เริ่มมีแนวคิดที่คล้ายๆ กับ library ADOdb แล้วนะคับ
คือ concept ของ ADOdb สรุปออกมาง่ายๆ ว่า
ถ้าเราเปลี่ยน db ที่ใช้เช่นจาก MySQL ไปเป็น ORACLE เราต้องเปลี่ยน code แค่บรรทัดเดียวเท่านั้น
โดยที่ program ทั้งหมดที่เขียนมา 1000 กว่าไฟล์ (ยกตัวอย่างเพื่อให้เห็นภาพ) ต้องใช้งานได้ถูกต้องเหมือนเดิมทุกประการ
วิธีเรียกใช้งาน code ของคุณเอี่ยวคับ
<?php
$conn = DBConnectFactory::createConnection("MySQL", "localhost", "root", "mysql", "db_test1");
//หรือ
$conn = DBConnectFactory::createConnection("Oracle", "localhost", "root", "mysql", "db_test1");
?>
บางคนต้องลองเขียนก่อนลองใช้ ถึงจะเห็นภาพ
ส่วนบางคนต้องลองใช้ก่อนลองเขียน ถึงจะเห็นภาพ
ผมเลย แนบ link ของ ADOdb เป็นตัวอย่างที่ใช้ในชีวิตจริง ที่ใช้ factory class สำหรับให้พวกที่ 2 เห็นภาพนะคับ ^^
ส่วนพวกที่ 1 ดูตัวอย่างจาก code ของคุณเอี่ยวหรือ ของผม เป็นแนวทางไปก็ได้คับ
วิธีใช้งาน ADOdb สั้นๆ แบบภาษาไทยที่นี่
ส่วนตัว lib ADOdb download ได้ ที่นี่
ส่วน manual ตัวเต็มดูได้ ที่นี่
Date :
2009-05-17 08:36:46
By :
nut_t02
public เรียกได้หมด
private เรียกได้เฉพาะภายในคลาสตัวเอง
protected เรียกได้เฉพาะใน ครอบครัว ก็คือคลาสลูกนะคับ
ตัวแปร static คือ ค่านั้นมีอยู่ตลอดเวลา เช่น
Code (PHP)
<?php
class Test{
protected static $abc = 0;
public function __construct(){
self::$abc++;
}
public function getABC(){
return self::$abc;
}
}
echo '<br><br>';
$t = new Test();
echo $t->getABC(), '<br><br>';
$t2 = new Test();
echo $t->getABC();
//echo TEST::$abc; //เรียกไม่ได้เพราะเป็น protected
?>
ส่วน static method คือเมธธอดที่สามารถเรียกโดยไม่ต้องมี reference แต่ในเมดธอดต้องไม่เรียก สิ่งที่ต้องใช้ reference '$this' เมธอด หรือ ตัวแปร แต่สามารถเรียก ใช้ static, constant ได้
( ปล. ผมชอบพิมพ์ void ไปเอง ชอบลืม $this, self, parent, function
หลักการที่บอกมานั้น มาจาก Java ทั้งหมด PHP ก็คงจะเหมือนกัน
)
Date :
2009-05-17 14:56:57
By :
pjgunner
ลืมบอกไปตัวแปรแบบ static ก็คือใช้ร่วมกันได้หลาย instance นั่นเอง (จะมีก็อบปี้เดียว)
Date :
2009-05-17 15:06:32
By :
pjgunner
แจ๋มจริงๆ แต่ละคนเก่งๆ กันทั้งนั้น เห็น coding แต่ละคนแล้วผมก็แค่เด็กๆ คงต้องเขียน oop อย่างจริงๆ จังๆ กับเขาบ้างแล้ว
Date :
2009-05-17 16:08:38
By :
plakrim
คห.26 ขอบคุณสำหรับคำแน่ะนำครับ
ผมก็กำลังฝึกเขียน OOP ไปเรือยๆ
ปรกติแล้ว เวลาผมเขียน ผมจะเน้นดีไซน์ และจัดรูปแบบโปรแกรมให้สวยงามก่อนครับ 555+
Date :
2009-05-17 22:25:16
By :
danya
คห.27 สวัสดีครับพี่หนุ่ม 555+
Date :
2009-05-17 23:36:31
By :
danya
ประโยชน์ที่หลายคน ลืมนึกถึงหรือ อ่านไปไม่ถึง เพราะยังไม่ค่อยเข้าใจ OOP ที่ผมเขียนก็คือ
สังเกตดู interface DBConnect จะมี abstract method ถึงแม้ว่าคลาสนี้ จะไม่เป็น interface ก็ตามยังไง
ก็ตามคลาสที่สืบทอดคุณสมบัติ หรือ implement ไปก็ต้องมีเม็ดธอดที่ประกาศในคลาสนี้ ดังนั้นเราจึงเชื่อแน่ว่า คลาส
ลูกหรือ คลาสที่ implement ไป จะต้องมีเมธอดที่มีอยู่ในคลาสแม่แน่นอน
สมมติว่าเรา สร้างชนิดการติดต่ออีกอัน โดย implement DBConnect ชื่อว่า MySQLiConnect จึงเชื่อได้แน่ว่า คลาสนั้นย่อมมี connect() และ endConnection() และมีการเข้าถึงที่เท่าเทียมหรือมากกว่า
สำหรับผู้ใช้ หรือผู้ที่ implement แล้วเป็นการง่ายในการใช้งาน สะดวกเหมาะสม แต่มันก็ต้องแลกกับเวลาในออกแบบพอสมควร ยังมีการออกแบบอีกหลายรูปแบบ ที่แตกต่างกัน ตามแต่ละส่วน(ถ้าออกแบบผิด ในบางส่วน ก็จะทำให้ยากในการแก้ไขเป็นอย่างมาก)
Date :
2009-05-18 08:07:58
By :
pjgunner
เอ่อ
ขอถามอีกอย่างครับ
ถ้าคำสั่งนี้
Code (PHP)
<?php
class a{
private $a;
function __construct () {
self::$a = 1;
}
}
?>
กับ
Code (PHP)
<?php
class a{
private $a;
self::$a = 1;
?>
มันต่างกันอย่างไรครับ
Date :
2009-05-18 21:55:25
By :
PoseidonX
ตอบคุณ PoseidonX นะคับ
code แรก error เพราะ $a ไม่ใช่ static property จึงอ้างแบบ static ไม่ได้
ส่วน code อันที่สอง syntax ผิดนะคับ
ใน class จะต้องประกอบด้วย
- property ในที่นี้คือ private $a นั่นเอง
- method หรือ function ในที่นี้คือ __construct() ก็ได้คับ
เพราะฉะนั้นผมเลยตอบไม่ได้ว่า มันต่างกันยังไง ^^
ปล ผมใช้ php 5.2.7 test นะคับ
Date :
2009-05-18 22:32:11
By :
nut_t02
คุณ nut_t02 ครับ
ขอโทษทีครับ เขียนโค้ดผิด
คืออยากถามแค่ว่า ใส่ตัวแปร $a ใน function __construct() กับ ไม่ใส่ใน __construct()
มันจะให้ผลต่างกันยังไงครับ เพราะว่าในหนังสือที่ผมอ่านเขาบอกว่า __construct() ก็คือกำหนดค่าก่อนเรียกใช้ฟังก์ชั่นต่างๆ เท่านั้นเอง
Date :
2009-05-19 19:59:10
By :
PoseidonX
ตอบคุณ PoseidonX คับ
ถูกต้องตามที่คุณอ่านมาแล้วคับ คือ ทุกอย่างที่อยู่ใน function __construct() จะถูกเรียกใช้งานโดยอัตโนมัติเมื่อ instance object คับ
(เมื่อ new Class(); เท่านั้น)
ส่วนที่บอกว่าไม่ใส่ไว้ใน __construct() นั่นหมายถึง ใส่ไว้ใน function อื่นคับไม่ใช่เขียนลอยๆ มาตามตัวอย่างที่คุณเขียนมาคับ
ซึ่งจะทำงานเมื่อ user มีการเรียกใช้งานเท่านั้นคับ
Date :
2009-05-19 22:53:18
By :
nut_t02
ผมเข้าไปดู DragonHtmlDB ของคุณ num แล้วคับ
เขียนได้ดีจริงๆ ค่อนข้างครบทุกอย่างที่อยู่ในใจผมเลย
concept แนวนี้แหละคับที่ผมอยากจะเอามาเป็นตัวอย่างให้คนใช้กันเยอะๆ
แต่ว่าคุณ num น่าจะแยกออกจากกันไปเลยนะคับระหว่าง class db กับตัว pagination ที่ใช้ แสดงตาราง (บรรทัดที่ 670, 774)
บางทีคนอื่นเค้ามาอ่านแล้วอาจจะอยากเอาไปประยุกต์ใช้กับเรื่องอื่น แต่เจอ code ไปพันบรรทัดก็อึ้งเหมือนกัน แก้ไม่ถูก ^^'
ตัวอย่างการเรียกใช้งาน อาจดูยากไปนิดนึงนะคับ แหะๆ
ปล. ใครจะเอา code ของคุณ num ไปใช้กรุณาอ่านและทำตาม license ก่อนนะคับ
สัญญาอนุญาตของครีเอทีฟคอมมอนส์แบบ แสดงที่มา-ไม่ใช้เพื่อการค้า-อนุญาตแบบเดียวกัน
ถือว่าเป็นการให้เครดิตคนคิดค้นขึ้นมาคับ
ข้อดีของการดู code คนอื่นก็คือ
เราจะได้เทคนิคการเขียนโปรแกรมแบบใหม่ๆ ที่ตัวเองยังไม่รู้ ได้เห็นบางคำสั่งที่ไม่เคยเห็น
ตรงนี้แหละคับที่เราควรเอามาลองใช้ลองดู เพื่อให้เป็นประสบการณ์ของตัวเอง
เด๋วไปลองเขียน code มาแลกกันดูมั่งดีกว่าเผื่อของผมตกหล่นจะได้มีผู้ช่วยชี้แนะคับ
Date :
2009-05-19 23:37:15
By :
nut_t02
ตั้งใจไว้ แต่พอรีบทีไรกลับมาเขียนแบบเดิมทุกทีครับ แบบว่า ชินอ่ะ
Date :
2009-05-20 14:30:41
By :
navico
ไม่ทราบว่าคุณ num ใช้ editor หรือ ide ตัวไหนพัฒนาคับ
แล้วไม่ทราบว่า ใช้หลักการใดในการ ป้องกัน sql injection ครับ จะเอาไปใช้มั่ง ไม่รู้โดนมั่งรึป่าว
ขอบคุณคับ
Date :
2009-05-21 13:30:34
By :
pjgunner
ขอบคุณมากคับ prepare statement ดีๆ นี่เอง
รู้วิธีใช้ sql injection แล้ว
Date :
2009-05-21 14:35:58
By :
pjgunner
ผมเองก็ไม่เคยใช้พวก mysql_real_escape_string(); มาก่อน หรือเมื่อก่อนเคยใช้ addslashes();
ตอนนี้ไม่ใช้แล้ว
ผมลอง ใช้ sql injection กับ เว็บตัวเอง แต่ก็ล็อคอินไม่ได้เหมือนว่ามันได้ escape string ไว้แล้ว
เอา sql เดียวกันนี้ ไปยิงที่ phpmyadmin กลับ แสดงเรคคอร์ดออกมา
ยัง งง อยู่เหมือนกัน สรุปว่าจำเป็นต้อง escape หรือ escape ให้อัติโนมัติกันแน่คับ
Date :
2009-05-21 15:13:31
By :
pjgunner
ลืมบอกไปการจะใช้ class ของผมได้จะต้องตั้ง magic_quotes_gpc เป็น off ครับ
Date :
2009-05-21 16:07:46
By :
num
ขอบคุณ คุณ num มากคับ ทำให้เข้าใจ String ใน PHP เยอะมากขึ้นจริงๆ แต่ผมเองก็ยังงง อยู่บ้าง
ต้องช่วยตัวเองบ้างแล้ว
สำหรับเพื่อนๆ ที่อยากจะใช้ PHP 6 ก็คงจะต้องเตรียมตัวกัน
ผมเองก็คงจะต้อง ปรับเป็น off บ้างแล้วเหมือนกัน(เพื่อ อนาคต )
Date :
2009-05-21 16:39:07
By :
pjgunner
ขอโทษเพื่อนๆ ที่นอกเรื่องไปหน่อย เรามาเข้าเรื่อง OOP กันต่อดีกว่าคับ(เดี๋ยวจะโดนแช่ง)
ว่าด้วยเรื่อง abstract class และ interface
abstract class และ interface โดยหลักแล้วถูกออกแบบมาเพื่อให้ เป็นโครงร่างของคลาสต่างๆที่สืบทอดคุณสมบัติคับ โดยตัวมันเองแล้ว ไม่สามารถที่จะสร้าง instance ได้
เมธอดใน interface นั้น จะเป็น abstract method โดยอัตโนมัติ(ไม่จำเป็นต้องใส่โมดิฟายเออ abstract)
ส่วน เมธอดใน abstract class นั้น ถ้าอยากให้เป็น abstract method จำเป็นต้องใส่โมดิฟายเออ abstract ด้วย
โดยที่ abstract class สามารถมีได้ทั้ง เมธอดธรรมดา และ abstract method
ใน abstract class
คำว่า abstract method นั่นก็คือ จะต้องมีคลาสในครอบครัว(ลูกหลาน) implement ให้ครบก่อน จึงจะกลายเป็นคลาสธรรมดา(สร้าง instance ได้) ถ้า implement ไม่ครบ ก็จะยังเป็น abstract class อยู่
ใน interface
ถ้า implement ไม่ครบ ก็จะต้อง ใส่โมดิฟายเออ interface ด้วย
ความจริงแล้วอีกเหตุผลที่ เขาสร้าง interface ขึ้นมาก็คือ ลดความสับสนในการพัฒนา เรื่อง multiple inheritance นั่นเอง
ยังคิดตัวอย่างที่ใช้อยู่ทั่วไปไม่ออก แปะไว้ก่อน ละกัน
Date :
2009-05-21 18:36:22
By :
pjgunner
พี่หนุ่ม โชว์เทพแล้วเว้ยยย อิอิ
พี่หนุ่ม ของเขาดีจริงนะ 5555+
Date :
2009-05-22 15:22:00
By :
danya
เรื่อง magic_quotes_gpc เป็นเรื่องที่ทำให้ต้องแก้โปรแกรมมาหลายทีแล้วอะ เลยรู้ซึ้งเลยว่ามันทำให้เกิดปัญหาตามมามากมาย
Date :
2009-05-22 15:51:34
By :
num
ขอโทษนะคับ เพราะช่วงนี้ผมไม่ว่างเท่าไหร่(ก็ติดเกมอยู่คับ เพิ่งเล่นดู สนุกดี http://urd.astonia.com/ )
คือเรื่องตัวอย่างน่ะคับ ผมเองก็มีความคิดได้แล้วว่าจะเอาเรื่องอะไรดี ที่สามารถนำประยุกต์ใช้ได้แต่ยังไม่มีเวลาเขียนเพราะ ประโยคข้างบน
แต่เรื่องที่คิดนั้น ก็จะเอามาบอกให้คนที่สนใจและติดตามกระทู้นี้อยู่ นำไปคิดและพัฒนามามาแสดงให้เพื่อนๆดูก็ได้ จะได้แชร์กันถึงความหมาย ซึ่งแต่ละคนอาจคิดหรือวางแผนไม่เหมือนกัน แตกต่างกัน จะได้นำมาหา QED ร่วมกัน
สมมติว่า เราจะสร้าง เกมออนไลน์ประเภทเกมภาษา เกมหนึ่ง(เช่น Final fantasy, Dragon Wariror ) ซึ่งมีรายละเอียดคร่าวๆ คือ เกมนี้เป็นเกมภาษา เป็นเกมเนื้อเรื่อง มีฮีโร่(ตัวเอก กับพักพวกที่เราใช้ได้ อาจหลายตัว) มีมอนสเตอร์หลากหลายชนิดหลายระดับหรือ อาจมีหลายธาตุ อาจมีสกิล เวทมนต์ ต่างๆ ก็ได้
แน่นอนว่า ที่ผมบอกไปในพารากราฟข้างบน หมายถึงเป้าหมายหลักของเรา แต่สมติว่าเรายังไม่ต้องคิดถึงเรื่องเนื้อเรื่องหรืออะไรอย่างอื่น สิ่งที่เราสนใจก็ตอนนี้ก็คือ การออก class ต่างๆให้ใช้ร่วมกันได้อย่างมีประสิทธิภาพมากที่สุด โดยใช้ OOP ซึ่งแน่นอนว่า OOP ในสถานการ์ณนี้ ย่อมเป็นประโยชน์อย่างยิ่ง(reusable, extensible ) แน่นอนว่าเกี่ยวกับเรื่อง ตัวละคร ฮีโร่ มอนส์เตอร์ ต่างๆนั่นเอง โดยยังไม่ต้องไปรวมถึงการไป ดึง/บันทึก ข้อมูลจากฐานข้อมูล
ปล. นะครับ : เรื่องนี้ไม่จำกัดความคิด ไม่มีผิดถูก แต่มีเรื่องของประสิทธิภาพในการ reusable และ extensible โดยให้โปรแกรมไม่ต้องจำเป็นต้องไปแก้โค้ดเดิมในภายหลัง คืออยากให้ใช้ OOP ให้มีประสิทธิภาพกัน และเพื่อเป็นการหาทางออกร่วมกัน เราสามารถที่จะปรึกษาหาทางกันได้ โดยเอาโค้ดมาแปะกัน(ขอให้ 1 rep ต่อ ทุกคลาส เพื่อไม่ให้งง แต่แก้เอามาใหม่ หรือแลกเปลี่ยนกันได้ถ้ามีการแลกเปลี่ยนกัน มีคอมเมนต์ พอเข้าใจ)
Date :
2009-05-24 22:05:58
By :
pjgunner
มีเบื้องต้นประมาณนี้หรือเปล่าคับ เพื่อนๆ ช่วยดูให้ผมด้วย
ขาดไรตรงไหนมาช่วยกันนะคับ
เรียนรู้ไปพร้อมๆ กันคับ มี tutor นี่แล้วคับ
Code (PHP)
<?php
class ตัวละคร {
protected เลือด;
protected พลังเวท;
protected basic_skill;
protected level;
protected exp;
protected ธาตุ;
}
class hero extends ตัวละคร {
protected ชื่อ;
protected more_skill;
}
class monster extends ตัวละคร {
protected ชื่อ;
protected more_skill;
}
?>
มีคงมีอีกอ่ะแหละคับ
แต่ผมอยากให้คนอื่นช่วยๆ กันคิดคับ
Date :
2009-05-26 07:52:45
By :
nut_t02
จากตัวอย่าง ของคุณ nut_t02 ผมคิว่าน่าจะใส่ operation ด้วยนะครับ
จาก rep.63 ผมก็ลองเอาไปสร้างได้ดังนี้
Code (PHP)
<?php
abstract class Character{//เป็น abstract เพื่อไม่ให้สร้าง instance
protected $name;
protected $picture;
protected $alive = true;
public final function getName(){ return $this->name; }
public final function setName($name){ $this->name = $name; }
public final function getStatus(){ return $this->alive; }
public final function setPicture($picture){ $this->picture = $picture; }
public final function getPicture(){ return $this->picture; }
}//Character
//ใช้เก็บสถานะ Character
abstract class CharacterStatus extends Character{
protected $character_exp;//ถ้าเป็น ฮีโร่ ก็เป็นฮีโร่ exp ถ้าเป็น มอนสเตอร์คือ exp ที่ได้รับเมื่อถูกกำจัด
protected $max_hp;
protected $max_mp;
protected $hp;
protected $mp;
}//CharacterStatus
//สามารถโจมตีได้
abstract class Attackable extends CharacterStatus{
protected $offence;
protected $defence;
protected $offence_element;
protected $defence_element;
public function attack(Attackable $dest){//overidable
if($dest instanceof Monster){
$hp_reduce = $this->calculate($this, $dest);
$dest->hp_reduce($hp_reduce);
}
}
public final function hp_reduce(Attackable $attacker, $amount =0){//เลือดลด เป็นพับบลิคเพราะ อาจติดพิษได้(จากข้างนอกคลาส)
if( $this->hp > $amount )
$this->hp -= $amount;
else
$this->death($attacker);
}
public final function hp_add($amount =0){//เลือดเพิ่ม
$this->hp += $amount;
if( $this->hp > $this->max_hp )
$this->hp = $this->max_hp;
$this->awake();
}
protected function death(Attackable $attacker){//ตาย
$this->alive = false;
$this->hp = 0;
setPicture("{$name}_death.png");
}
protected final function awake(){//ฟื้น
if( $this->hp > 0 )
$this->alive = true;
setPicture("{$name}.png");
}
//เป็น abstract เพราะ อาจมีสูตรการคำนวนต่างกันสำหรับ ฮีโร่ และ มอนสเตอร์
public abstract function calculate(Attackable $attacker, Attackable $dest);
public abstract function addExp($exp);
}//Attackable
class Hero extends CharacterStatus implements EquipableCharacter{
protected $hero_class;
public function __construct($name, HeroClass $class, $max_hp, $max_mp, $exp, $picture){
$this->setName($name);
$this->setclass($class);
$this->max_hp = $max_hp; $this->max_mp = $max_mp;
$this->character_exp = $exp;
$this->picture = $picture;
$this->hp = $this->max_hp; $this->mp = $this->max_mp;
}
//ตั้งอาชีพ มีผลต่อสกิล(แต่ยังไม่เขียน)
private function setClass(HeroClass $class){ $this->hero_class = $class; }
public function getClassName(){ return $hero_class->getName(); }
//@implement Attactable->calculate()
public function calculate(Attackable $attacker, Attackable $dest){
//อาจใช้สูตรอื่น และคำนวณ element ด้วย
return $attacker->offence - $dest->defence;
}
//@implement Attackable->addExp()
public function addExp($exp){
$this->character_exp += $exp;
//คำนวน level
}
//@implement Equipable->setEquipment()
public function setEquipment(Equipment $item, $insert = true){
if( $item instanceof Weapon )
$this->weapon = $insert ? $item : 'None';
else
$this->body = $insert ? $item : 'None';
}
//@implement Equipable->getWeapon()
public function getWeapon(){ return $this->weapon; }
//@implement Equipable->getBody()
public function getBody(){ return $this->body; }
}// Hero
class Monster extends CharacterStatus{
public function __construct($name, $max_hp, $max_mp, $exp, $picture){
$this->setName($name);
$this->setclass($class);
$this->max_hp = $max_hp; $this->max_mp = $max_mp;
$this->character_exp = $exp;
$this->picture = $picture;
}
//@overide Attackable->death()
protected function death(Attackable $attacker){
parent::death($attacker);
$attacker.addExp($this->character_exp);
}
//@implement Attackable->addExp
public function addExp(){}
}
/* Interface ต่างๆ */
interface EquipableCharacter{//ให้ Hero implement
public function setEquipment(Equipment $eq, $insert=true);
public function getWeapon();
public function getBody();
}
interface Item{}//ยังไม่เขียนข้างใน interface คือยังไม่เสร็จเอาไว้ให้ item อื่นๆ implement
interface Equipment{}//เพื่อเป็น reference ได้
class Weapon implements Item, Equipment{
public $name;
public $attack_value;
public $element;
public function __construct($name, $attack_value, Element $element){
$this->name = $name; $this->attack_value = $attack_value; $this->element = $element;
}
public function getName(){ return $this->name; }
public function getAttackValue(){ return $this->attack_value; }
public function getElement(){ return $this->element; }
public function __toString(){
return "Weapon name : {$this->name}\n Attack : {$this->attack_value}\n Element : {$this->element}";
}
}
class Body implements Item, Equipment{}//ยังไม่เขียน อาจคล้าย Weapon
abstract class HeroClass{
public $name;
public $skills = array();
public function getClassName(){ return $this->name; }
public function getSkills(){ return $this->skills; }
}
//ตัวอย่าง อาชีพ อีโร่ Novice
class Novice extends HeroClass{//มีได้แค่ instance เดียว (Sigleton)
private static $instance;
private function __construct(){//ไม่ให้สร้าง instance ด้วยตัวเอง
$skills[] = 'defend';
}
public function defend(){}
public static function singleton(){
if( !isset($instance) )
$this->instance = new Novice();
return $this->instance;
}
private function __clone(){}
}
class CharacterFactory{
public static function createHero($name = '', HeroClass $class, $max_hp =100, $max_mp =10, $exp =0, $picture ='default_hero.png'){
return new Hero($name, $class, $max_hp, $max_mp, $exp, $picture);
}
public static function createMonster($name, $max_hp, $max_mp, $exp, $picture='slime.png'){
return new Monster($name, $max_hp, $max_mp, $exp, $picture);
}
}
?>
ปล. ผมเองก็มึนอยู่ ผมก้ไม่ได้ช่ำชองเท่าไหร่ ไม่รู้ว่า อันไหนควรจะทำแบบไหนเท่าไหร่ อาจขาดๆ เกินๆ
ขอไปกินข้าวก่อนนะครับ โค้ดข้างบนต้องต้องสร้าง instance ของ HeroClass ไว้ใช้ก่อนนะครับโดยใช้ singleton() ส่วนการบันทึก ก็คงใช้ใช้ serialization ช่วยครับ
Date :
2009-05-28 11:08:42
By :
pjgunner
ขอแก้หน่อยนะครับ
เมธอด Attackable->attack() ยังเขียนไม่เสร็จครับ ผมลืม ตอนเขียนนึกอะไรขึ้นได้ก็ย้ายไปเขียนที่อื่น ความจริงมันน่าจะมีเรื่อง skill เข้ามาเกี่ยวอีกนะครับ
และ
class CharacterFactory ที่จริงควรเป็น abstract class CharacterFactory นะครับ
Date :
2009-05-28 18:00:25
By :
pjgunner
เพิ่มคลาส
Code (PHP)
<?php
interface NPC{
public function isSeller(){}
public function isQuest(){}
}
class NPCSeller extends Character implements NPC{
private $items;
public function __construct($items){
$this->items = $items;
}
//@implement NPC->isSeller()
public function isSeller(){ return true; }
//@implement NPC->isQuest()
public function isQuest(){ return false; }
}
class NPCQuest extends Character implements NPC{
private $quests;
public function __construct($quests){
$this->quests = $quests;
}
//@implement NPC->isSeller()
public function isSeller(){ return false; }
//@implement NPC->isQuest()
public function isQuest(){ return true; }
}
?>
สังเกตจากโค้ดที่แนบมา ผมคิดว่าผมคงจะออกแบบผิด ใช้ไม่ถูกหลักการซะแล้วหละครับ สังเกต เมธอดข้างบน ไม่ได้ใช้ประโยชน์ของ Polymorphism ความจริง Character ควรเป็น interface มากกว่าหละมั้ง(สับสนตัวเอง ) ยังไงคงจะต้องออกแบบใหม่ คราวนี้ ร่างโครง กะสะโคป ไว้ก่อนดีกว่า ไม่งั้นเหมือนเดิมอีก
ปล. กระทู้เงียบเลยครับ ยังไงก็คุยกันเรื่อง ที่เกี่ยวข้องกันต่อเถอะครับ ไม่ต้องสนใจผม ไม่ได้ตั้งใจให้กระทู้เงียบเลย เดี๋ยวมันจะจบแค่นี้เสียเปล่าๆ
ปลอ. ผมคงไม่ได้กลับมาอีกประมาณ 1 เดือน อยากให้เพื่อนๆ คุยถกกันต่อครับ
Date :
2009-05-29 22:09:43
By :
pjgunner
ขอบคุณครับ กำลังศึกษาพอดี
Date :
2009-06-02 17:00:19
By :
HS4OSX
ขอบคุณค่ะที่บอกกล่าวกัน
Date :
2009-06-09 01:28:02
By :
tan311
ตรง rep.65 (ความจริงใช้ dynamic attribute เอาก็ได้ ) ความจริงเราไม่ควรใช้นะครับ เพราะ จะเสียประโยชน์ของ Infomation Hiding ซึ่งถ้าเป็น dynamic property แล้ว(เปลี่ยน attribute เป็น property นะครับ )
มันจะกลายเป็น public หมด ตัวอย่าง
Code (PHP)
<?php
class Test{}
$t = new Test();
$t->abc = 'xxx';
echo $t->abc;
?>
ส่วนตอนนี้ ผมกำลัง ลองทำโจทย์ของผมใหม่โดยให้สโคปไม่เกิน ให้ฮีโร่และมอนสเตอร์โจมตีกันได้ มี สถานะต่างๆ
ใช้ item และ สกิล ได้ ไอเทมบางอย่างรวมกันได้(คือมีหลายอันใน instance เดียว) ซึ่งผมใช้วิธีเขียนแบบ จากล่างไปสู่ บน ซึ่งตอนนี้ถึงขั้นตอนการเขียนเกี่ยวกับ potion ต่างๆ ผมติดอยู่ว่า ถ้าเป็น hp potion ขนาดต่างกัน ควรเขียน แบบแยก หรือว่า เขียนคลาสเดียวดี
โค้ดทั้งหมดที่เพิ่งเขียนได้
clases/Picture.php
<?php
function __autoload($class_name){
require_once($class_name.'.php');
}
interface Picture(){
public function getPicture();
public function setPicture();
}
?>
classes/Item.php
<?php
function __autoload($class_name){
require_once($class_name.'.php');
}
abstract class Item implements Picture {
protected $name, $legend, $picture;
public function getName() {
return $this->name;
}
protected function setName() {
$this->name = $name;
}
public function getLegend() {
return $this->legend;
}
public function setLegend($legend) {
$this->legend = $legend;
}
//@implement Picture::setPicture()
public function setPicture($picture) {
$this->picture = $picture;
}
abstract public function getType();
}
?>
classes/Equipment.php
<?php
function __autoload($class_name){
require_once($class_name.'.php');
}
interface Equipment {
public function getStatus();
//for enchance item for future feature
protected function setStatus();
}
?>
classes/Body.php
<?php
function __autoload($class_name){
require_once($class_name.'.php');
}
class Body extends Item implements Equipment {
const PICTURE_DIR = 'items/bodies/';
protected $status;
public function __construct($name, EquipmentStatus &$status, $legend ='', $picture= 'default.png') {
$this->setName($name);
$this->setStatus($status);
$this->setLegend($legend);
$this->setPicture($picture);
}
public function getStatus() {
return $this->status;
}
//@Implements Item::getType()
public function getType() {
return 'Body';
}
//@Overide Item::getPicture()
public function getPicture(){
return Body::PICTURE_DIR.$this->picture;
}
protected function setStatus(EquipmentStatus &$status) {
$this->status =& $status;
}
public function __toString() {
$first = $this->getType().' : '.$this->getName().'\n';
$statuses = $this->getStatus();
foreach($statuses as $attr=> $value)
$status .= $attr.' : '.$value.'\n';
$last = 'Legend : '.($this->getLegend() ? $this->getLegend() : 'None').'\n';
return ( $first.$statuses.$last );
}
}
?>
classes/Weapon.php
<?php
function __autoload($class_name){
require_once($class_name.'.php');
}
class Weapon extends Item implements Equipment {
const PICTURE_DIR = 'items/weapons/';
protected $status;
public function __construct($name, EquipmentStatus &$status, $legend ='', $picture= 'default.png') {
$this->setName($name);
$this->setStatus($status);
$this->setLegend($legend);
$this->setPicture($picture);
}
public function getStatus() {
return $this->status;
}
//@Implements Item::getType()
public function getType() {
return 'Weapon';
}
//@Overide Item::getPicture()
public function getPicture(){
return Weapon::PICTURE_DIR.$this->picture;
}
protected function setStatus(EquipmentStatus &$status) {
$this->status =& $status;
}
public function __toString() {
$first = $this->getType().' : '.$this->getName().'\n';
$statuses = $this->getStatus();
foreach($statuses as $attr=> $value)
$status .= $attr.' : '.$value.'\n';
$last = 'Legend : '.($this->getLegend() ? $this->getLegend() : 'None').'\n';
return ( $first.$statuses.$last );
}
}
?>
classes/EquipmentStatus.php
<?php
function __autoload($class_name){
require_once($class_name.'.php');
}
class EquipmentStatus {
//I want to fix scope of Equipment attrbite
//and arrage sort it
public function __construct($attrs) {
//base status
$this->attrs['att'] = $attrs['att'] ? $attrs['att']: 0;
$this->attrs['def'] = $attrs['def'] ? $attrs['def'] : 0;
$this->attrs['mag_att'] = $attrs['mag_att'] ? $attrs['mage_att'] : 0;
$this->attrs['mag_def'] = $attrs['mage_def'] ? $attrs['mag_def'] : 0;
//other status for attack and defend
//attack think to percent
//defend think to 100 percent prevent from enemy attack
$this->attrs['blind'] = $attrs['blind'] ? $attrs['blind'] : 0;
$this->attrs['prevent_blind'] = $attrs['prevent_bind'] ? 100 : 0;
$this->attrs['curse'] = $attrs['curse'] ? $attrs['curse'] ? 0;
$this->attrs['prevent_curse'] = $attrs['prevent_curse'] ? 100 ? 0;
$this->attrs['poison'] = $attrs['poison'] ? $attrs['poison'] : 0;
$this->attrs['prevent_poison'] = $attrs['prevent_poison'] ? 100 : 0;
$this->attrs['sleep'] = $attrs['sleep'] ? $attrs['sleep'] ? 0;
$this->attrs['prevent_sleep'] = $attrs['prevent_sleep'] ? 100 ? 0;
}
public function getAttrs() {
return $this->attrs;
}
}
?>
classes/ItemGroupable
<?php
function __autoload($class_name){
require_once($class_name.'.php');
}
interface ItemGroupable {
const MAX_NUMBER = 100;
public function getNumber();
public function add($number);
public function reduce($number);
}
?>
classes/Potion.php
<?php
function __autoload($class_name){
require_once($class_name.'.php');
}
abstract class Potion extends Item implements ItemGroupable {
const PICTURE_DIR = 'items/potions/';
//@Implements Itemgroupable::getNumber()
public function getNumber() {
return $this->number;
}
//@Implements Itemgroupable::add()
public function add($number) {
$this->number += $number;
if($this->number > ItemGroupable::MAX_NUMBER) {
$remain_number = $this->number - ItemGroupable::MAX_NUMBER;
$this->number = ItemGroupable::MAX_NUMBER;
throw new MaxItemNumberException($remain_number);
}
}
//@Implements Itemgroupable::reduce()
public function reduce($number) {
if($this->number < $number)
throw new ReduceItemNumberException($this->number);
else
$this->number -= $number;
}
}
?>
^ตรงคลาสนี้แหละครับที่จะใช้เป็นคลาสแม่ของ Potion ชนิดต่างๆ แต่ยังไม่แน่ว่า hp potion จะให้เป็นหลายคลาสตามจำนวนการเติม หรือว่า จะให้เป็นคลาสเดียว เพราะมันมีผลตอน group กัน เวลาที่ได้ของมาถ้าแยก ก็จะสามารถเก็บข้อมูลได้ง่าย แต่อาจมีปัญหาที่จะมีคลาสจำนวนมากในระบบ ถ้ามี Potion ประเภทอื่นๆ เช่น เพิ่มทั้ง เลือดและ mp ไอเทมประเภท ฟื้นชีวิต หรืออื่นๆ ซึ่งยังคิดไม่ออก (คลาสนี้ยังไม่สมบูรณ์ลืมใส่ useTo())
ใครมีข้อคิด แนะนำ สอบถาม ถามมาได้คับ ผมก็ยังคิดไม่ออกเหมือนกัน
Date :
2009-06-10 23:03:17
By :
pjgunner
เรพข้างบน ยังไม่เสร็จนะครับ ยังไม่มีคลาส exception และยัง ไม่ถึงส่วน character เลย ยังทดสอบไม่ได้ ต้องเขียนให้หมดก่อนถึงจะทดสอบได้นะครับ แน่นอนว่า มันคงต้องมี error และส่วนที่ยังไม่สมบูรณ์ที่ต้องเพิ่มเข้าไป
ปล.ผมยังไม่ค่อยได้เข้ามาตอบนะครับ ช่วงนี้ ยังไงก็ทิ้ง คำถาม ข้อแนะนำ ข้อคิดเห็น ไว้เลยนะครับ
Date :
2009-06-10 23:08:02
By :
pjgunner
อยากลองศึกษษบ้างจัง อยากได้ความรู้ค่ะ
Date :
2009-06-12 09:55:18
By :
kai9
ผมก็อยาก จะลองเขียน แบบ OO อยู่เหมือนกัน
Date :
2009-06-12 14:54:36
By :
StepZaLung
อยากเขียนอยู่นะครับ แต่ยังมีเรื่องที่ไม่เข้าใจอีกมากมายมีหนังสือภาษาไทยแนะนำไม๊ครับ?
Date :
2009-06-15 14:06:35
By :
rukia
PHP 5 ขึ้น
สงไสยต้องไปอัพPHPของตัวเองซะละ
Date :
2009-06-16 15:17:35
By :
ahung
ใครอยากเริ่มศึกษา OOP ก็ลองใช้ PDO ดูก็ได้ครับ มันใช้ ฟีเจอร์ OOP ใน php 5 พอดีเลย
พีดีโอก็ใช้ประโยชน์จาก abstraction ซึ่ง ถ้ามีฐานข้อมูลชนิดใหม่เพิ่มในอนาคต ก็ไม่ต้องเรียนคำสั่ง php ตัวใหม่อีก(เรียนเฉพาะดาต้าเบสชนิดใหม่)
PDO Introduction
The PHP Data Objects (PDO) extension defines a lightweight, consistent interface for accessing databases in PHP. Each database driver that implements the PDO interface can expose database-specific features as regular extension functions. Note that you cannot perform any database functions using the PDO extension by itself; you must use a database-specific PDO driver to access a database server.
PDO provides a data-access abstraction layer, which means that, regardless of which database you're using, you use the same functions to issue queries and fetch data. PDO does not provide a database abstraction; it doesn't rewrite SQL or emulate missing features. You should use a full-blown abstraction layer if you need that facility.
PDO ships with PHP 5.1, and is available as a PECL extension for PHP 5.0; PDO requires the new OO features in the core of PHP 5, and so will not run with earlier versions of PHP.
From PHP manual
http://gunner.freetzi.com
Date :
2009-06-19 10:07:06
By :
pjgunner
ดีมากเลย
Date :
2009-06-20 00:42:28
By :
yuttn
OOP โปรแกรมแรกของโผ้มมมม ม่ะรู้ถูกป่ะ พอดีอ่านหนังสือจาวาแล้วเอามาเขียน php (ปนกันแหลกลาน)
เขียนตามความเข้าใจอ่ะ ผิดถูกม่ะรู้โพสไว้ก่อน 555+
เดี๋ยวจะอ่านหนังสือต่อถ้าผมเข้าใจถูกจะมาโพสใหม่
Code (PHP)
<html>
<head>
<title>ทดลองการสร้าง OOP</title>
</head>
<body>
<?php
class showText
{
var $text;
function setText($txt1) {
$this->text = $txt1;
//ถ้าต้องการเรียกใช้แอตทริบิวต์จากภายในคลาส ให้ใช้ว่า $this->ชื่อแอตทริบิวต์;
}
function showSet() {
echo $this->text;
//ถ้าต้องการเรียกใช้แอตทริบิวต์จากภายในคลาส ให้ใช้ว่า $this->ชื่อแอตทริบิวต์;
}
function display() {
echo "ทดลองการเขียนโปรแกรมในแบบ OOP" . "<br>";
}
}
$box1 = new showText();
//การประกาศตัวแปรออบเจ็ค $ชื่อตัวแปรออบเจ็ค = new ชื่อคลาส;
$box1->display();
//ถ้าต้องการเรียกใช้แอตทริบิวต์จากภายนอกคลาสให้ใช้ว่า $ชื่อตัวแปรออบเจ็ค->ชื่อแอตทริบิวต์;
$box1->setText("ไรว้า");
//ถ้าต้องการเรียกใช้แอตทริบิวต์จากภายนอกคลาสให้ใช้ว่า $ชื่อตัวแปรออบเจ็ค->ชื่อแอตทริบิวต("อาร์กิวเมนต์");
$box1->showSet();
?>
</body>
</html>
ผลรัน
ทดลองการเขียนโปรแกรมในแบบ OOP
ไรว้า
Date :
2009-06-20 16:03:51
By :
maibon
ผมเพิ่งหัดเขียนแบบ oop เหมือนกันคับกำลัง งง อยู่เลย ไงผู้รู้ลองเขียนให้ผมดูมั่งได้ป่าวคับ...
แบบว่า่...รับค่า่มาจาก text field อ่ะคับ พอกด submit ให้แสดงเลขคี่จากค่าที่รับเข้ามาไล่ลงมาจนถึง 1 นะคับ...
ผมยังไม่รู้จะเขียนไงเลย..
เคยเขียนแบบฟังฃั่นอ่ะคับพอจะเริ่มเรียนรู้แบบ oop งงมากเลย ลองผู้รู้สอนหน่อยนะครับ...
Date :
2009-06-21 18:59:29
By :
olezajung
ขอบคุณครับ เป็นแนวทางที่ดี
Date :
2009-06-23 10:44:51
By :
pklangkua
Code (PHP)
<?php
require_once 'DB.php';
$user = 'root';
$pass = ' ';
$host = 'localhost';
$db_name = 'test';
$dsn = "mysql://$user:$pass@$host/$db_name";
$db = DB::connect($dsn);
if(DB::isError($db)){
die($db -> getMassage());
}
$sql = "select * from stu";
$result = $db -> query($sql);
if(DB::isError($result)){
die($result -> getMassage());
}
while($result -> fetchInto($row)){
$id = $row[0];
$name = $row[1];
$gpa = $row[2];
echo "$id \t $name \t $gpa <br>";
}
$sql = "INSERT INTO stu VALUES(4,'AuA',1.8,3)";
$result = $db -> query($sql);
//$result = $db -> query("insert into stu(sid,sname,sgpa,cid)values($id,'$name',$gpa,$cid)");
if(DB::isError($reult)){
die("inser error".$sesult -> getMassage()."\n");
}
$sql = "delete from stu where sid = $del";
$result = $db -> query($sql);
if(DB::isError($reult)){
die($result -> getMassage());
}
Date :
2009-06-23 13:58:27
By :
tuanau
ไม่รู้ว่าจะมีคนสนใจบะ
Date :
2009-06-23 13:59:23
By :
tuanau
กำลังศึกษา ครับ
งงเรื่อง การประกาศ พวก
static
private static
const
protected
public
$this->
ฯลฯ
ว่าใช้ อย่างไร มี ที่ศึกษา เพิ่ม เติม มั้ย ครับ
Date :
2009-06-30 03:12:32
By :
madlyaek
ดีจัง การเขียน oop แต่เราอยากเริ่มต้องทำไงดี
Date :
2009-07-02 07:56:58
By :
kai9
มีหนังสือสำหรับเรียน oop ไหมค่ะ แนะนำด้วยค่ะ
Date :
2009-07-02 07:57:51
By :
kai9
เยี่ยมครับ
Date :
2009-07-06 12:59:46
By :
TTiger
เป็นปัญหามากคับ เรื่อง magic quote ตามที่คุณ num ได้บอกไว้ โดยเฉพาะ การเขียน กับ oop ถ้าเราได้เก็บ state ของ ข้อมูลในฐานข้อมูล เพราะเราต้องเอา slash เข้าออก บ่อยๆ ซึ่งโอเวอร์เฮดจริงๆ
ซึ่ง object ควรเก็บข้อมูลปรกติ ที่ไม่ได้ addslashes ไว้ด้วยซึ่งการแก้ปัญหา คือต้องเพิ่มโค้ดในโปรแกรมจำนวนมาก
แต่ตอนนี้ถ้าจะไปเซต php ให้ ปิดไป โปรเจกต์ที่อยู่ในระบบ ก็จะมีปัญหา และโปรเจกต์ของลูกค้ามันก็ควรเป็นไปตามมาตรฐานด้วย ซึ่งถ้าจะเขียนด้วย oop ทั้งระบบ ก็จะเป็นการเพิ่มต้นทุนด้านเวลา และการตรวจสอบมากขึ้นด้วย
ซึ่งปัญหานี้ควรได้รับการแก้ไข ซึ่งเราไม่สามารถปิด magic_quote_gpc ในขณะรันไทม์ได้ซะด้วย
ส่วนเรื่อง PDO มันก็ไม่ได้วิเศษวิโสอะไรหรอกนะครับ ผมลองใช้แล้ว ก็ไม่ได้มีฟีเจอร์ตามแต่ละดาต้าเบส
เหมือนแพ็คเกจ java.sql ของ Java ซึ่งให้เจ้าของดาต้าเบสเป็นผู้ implement เองเพียงแต่มี prepare statement ให้ใช้เท่านั้นเอง และต้องโค้ดมากขึ้นเกินจำเป็น
Date :
2009-07-15 11:26:00
By :
pjgunner
สำหรับหนังสือ เกี่ยวกะ OOP ของ PHP
ผมแนะนำ Insight PHP ฉบับสมบูรณ์ ของ provision คับ (ราคาปก 299)
เพราะอ่านแล้วรู้สึกว่าเข้าในง่ายดี ผมก็อ่านๆ งมๆ เอาเองก็พอจะรู้เรื่องมากขึ้นเพราะหนังสือเล่มนี้แหละครับ
อีกเล่มที่แนะนำคือ คู่มือเขียนโปรแกรมด้วยภาษา Java ของ provision อีกเช่นเคย (ราคาปก 149)
เล่มนี้อธิบายแนวคิดเกี่ยวกับ OOP ให้คนที่ไม่มีพื้น OOP เลยให้เข้าใจ OOP ได้
โดยความเห็นส่วนตัวแล้ว ผู้ที่ศึกษาด้วยตัวเอง หนังสือสองเล่มนี้ คงจะช่วยให้ท่านได้ เข้าใจและไม่กลัว OOP แน่นอน
Date :
2009-07-31 10:08:24
By :
maibon
ชอบ oop เหมือนกันครับ เท่าที่เคยเขียน php ตั้งแต่ 4,5,6 ก็รองรับการเขียนโปรแกรมแบบ oop ทุกเวอร์ชั่น แตกต่างก็จะมีบางคุณสมบัติของ oop ที่บางเวอร์ชั่นทำไม่ได้ เช่น การกำหนดระดับการเข้าถึงข้อมูล ถ้าเวอร์ชั่น 4 ก็จะเป็น public หมด แต่ถ้า 5-6 ก็จะเป็นได้ทั้ง public private ฯลฯ สำหรับคนที่จะหัด oop ผมแนะนำ javascrip ครับ ไม่ต้องเครียมการอะไรมาก ฝึกง่าย แสดงผลลัพธ์ง่าย ถึงจะไม่รองรับคุณสมบัติของ oop ทั้งหมดแต่ก็ได้หลักการของ oop พอสมควรเลยครับ
Date :
2009-07-31 23:14:39
By :
oointhai
อ่านะ เข้ามาดู ขอบคุณมากๆ เลยครับ
Date :
2009-08-12 18:57:57
By :
Sirichut
ขอบคุณมากๆครับที่ให้ความรู้
Date :
2009-08-13 15:17:28
By :
badkung04
นี้หรือ OOP เดียวเอาไว้ก่อนดีกว่า ศึกษา PHP เอาตัวแปรให้มันเต็มที่ก่อนดีกว่าแล้วค่อยมาศึกษาตัวนี้ต่อไป
คนเก่งก็เก่งจริงๆคนโง่ก็โง่ได้ใจ หุหุหุหุ(คนโง่นั้นคือผมเองนะคับ)
Date :
2009-08-13 15:28:30
By :
somparn
เขียนเองพอถูๆ ไถ ๆ แต่ใช้ถนัดมากครับ oop เนี่ย หุ หุ
oop code ที่ผมใช้บริการบ่อย www.phpclass.org
ยากได้อะไร ก็สมัครสมาชิก แล้ว search เอานะครับ
ตอนนี้ที่ผมเอามาใช้งาน อยู่มีสองตัว
คือ class split page =>kgpager
class ajaxtableedit
ใช้เวิร์คดีครับ
Date :
2009-08-14 23:19:18
By :
DownsStream
อยากทำเว็บให้เก่งกว่านี้ คงต้องฝึกอีกนานเรยนะเรา ฮ่าๆๆ
Date :
2009-08-24 20:45:54
By :
gangzaclub
กะลัง จะเขียน function เป็น oop ก็มาอีก เฮ้อ จะตามทันไหมน้อ..
Date :
2009-08-27 12:59:51
By :
peak_z
คับผม ผมก็ไม่ได้เรียน หรือศึกษา javascript มามากนัก เพราะตัวเองก็เพิ่งใช้เป็นได้ไม่นาน
ผมก็ชอบมันตรงที่เป็นไดนามิคดี และอาจทำให้บางฟีเจอร์
ไม่ทราบคุณ oointhai พอมีตัวอย่างการใช้ feature OOP ที่ได้เกริ่นมาซัก อย่างละ 1 ตัวอย่างบ้างมั้ยคับ
จะเป็นพระคุณอย่างมาก
Date :
2009-08-29 07:57:11
By :
pjgunner
ผมขอยกตัวอย่าง Polymorphism นะครับ ตัดมาจากเว็บอ้างอิง
Code (PHP)
/* Polymorphism. */
/* Class. */
function Shape( ) {
this.getArea = function( ) {
};
}
/* Class inherit from Shape. */
function Circle( radius) {
this.radius = radius ;
}
Circle.prototype = new Shape( ) ;
/* Overriding. */
Circle.prototype.getArea = function( ) {
return 3.141 * this.radius * this.radius ;
}
/* Class inherit from Shape. */
function Rectangle( width , height ) {
this.width = width ;
this.height = height ;
}
Rectangle.prototype = new Shape( ) ;
/* Overriding. */
Rectangle.prototype.getArea = function( ) {
return this.width * this.height ;
}
/* new instance. */
var oCircle = new Circle( 2 ) ;
var oRectangle = new Rectangle( 2 , 2 ) ;
/* ทดสอบ object คนละชนิดใน array โดยเรียก getArea(). */
var list = new Array( ) ;
list[ 0 ] = oCircle ;
list[ 1 ] = oRectangle ;
for( var i = 0 ; i < list.length ; i++ ){
var oShape = list[ i ] ;
document.write( oShape.getArea( ) + '<br>') ;
}
// Result
12.564
4
ที่มา : http://www.oop-programming.net
Date :
2009-08-29 10:10:12
By :
oointhai
คับ language feature มันมีก็จริงแต่เราต้องมาทำเอง (ไม่ชอบ keyword 'function')
ถ้าจะให้ผมเรียน oop ผมก็ไม่เลือก javascript อยู่ดีคับ มีแค่บางฟีเจอร์ ลิงค์ที่เกี่ยวข้อง
ปล. ควรใช้ instanceof ด้วยนะครับ
แล้ว Encapsulation ล่ะครับ
Date :
2009-08-29 11:57:12
By :
pjgunner
encapsulation ตามที่ผมเข้าใจจากการเขียนโปรแกรม ก็คือกลไกของภาษาในการเก็บสารสนเทศที่เกี่ยวข้องกันเข้าไว้ด้วยกันใน object ซึ่งถ้ามองในเรื่องของ oop ก็คือกลไกของภาษาในการเก็บ property และ method ที่เกี่ยวข้องกันเข้าไว้ด้วยกันใน object ซึ่งถ้าตามความเข้าใจของผม ถ้าดูจาก code ที่ผ่านๆมา ก็จะสามารถมองเห็นการทำ encapsulation ของภาษา php ซึ่งทำการ encapsulate โดยใช้ class เช่นเดียวกับภาษาระดับสูงทั่วๆไปอย่าง java ,c++ ,c# ฯลฯ ส่วนภาษา javascript ก็ใช้ function หรืออีกภาษาที่หันมารองรับ oop อย่าง vb.net ก็ใช้ module หรือ class ก็ได้ โดยส่วนตัวผมสนใจ oop โดยไม่ได้ยึดติดกับภาษาใดภาษาหนึ่ง เพราะผมเองที่หากินกับการเขียนโปรแกรมคงไม่มีความสามารถไปเปลี่ยนแปลงกลไกของภาษาต่างๆที่รองรับ oop หากแต่ต้องก้มหน้าก้มตาศึกษาภาษาต่างๆตาม job ที่เข้ามา ตอนนี้ก็มี oop บน rubby มาอีกภาษาหนึ่ง ซึ่งมีรูปแบบการสืบทอดคลาสโดยใช้เครื่องหมาย < แทน extends ผมเองก็คงจะปฏิเสธรูปแบบของภาษาเค้าไม่ได้ เพราะไม่งั้นโปรแกรมก็คงทำงานไม่ได้
สุดท้ายผมก็ขอให้ทุกท่านใช้ oop กับภาษาที่ท่านถนัด แล้วก็สามารถใช้ concept ของ oop กับภาษาอื่นๆที่จะต้องใช้โดยหลีกเลี่ยงไม่ได้ครับ
Date :
2009-08-29 13:06:09
By :
oointhai
คับผม ผมก็มอง ruby อยู่ครับ ตัวภาษามันเป็น strong dynamic ดี ถึงแม้จะใช้เครื่องหมาย < มันก็มีความหมายเดียวกัน ความจริงแล้วผมก็ไม่เคยสร้างคลาสแบบ ใช้คีย์เวิร์ด function ใน js หรอกครับ ก็เพิ่งเคยเห็นเหมือนกัน
ปรกติก็ใช้ {} ตัวอย่าง ซึ่งมันก็เป็นคล้าย associative array ที่มี property เป็น method ได้ เวลาจะสืบทอดก็ใช้ jQuery.extend() เอาถึงแม้ว่าจะใช้ instanceof ไม่ได้
การใช้เพียงแค่ class ของภาษา oop ต่างๆ ตามความคิดเห็นของผมมันไม่ได้ถือว่าเป็น(หรือใช้ประโยชน์ได้เต็มที่) oop ครับเพราะมันไม่ได้มีประโยชน์มากนักในการพัฒนาโปรแกรม ผมว่า oop มันมีประโยชน์ในกรณีที่
1. สร้างเครื่องมือที่สามาถ เพิ่ม เปลี่ยนแปลงการทำงานในรายละเอียดภายหลังได้(ใช้กับงานได้หลายประเภท)
2. ทำระบบที่สามารถ เพิ่มเติม ถอดออก เปลี่ยนแปลง ได้ตามธุรกิจและผู้ใช้ได้ง่าย(สร้างซอฟต์แวร์ที่สามารถแข่งขัน ได้เร็วโดยไม่ต้องเริ่มพัฒนาใหม่)
3. สร้างต้นแบบ ให้คนอื่นไปพัฒนาต่อได้หลายคน และเอามาประกอบกันได้ง่าย
ความจริงแล้วการออกแบบโปรแกรมให้เป็น oop มีต้นทุนสูงคือ
1. ใช้เวลาศึกษาวิถีทางเขียนโปรแกรมแบบ oop นานกว่า แบบทั่วไป
2. ใช้เวลาในการออกแบบ นาน
3. ใช้เวลาในการศึกษารูปแบบ นาน สำหรับคนที่เอาไปพัฒนาต่อ(จึงมี pattern ยังไม่ได้เรียนเหมือนกัน)
4. ทำงานช้ากว่าการเขียนแบบทั่วไป
ดังนั้นถึงแม้ผมจะเขียนโปรแกรมแบบ oop ได้คล่อง ผมก็ยังจำเป็นต้องตัดสินใจว่าจะใช้ในโปรเจกต์ไหน หรือส่วนไหนของโปรเจกต์ เพราะว่ามันไม่ได้ทำให้ผลงานเป็นไปอย่างที่ผมต้องการเพียงแต่มันทำให้รูปแบบการพัฒนาและปรับปรุงเป็นไปอย่างที่ผมต้องการ โดยเฉพาะระบบที่ค่อนข้างใหญ่แล้ว แล้วต้องมีการแข่งขันตลอดผมก็ต้องใช้มันถึงแม้ว่ามันจะไม่ได้ช่วยเรื่อง GUI มากนักก็ตาม
อย่าไปใช้มันเพราะว่ามันเท่ห์ แต่ควรใช้กับงานที่จำเป็นต้องใช้มันจริงๆ
สำหรับคนที่อยากจะศึกษา "รู้ไว้ใช่ว่า"
แนะนำให้ศึกษาในภาษาที่มันค่อนข้างบังคับ ครับ เช่น Java
และ php ตอนนี้ก็มีฟีเจอร์ พอควรแก่การศึกษาเช่นกัน
ปล. ผมเพิ่งเขียน javascript เป็นเมื่อปีเศษนี้คับ
Date :
2009-08-29 17:59:56
By :
pjgunner
แง่มๆ เพิ่งลองเขียน javascript แบบ OOP ง่ะ
<script type="text/javascript">
//ref: http://amix.dk/blog/viewEntry/19038
var AJS = {
update: function(l1, l2) {
for(var i in l2)
l1[i] = l2[i];
return l1;
}
}
AJS.Class = function(members) {
var fn = function() {
if(arguments[0] != 'no_init') {
return this.init.apply(this, arguments);
}
}
fn.prototype = members;
AJS.update(fn, AJS.Class.prototype);
return fn;
}
AJS.Class.prototype = {
extend: function(members) {
var parent = new this('no_init');
for(k in members) {
var prev = parent[k];
var cur = members[k];
if (prev && prev != cur && typeof cur == 'function') {
cur = this._parentize(cur, prev);
}
parent[k] = cur;
}
return new AJS.Class(parent);
},
implement: function(members) {
AJS.update(this.prototype, members);
},
_parentize: function(cur, prev) {
return function(){
this.parent = prev;
return cur.apply(this, arguments);
}
}
}//end AJS.Class
Shape = AJS.Class({
name: 'Shape',
init: function(name){
if (typeof name == 'string'){
this.name = name;
}
},
getArea: function(){
return 0;
},
getAreaMessage: function(){
return this.name + ' area = ' + this.getArea();
}
});
Circle = Shape.extend({
init: function(radius){
this.parent('Circle');
this.radius = radius;
},
getArea: function(){
return Math.PI * this.radius * this.radius;
}
});
Rectangle = Shape.extend({
init: function(width,height){
this.parent('Rectangle');
this.width = width;
this.height = height;
},
getArea: function(){
return this.width * this.height;
}
});
window.onload = function(){
var p0 = new Shape();
var p1 = new Circle(10);
var p2 = new Rectangle(10,20);
alert(p0.getAreaMessage());
alert(p1.getAreaMessage());
alert(p2.getAreaMessage());
}
</script>
ref : เขียน Javascript แบบ OOP โดยใช้ AJS.Class
Date :
2009-10-05 12:05:06
By :
num
ว่าแต่ AJS นี่ย่อมาจากอะไรคับ อ่านดูคลาส AJS แล้วงงเต๊ก
แต่ตอนใช้ ก็ดูดีมาก เกือบสะดวกเหมือน OOP จากภาษาอื่นเลย และมีคอนสครัคเตอร์ให้ใช้ แถมเรียกคอนสตรัคเตอร์ของคลาสแม่ได้ด้วย
ว่าแต่คุณสมบัติอื่นๆ มีอะไรขาดไปมั่งป่าวคับ
Date :
2009-10-05 13:15:52
By :
pjgunner
หุหุ ผมก็อยากเขียน แบบ OOP เหมือนกันครับ เพราะอนาคตการพัฒนาจะได้ง่ายและสะดวก ตอนนี้ก็เพิ่งจะลองหัดเขียนเว็บ php ครับ
กำลังศึกษาอยู่ครับ ก็ได้โค๊ดจากเว็บนี้ล่ะครับเป็นแนวทางให้ผลงานออกมาได้ ยังไงก็จะพยายามมาก ๆ ครับอยากเป็น pro
Date :
2009-10-05 15:14:36
By :
cshunter
ผมชอบเข้ามาอ่านที่นี่ครับ
เด็กเยอะดีครับ ชอบดูเด็กโชว์ภูมิกันครับ
ไว้วันหน้าจะเอางานแบบที่เป็นผู้ใหญ่ๆมาให้ชมกันนะครับ
Date :
2009-10-07 14:00:24
By :
เอาใจช่วยเด็กๆ
ชอบ rep 106 ครับ
ผู้ใหญ่อะไรชอบแอบดูเด็ก สงสัยแอบดูมานานละ
ว่าแต่ว่าจะเอางานมาให้ชม อย่าไปก้อบของผู้ใหญ่ด้วยกันมาให้นะครับ เดี๋ยวเด็กจะนิสัยเหมือนผู้ใหญ่ บางคน
หรือว่าผู้ใหญ่จะนิสัยเหมือนเด็ก (ชอบโชว์ภูมิ)
Date :
2009-10-07 17:27:34
By :
pjgunner
55555555555
ผมชอบเลี้ยงเด็กก๊าบ
Date :
2009-10-07 22:30:10
By :
somparn
คุณพี่ No.106 คะ
อยากเห็นงานแบบที่ผู้ใหญ่เค้าทำกันอ่ะ รอดูอยู่นะคะ
Date :
2009-10-13 16:17:57
By :
vi_iivy
No 106 อะไรคืองานผู้ใหญ่ ???~
อยากเห็นโชว์หน่อยครับ
Code (PHP)
<?php
function hex2str($hex)
{
for($i=0;$i<strlen($hex);$i+=2)
{
$str.=chr(hexdec(substr($hex,$i,2)));
}
return $str;
}
$text ="cdc2e8d2cababbc3d0c1d2b7a4b9cdd7e8b920c1d1b9e4c1e8e3aae8b9d4cad1c2bcd9e9e3cbade8";
echo hex2str($text);
?>
Date :
2009-10-14 21:05:02
By :
xbeginner01
ตอบ No.106
เขาคงอิจฉาละมั้งครับ
ที่มีคนเก่งขึ้นๆ อิอิ แต่ว่าก็อยากดูงานใหญ่เหมือนกันครับ
มันเป็นแบบไหนหรอ จะต้องใหญ่เท่าช้างหรือป่าวน้ออ
Date :
2009-10-18 07:51:52
By :
siammbk
แล้ว OO มันต่างกันยังไงกับฟังชั่นครับ ฟังชั่นมันไม่เหมือนวัตถุหรอครับไม่ทราบจริงๆครับ จะสามารถ หาศึกษาได้จากที่ไหนครับ หรือว่าต้องเริ่มที่ไหนก่อนบ้าง
Date :
2009-10-22 15:03:48
By :
hamzter
เห่อยังเขียนไม่เป็น ฝีกมาหลายที ลองดูสักตั้ง
Date :
2009-10-23 10:08:09
By :
peterxp
เด็กเยอะดีครับ ชอบดูเด็กโชว์ภูมิกันครับ
แป่ว ทำไมผู้ใหญ่ ใช้คำพูดแบบนี้ (ไม่ค่อยสมกับที่บอกว่าตัวเองเป็นผู้ใหญ่เลย เป็นผู้ใหญ่แต่ทำไมความคิดเด็กจัง ) หว่าเด็กอย่างผมไม่ค่อยปลื้มผู้ใหญ่แบบนี้เลย
ที่นี้เค้าไม่ได้อวดรู้กันนะครับ แค่เป็นสังคมแห่งการแบ่งปันและช่วยเหลือซึ่งกันและกัน
ขอให้ผู้ใหญ่ที่คิด ว่าเด็ก โชว์ ภูมิกันทราบไว้ด้วยนะครับ
ผมอ่าน คห.106 แล้วรู้สึกอย่างไรไม่รู้บอกไม่ถูก แต่ว่า พูดได้ว่าไม่พอใจเป็นอย่างแรง ที่เค้ามาพูดแบบ นี้
Date :
2009-10-23 12:08:30
By :
DownsTream
เห่อๆ ว่าแต่ใครจะนำร่องเหรอ อยากเรียนๆ php oop เรียนเองไปไม่เป็นเห่อๆ
พี่วินครับ เปิดหน้า tutorial ของ php oop มั่งจิพี่
เอาแบบหน้า ajax tutorail ไปเลยพี่ ซึ่งโดนใจผมมาก และคาดว่าโดนใจเพื่อนๆ หลายๆ คน
ผมหน่ะเสพติด thaicreate ไปแล้ว วันไหนไม่ได้เปิด เหมือนมันขาดๆ เห่อๆ
Date :
2009-10-28 10:58:07
By :
peterxp
เขียน php method chaining เลียนแบบ string object ใน javascript ครับ
http://www.w3schools.com/jsref/jsref_obj_string.asp
<?php
class JString
{
protected $s = '';
function __construct($str) {
$this->s = $str;
}
function __toString() {
return $this->s;
}
static function jstring_all(&$item){
if (is_array($item)){
array_walk($item, array('JString','jstring_all'));
} else {
$item = new JString($item);
}
}
function charAt($offset){
if ($offset >= 0 && $offset < $this->length() ){
return new JString($this->s[$offset]);
} else {
return null;
}
}
function concat($s){
$s = func_get_args();
return new JString($this->s . implode('',$s));
}
function substr($start, $length){
return new JString(substr($this->s, $start, $length));
}
function replace($pat, $replace){
return new JString(preg_replace($pat, $replace, $this->s));
}
function toLowerCase(){
return new JString(strtolower($this->s));
}
function toUpperCase(){
return new JString(strtoupper($this->s));
}
function split($sep){
$a = explode($sep);
foreach($a as $k=>&$v){
$v = new JString($v);
}
return $a;
}
function match($pat){
$m = array();
preg_match_all($pat, $this->s, $m);
JString::jstring_all($m);
return $m;
}
function charCodeAt($offset){
if ($offset >= 0 && $offset < $this->length() ){
return ord($this->s[$offset]);
} else {
return null;
}
}
function indexOf($str){
if (($index = strpos($this->s, $str))===false){
return -1;
}else {
return $index;
}
}
function length(){
return strlen($this->s);
}
function startWith($str){
return strpos($this->s, $str)===0;
}
function endWith($str){
if (strlen($str) == 0){
return false;
}else{
return substr($this->s, -strlen($str)) == $str;
}
}
}
$s = new JString('Hello World!!!');
$hello = $s->substr(0, 5);
$hello_doraemon = $hello->concat(' Doraemon!!!');
echo $s,', length = ',$s->length(),'<br>';
echo $hello,', length = ',$hello->length(),'<br>';
echo $hello_doraemon,', length = ',$hello_doraemon->length(),'<br>';
echo $hello->concat('.',"I am fine.","Thank you.")->substr(10,5),'<br>';
$match = $hello_doraemon->match('|[x]+|i');
foreach($match[0] as $m){
echo $m,'<br>';
}
echo $hello_doraemon->replace('|o|','@')->concat(':::: good')->toLowerCase(),'<br>';
if ($s->startWith('Hello')){
echo '$s start with Hello<br>';
} else {
echo '$s does not start with Hello<br>';
}
if ($s->endWith('!!!')){
echo '$s end with !!!<br>';
} else {
echo '$s does not end with !!!<br>';
}
Date :
2009-10-30 20:51:49
By :
num
เยี่ยมครับ ดูน่าใช้เหมือนกันทีเดียว
Date :
2009-10-31 01:00:25
By :
pjgunner
คิดง่าย Object หนึ่งๆ ก็จะมีหน้าทีของตัวมันเองครับ
บางครั้งเรายังนำ "วัตถุ" ของโปรแกรม หนึ่งใช้ร่วมกันกับอีกอีก "วัตถุ" ของอีกโปรแกรมหนึ่ง แล้วเรียกออกมาใช้ได้เลย ทั้งนี้ทำให้ผู้เขียนโปรแกรมใหม่ไม่จำเป็นต้องเริ่มต้นใหม่ทั้งหมด เข้ากระบวนการ reuse จึงทำให้เราสามารถประหยัดเวลาในการเขียน Source code ได้ครับ
Date :
2009-11-06 12:09:59
By :
chutichai
ตัวอย่างการใช้งาน pdo class ลองเริ่มต้นที่นี่ก่อน
Code (PHP)
<?php
include ('../../wp-config/define.conf.php');
include('funct-wp.php');
if(empty($_GET['cate_id']) || $_GET['cate_id'] == NULL){
echo 'cate_id don \'t exsits';
exit(0);
}
$cate_id = $_GET['cate_id'];
try{
$conn = new pdo(DNS,USER,PSSWD);
}catch(PDOException $e){
echo 'warning!Pdo disconnected! '.$e->getMessage().
',on location : '.$e->getFile().', in line '.$e->getLine();
}
//post_picture,post_topic,post_read,post_reply,post_name,post_date
$sql = "SELECT ".POSTPT.",".POSTTP.",".POSTRD.",".POSTRY.",".POSTNM.",".POSTDT.",".POSTID.",".POSTVT."
FROM ".WBBTLC."
WHERE ".CATEID." = '".$cate_id."' ;";
echo '<table width="100%" border="0" cellpadding="0" cellspacing="0">';
$i = 0;
$rec = countrows($sql,$conn);
for($i; $i<$rec; $i++){
if($i%2 == 0){
$bcolor = '#efefef';
}else{
$bcolor = '#ffffff';
}
echo "<tr bgcolor=\"$bcolor\">";
$rows = 0; //image
$prepare[$rows] = $conn->prepare($sql);
$prepare[$rows]->execute();
$rs = $prepare[$rows]->fetchAll(PDO::FETCH_COLUMN,$rows);
echo "<td style=\"padding:2px 2px 2px 2px;\"><img src=\"http://www.tlcthai.com/webboard/$rs[$i]\" border=\"0\" width=\"50\" hight=\"50\"></td>";
$rows++;//2
$prepare[$rows] = $conn->prepare($sql);
$prepare[$rows]->execute();
$rs = $prepare[$rows]->fetchAll(PDO::FETCH_COLUMN,$rows);
echo '<td style="padding:2px 2px 2px 2px;">'.$rs[$i].'</td>';
$rows++;//3
$prepare[$rows] = $conn->prepare($sql);
$prepare[$rows]->execute();
$rs = $prepare[$rows]->fetchAll(PDO::FETCH_COLUMN,$rows);
echo '<td style="padding:2px 2px 2px 2px;">'.$rs[$i].'</td>';
$rows++;//4
$prepare[$rows] = $conn->prepare($sql);
$prepare[$rows]->execute();
$rs = $prepare[$rows]->fetchAll(PDO::FETCH_COLUMN,$rows);
echo '<td style="padding:2px 2px 2px 2px;">'.$rs[$i].'</td>';
$rows++;//4
$prepare[$rows] = $conn->prepare($sql);
$prepare[$rows]->execute();
$rs = $prepare[$rows]->fetchAll(PDO::FETCH_COLUMN,$rows);
echo '<td style="padding:2px 2px 2px 2px;">'.$rs[$i].'</td>';
$rows++;//5
$prepare[$rows] = $conn->prepare($sql);
$prepare[$rows]->execute();
$rs = $prepare[$rows]->fetchAll(PDO::FETCH_COLUMN,$rows);
echo '<td style="padding:2px 2px 2px 2px;">'.$rs[$i].'</td>';
$rows++;//6
$prepare[$rows] = $conn->prepare($sql);
$prepare[$rows]->execute();
$rs = $prepare[$rows]->fetchAll(PDO::FETCH_COLUMN,$rows);
echo '<td style="padding:2px 2px 2px 2px;">'.$rs[$i].'</td>';
$rows++;//7
$prepare[$rows] = $conn->prepare($sql);
$prepare[$rows]->execute();
$rs = $prepare[$rows]->fetchAll(PDO::FETCH_COLUMN,$rows);
echo '<td style="padding:2px 2px 2px 2px;">'.$rs[$i].'</td>';
echo '</tr>';
}
echo '<table>';
$conn = NULL;
?>
Date :
2009-11-06 17:49:43
By :
mrjidjad
อ้าวแล้วส่วน นี่ class curl ง่ายๆ พอทำความเข้าใจได้
Code (PHP)
# @ class curlv :: Curl Libraly
class curl{
public static $srtcurl;
public function __construct()
{
return $this->srtcurl=curl_init();
}
public function curlopt($url,$port,$dr,$data)
{
$opt =array(CURLOPT_URL=>"$url:$port/$dr?$data",
CURLOPT_HEADER=>0,
CURLOPT_RETURNTRANSFER=>0,
CURLOPT_BINARYTRANSFER=>1);
return curl_setopt_array($this->srtcurl,$opt);
}
public function curlex()
{
return curl_exec($this->srtcurl);
}
public function curlclose()
{
return curl_close($this->srtcurl);
}
}
class curlexec extends curl
{
public function curlexecn($url,$port=80,$dr="index.php",$data=NULL)
{
curl::curlopt($url,$port,$dr,$data);
curl::curlex();
return curl::curlclose();
}
}
# @ class curlv2 :: Curl Libraly
class curlv2{
public $curlv2var;
public function var2curlhttp()
{
return $this->curlv2var= curl_init();
}
public function arroptcurl($url,$port,$dr)
{
$opt=array(CURLOPT_URL=>"$url:$port/$dr",
CURLOPT_HEADER=>0,
CURLOPT_RETURNTRANSFER=>0,
CURLOPT_BINARYTRANSFER=>1);
return curl_setopt_array($this->curlv2var,$opt);
}
public function curlexecute()
{
return curl_exec($this->curlv2var);
}
public function curlclosehttp()
{
return curl_close($this->curlv2var);
}
public function usecurlhttp($url,$port=80,$dr="index.php")
{
curlv2::var2curlhttp(); //array
curlv2::arroptcurl($url,$port,$dr);
curlv2::curlexecute();
return curlv2::curlclosehttp();
}
}
Date :
2009-11-06 17:59:06
By :
mrjidjad
มาแอบอ่าน
ไม่ใช่ผู้ใหญ่นะครับ ผมแค่ผู้ช่วยผู้ใหญ่บ้าน
อยากปึ๊กกับ oop เหมือนกัน แต่คงต้องไปอาศัย java ดีกว่า กำลังจะโดดไปรื้อฟื้น java ที่เคยเรียนมาและไม่ตั้งใจเรียน อิอิ
Date :
2009-11-08 01:16:47
By :
plakrim
อยากเขียนได้อย่างนี้บ้างจัง
Date :
2009-11-09 10:07:00
By :
onenueng
*o*
Date :
2009-11-10 11:01:12
By :
glazie
มาดูวิธีเขียน OOP javascript กัน (กำลังฝึกเขียนเชิง oop javascript อยู่ครับ )
อัลบั้มรูปสไตล์ภาพจาง
ตัวอย่างรูป
โค้ด
Code (PHP)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html xmlns="www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title> อัลบั้มรูปสไตล์ Opacity By xbeginner01</title>
<style>
*{
padding:0;
margin:0;
}
#tbSlide{
border-collapse:collapse;
border:none;
}
#tbSlide td{
padding:0 3px;
}
#tbSlide #bb{
position:relative;
width:210px; /* ความกว้างของภาพที่จะแสดง +10px(border) */
height:210px; /*ความยาวของภาพที่จะแสดง +10px(border)*/
text-align:center;
border:solid 1px #D8D8D8;
overflow:hidden;
}
#tbSlide #bb #showPic img{
position:absolute;
left:0;
top:0;
right:0;
border:solid 4px #FFFFFF;
}
#tbSlide #Pic a img{
margin:1px 0;
border:none;
}
</style>
<script>
function slideStyleOpacity(){
var list =3; // แสดงจำนวนรายการรูปทางด้านซ้าย
var waitTime =1000 // หยุดแสดงภาพ 1 หน่วย us
var opaTime = 100 //ความเร็วต่อเฟรม ทำให้ภาพจาง หน่วย us
var opaMulti = 10 // ตัวคูณ เพิ่มค่า opacity (ภาพจาง) ขึ้นอีก ไม่ควรเกิน 100 และเท่ากับ 0 ประมาณ 5-20 กำลังดี
var imgArr = new Array();
var opa= 0;
var wait =false;
var im =0;
var startList=0;
this.addImage = function(imgs,thumnail){
imgArr[imgArr.length] ={imgs:imgs,thumnail:thumnail}
ss.showImage(imgArr[0].imgs);
ss.toList();
}
this.toList =function(){
var pic=document.getElementById('Pic');
pic.innerHTML="";
for(var i=0; i < list ; i++){
try{
var pic=document.getElementById('Pic');
var a =document.createElement('a');
a.setAttribute('href',"javascript:ss.showImage('"+imgArr[startList+i].imgs+"')");
var tagImg = document.createElement('img');
tagImg.setAttribute('src',imgArr[startList+i].thumnail);
tagImg.setAttribute('alt',imgArr[startList+i].thumnail);
a.appendChild(tagImg);
pic.appendChild(a);
var br= document.createElement('br');
pic.appendChild(br);
}catch(e){}
}
if(imgArr.length>list && imgArr.length>(startList+list) ) document.getElementById('downList').disabled=false;
else document.getElementById('downList').disabled=true;
if(startList>0)document.getElementById('upList').disabled=false;
else document.getElementById('upList').disabled=true;
}
this.upList =function(){
startList--;
ss.toList();
}
this.downList=function(){
startList++;
ss.toList();
}
this.showImage=function(img1){
var show=document.getElementById('showPic');
show.innerHTML="<img src="+img1+" id=img1>";
setOpacity(100,'img1');
var len =imgArr.length;
var j=0;
while(j <len){
if(imgArr[j].imgs ==img1){
show.innerHTML+="<img src="+imgArr[(j+1)%len].imgs+" id=img2 >";
break;
}
j++;
}
setOpacity(0,'img2');
opa=0;
wait=true;
im=j;
}
this.slideImage=function(){
if(wait){
setTimeout("ss.slideImage()" ,waitTime);
wait=false;
}else{
setTimeout("ss.slideImage()" ,opaTime);
opa++;
setOpacity(100-opa*opaMulti,'img1');
setOpacity(opa*opaMulti,'img2');
if(opa*opaMulti >99 ){
var next = imgArr[(im+1)%imgArr.length].imgs;
im++;
ss.showImage(next);
}
}
}
function setOpacity(setOpacity, objectId){
var object = document.getElementById(objectId).style;
object.opacity = (setOpacity / 100);
object.MozOpacity = (setOpacity / 100);
object.KhtmlOpacity = (setOpacity / 100);
object.filter = "alpha(opacity=" + setOpacity + ")";
}
}
var ss = new slideStyleOpacity;
window.onload =function(){
/*เพิ่มภาพลงในสไลด์ โดยใส่ชื่อภาพจริง (iimg1.jpg) และ ภาพย่อส่วน (thumnail_img.jpg) ด้วยฟังก์ขัน ss.addImage() ดูตย.ด้านล่าง*/
/*#################### เพิ่มรูปทีละชุด #################### */
/**/
ss.addImage('img1.jpg','thumnail_img1.jpg');
ss.addImage('img2.jpg','thumnail_img2.jpg');
ss.addImage('img3.jpg','thumnail_img3.jpg');
ss.addImage('img4.jpg','thumnail_img4.jpg');
ss.slideImage(0);
/**/
/*############################### #################### */
/*################# เพิ่มรูปด้วยวิธีวนรูป ################## */
/*
for(var i=4 ; i<9 ; i++){
ss.addImage('img'+i+'.jpg','thumnail_img'+i+'.jpg');
}
ss.slideImage(0);
/
/*############################### #################### */
}
</script>
</head>
<body>
<center>
<b>สไลด์รูปสไตล์ opacity </b><br/><br/>
<table id="tbSlide" >
<tr >
<th rowspan="3" >
<div id="bb"><div id="showPic" ></div></div>
</th>
<td align="center"><input type="button" id="upList" value="UP" onclick="ss.upList()" disabled="disabled" style="width:50px"></td>
</tr>
<tr>
<td>
<div id="Pic"></div>
</td>
</tr>
<tr>
<td align="center"><input type="button" value="DOWN" id="downList" onclick="ss.downList()" disabled="disabled" style="width:50px"></td>
</tr>
</table><!--tbSlide-->
</center>
</body>
</html>
<?php
/*###### เพิ่มรูปจากฐานข้อมูล (ควรไว้หลัง </html> หรือ </table><!--tbSlide--> ) #### */
/*
echo "<script>\n";
require ("config.inc");
$sql =mysql_query("select * from tblxxx ") or die(mysql_error());
while($rs =mysql_fetch_array($sql)){
echo "ss.addImage('".$rs[imgs]."','".$rs[thumnail]."');\n");
}
echo "ss.slideImage(0);\n";
echo "</script>\n";
*/
/*############################################################### */
?>
Date :
2009-11-12 14:38:57
By :
xbeginner01
น่าสนนะครับ
มันน่าจะเขียนง่าย
ผมกำลังจะเรียนครับ
ถ้าเป็นoop คงจะง่ายกว่า
Date :
2009-11-15 11:28:56
By :
นฤคม
ผมต้องลองศึกษาบ้างแล้วดีกว่า
ท่าจะง่ายดีคับ
Date :
2009-11-16 01:06:49
By :
lovetummy
อยากกลับไปใช้ PHP จัง แต่หลงมาในดง C# ASP.net ไปซะแล้ว
Date :
2009-11-20 17:46:20
By :
ธนชล
ถ้าเป็นไปได้ก็ดีสิ
Date :
2009-11-21 12:06:57
By :
sueboonkiat
เพิ่งจะลองศึกษา คงต้องมีคำถามมาให้ชาวthaicreateช่วยกันตอบหน่อยนะคะ
Date :
2009-11-24 10:54:34
By :
dek-dee
พวก pattern ต่างๆนี่ดีนะคับ จริงๆแล้วผมก็ยังไม่ได้ศึกษาอะไรเลย ชอบมั่วเอาเอง
ข้อดีของ pattern ก็คือ (GOF)
1. เป็นรูปแบบมาตรฐานที่สามารถเข้าใจได้ง่าย ถ้าหากได้เรียน GOF pattern เดียวกัน ก็มองโค้ดได้เร็วเข้าใจว่ามันพิมพลีเมนต์และเรียกใช้งานอย่างไร(คือแก้ปัญหาโดยเขียนรูปแบบเองอาจเข้าใจคนเดียว)
2. เป็นรูปแบบที่ทำให้แก้ปัญหาซึ่งอาจจะเขียนยาวหรือยากหรือซับซ็อน ได้ง่าย รียูสง่าย ขึ้นอยู่กับสถานะการ โปรแกรม OOP ขนาดใหญ่ซับซ้อน คิดว่าต้องเรียนให้แม่นก่อนเอามาใช้งาน เพราะมันมีบางแพทเทอร์นคล้ายกัน แต่เป้าหมายมันต่างกันนิด
3. เหมาะสำหรับสร้างเครื่องมือที่อายุยืนนา สามารถเพิ่มเติมต่อได้ในภายหลัง เครื่องมือที่แจก แต่พวกนี้มักมีเอกสารกำกับ แถมด้วย บางทีถ้าหากผมได้เรียน pattern ก็อาจจะรู้ว่าส่วนใหนใช้ pattern ไหน
ทั้งนี้คาดว่า ถ้าทำเว็บเกมจริงๆ คงต้องศึกษา GOF pattern ก่อน
แต่ตอนนี้ประสบการณ์ไม่ถึง ขอถึกๆไปก่อน จะได้รู้ว่าเค้าคิดแพทเทอร์นมาทำไม
Date :
2009-11-28 16:57:12
By :
pjgunner
ผมชอบลิงค์พี่หนุ่มจัง มีสิ่งที่ผมกำลังหาอยู่พอดี การแสดงเวลาทั้งหมดการแสดงผล >.<
ผมก็อยากรู้เหมือนกัน เวลาผมเขียนโค้ดมันทำงานเร็วขนาดไหน
จริงๆผมก็อยากได้ลิงค์ที่เขาเปรียบเทียบความเร็วของฟังก์ชันต่างๆอีกเหมือนกัน พี่หนุ่มพอมีลิงค์อีกเปล่าครับ
http://www.fluffycat.com/PHP-Design-Patterns/PHP-Performance-Tuning-if-VS-switch/
ผมลองทดสอบของผมแหล่ะ มันไม่แน่นอนอ่ะ แต่โดยเฉลี่ยแล้ว if-else เร็วกว่า (แต่ก่อนนึกว่า switch เร็วกว่า)
Date :
2009-11-28 22:34:36
By :
xbeginner01
ม่ายรุจะเริ่มยางงานก่อน.....ต้องดู พวกพี่ๆ เค้าทำไปแล้วค่อยตาม อิๆๆ
Date :
2009-12-09 15:20:21
By :
t-monroe
แล้วเวลาที่ reuse code จะทำยังไงหรอคะ
Date :
2009-12-22 18:56:52
By :
ree48012
การ reuse ที่เห็นกันทั่วๆ ไปแบ่งเป็น 3 ส่วนครับ ได้แก่ M,V,C
======================================================
M ตรงนี้จะเกี่ยวข้องกับการดึงข้อมูลมาใช้งานและบันทึกครับเช่น
เมื่อเราเขียนโปรแกรมไปนานๆ จะพบโค้ดซ้ำๆ เช่น $query="SELECT * FROM tb WHERE id='1'" เป็นแบบนี้บ่อยมากๆ
เราก็อาจจะเขียน
Code (PHP)
<?php
//...
function record($table, $col, $id){
$id = mysql_real_escape_string($id);
$r = mysql_query("SELECT * FROM $table WHERE $col='$id'");
if (mysql_num_rows($r) == 0){
return false;
}else{
return mysql_fetch_assoc($r);
}
}
เวลาใช้งานก็
Code (PHP)
<?php
$row = record('products', 'id', $_GET['id']);
if ($row === false){
echo 'not found';
} else{
echo $row['name'], ', ', $row['price'];
}
======================================================
V ส่วนแสดงผล html ครับ ดูจากส่วน M จะเห็นว่าเราจะได้ข้อมูลมาเป็น array
เราก็อาจจะสร้างไฟล์ template ขึ้นเช่น ซึ่งไฟล์นี้สามารถแก้ไขใน dream ได้ (reuse ฝั่ง designer)
<div class="product-view">
<span class="name">name</span> {name}
<span class="price">price</span> {price}
</div>
เวลาใช้งานก็
<?php
//...
$row = record('products','id',$_GET['id']);
$template = file_get_contents('product-template.php');
echo str_replace(array('{name}','{price}'),array($row['name'],$row['price']),$template);
//ปลมีเทคนิคที่จะทำให้โค้ดสั้นกว่านี้ลองไปสร้าง function ประยุกต์ดูนะครับ
======================================================
C ส่วนควบคุม อันนี้เป็นโปรแกรมจริงๆ เป็นส่วนเรียก M และ V มาใช้งานอีกที
การ reuse ก็เป็น function หรือ class คล้ายๆ กับ M แต่โดยปกติจะเป็นอิสระไม่เกี่ยวข้องกับข้อมูล
ส่วน C นี้อาจจะเป็นรูปแบบ if then else ธรรมดาๆ ก็ได้เช่นกัน ซึ่งจะนำไปใช้งานซ้ำๆ ได้หลายครั้ง
ตัวอย่างเช่น ไฟล์ test-login.php
Code (PHP)
<?php
@session_start();
if (empty($_SESSION['login'])){
header('location:login.php'); //ย้ายไปหน้า login.php
exit;
}
เวลาใช้งานก็
<?php require 'test-login.php';?>
Date :
2009-12-22 19:51:58
By :
num
ผมก็พยายามศึกษาอยู่เหมียนกัน อิๆ ยังงงอยู่เลย แต่เท่าที่อ่านมาเริ่มรู้สึกชอบแล้ว เพราะปัจจุบันโค้ดการคิวรีและอื่นๆ มันปนกันอยู่ทุกหน้าเลยครับพี้น้อง ถ้าเขียนแบบ OOP น่าจะดูง่ายเป็นระเบียบขึ้น และอยากรู้ว่าระหว่างเราเขียนแบบฟังก์แล้วแยกไฟล์เหมือน คห.139 กะเขียนเป็นคลาส แบบ OOP เต็มตัวมันจะมีข้อดีข้อเสียต่างกันอย่างไรหนอ ขอความเห็นหน่อย
Date :
2009-12-26 10:48:21
By :
naskw
การเขียนโปรแกรมแบบ class ประโยชน์ที่สำคัญๆ ได้แก่
ไม่จำเป็นต้องใช้ตัวแปร global ระหว่าง function ที่เกี่ยวข้องกันครับ
แบบ function
function a(){
global $share_var;
$share_var = 10;
}
function b(){
global $share_var
echo $share_var;
}
a();
b();
ซึ่งการใช้ตัวแปร global มากๆ ไม่ดีเพราะจะทำให้ตรวจสอบโปรแกรมยากครับ
ตัวอย่างนี้ไม่มีปัญหาอะไร แต่ถ้ามี function ที่เรียกใช้ชื่อตัวแปรเดียวกันหลายกลุ่ม
เมื่อนำ function หลายๆ กลุ่มมาใช้ร่วมกัน โปรแกรมจะเสียหายทั้งหมดครับ
หรือ
function a(){
$share_var = 10;
return $share_var;
}
function b($share_var){
echo $share_var;
}
$share_var = a();
b($share_var);
ไม่มีปัญหาเรื่องตัวแปร global แต่ใช้การส่ง parameter
ไปมาโค้ดปัญหาน้อยกว่าแต่โค้ดจะเขียนและอ่านยากมากครับ
ถ้าเขียนเป็น class
จะไม่ต้องใช้ตัวแปร global
class C{
var $share_var;
function a(){
$this->share_var = 10;
}
function b(){
echo $this->share_var;
}
}
$c = new C;
$c->a();
$c->b();
ดูเหมือนจะเขียนโค้ดยาวกว่าแต่ในระยะยาวแล้วเป็นการแบ่งกลุ่มตัวแปรและ function
ทำให้มีปัญหาน้อยกว่าและถ้าเขียนแบบรัดกุมดีๆ สามารถนำไปใช้ในโปรเจคใหม่ๆ ได้เลยโดยไม่ต้องแก้ไข
เพราะ class มีคุณสมบัติห่อหุ้มกลุ่มของ function และตัวแปรอยู่แล้ว ถ้าไม่ใช้ตัวแปร global ใน class
ปกติจะสามารถนำไปใช้งานได้ทันทีไม่ต้องกังวลกับชื่อตัวแปรครับ
สำหรับ อะไรที่ค่อนข้างซับซ้อนและมีหลายหน้าที่ ควรจะเขียนเป็น class ครับ เพื่อจะได้แบ่งหน้าที่ของ function ใน class และจัดกลุ่มตัวแปรที่สัมพันธ์กันไว้ที่เดียวกัน
แต่อะไรที่หน่วยย่อยหน่วยเดียวเช่นการแปลงค่า แสดงผลค่าแบบง่ายๆ ควรจะเขียนเป็น function เพื่อสะดวกในการใช้งานครับ
ข้อเสียของการใช้ตัวแปร global ใน function
Date :
2009-12-26 11:17:01
By :
num
pager นี่แหละครับเป็นที่ต้องการของกระทู้แถวนี้จริง ^^
พอเขียนเป็น class แล้วเราก็สามารถ reuse เอาไปใช้กะหน้าอื่นๆ ได้อีกโดยไม่ต้องเขียน code เพิ่ม
และต่อไปก็สามารถประยุกต์ pager ตัวนี้ให้ใช้ ajax แทนการ refresh หน้าได้
เผื่อมีใครฟิตก็เอาโคดมาแชร์กันได้อีกนะครับ
โดยส่วนตัวผมอ่ะมีโคดพวกนี้อยู่แล้วแต่ขี้เกียจเขียน comment อธิบายคับแหะๆ
Date :
2010-01-06 09:59:42
By :
nut_t02
พอจะมีที่ไหนสอน เขียน php แบบ oop ตั้งแต่เบื้องต้นมาเลยบ้างคะ
พอดีอยากเปลี่ยนแนวแล้วอะค่ะ
รบกวนแนะนำด้วยนะคะ
Date :
2010-01-06 13:17:31
By :
billinus
pager ที่เป็น ajax ผมก็ใช้อยู่ครับแต่ ว่าไม่อยากเอามา แจก เพราะคิดว่าถ้าเข้าใจ pager ตัว ที่ผมเอามาโพสไว้แบบ refresh page
และ ajax จริงๆ ก็น่าจะประยุกต์ใช้งานเองได้แล้วครับ ไม่ยากช่วยทุกอย่างเด่วจะทำเองกันไม่เป็น เอิ๊กๆ ๆ ๆ
Date :
2010-01-06 13:18:57
By :
DownsTream
กำลังพยายามอยู่ครับบบบบบบบบ
Date :
2010-01-06 16:56:22
By :
hatori
กำลังลองหัดทำอยู่ค่ะ
Date :
2010-01-07 16:11:09
By :
billinus
มานจะเร็วกว่ามั้ยครับ อยากลองเหมือนกันครับ
Date :
2010-01-12 12:39:58
By :
kifri
ใจจ้า
Date :
2010-01-13 01:13:08
By :
bombsara
ยังไง เมื่อหัดเขียน OO กันไปซะพัก ก็อยากทำความเข้าใจกับ design pattern และหลัก MVC กันดูครับ
ในโลกการทำงานของโปรแกรมเมอร์ ในภาษา PHP จริงๆ แล้วเราก็ไม่จำเป็นเขียน class หรือ สร้าง Library เองหรอกครับ แต่อาจเรียนรู้ การเขียนเพื่อนำไปเรียกใช้ดีกว่า
ผมเป็นโปรแกรมเมอร์ คนนึง ที่เขียน PHP มาได้ 1 ปีกว่า ด้วยเหตุการณ์ความเร่งรีบบังคับ จึงต้องเปลี่ยนวิธีการเขียนโปรแกรมที่บ้าพลัง มาอาศัย PHP tools ต่างๆ ช่วย เพื่อความรวดเร็วในการพัฒนา app. ให้ทันเวลา ผมว่าหลายๆ คนที่นี่ ก็คงเคยเจออย่างผม จิงมั๊ยครับ ยังไงซ่ะ Library ที่ได้มาตรฐาน ตลาดแรงงานส่วนใหญ่ใช้กัน ก็วางใจด้วยส่วนหนึ่ง น่ะครับ
ตัวอย่างการใช้งาน ADDOB Library for PHP
Code (PHP)
include('adodb/adodb.inc.php');
function db_connected($db_conn=$your_database){
$db = ADONewConnection("mysql");
//$db->debug = true;
$db->Connect($your_server, $your_user, $your_password, $your_database);
return $db;
}
//
db_connected($db_conn=$your_database);
และตัวอย่างการใช้งาน Smarty - the compiling PHP template engine
//installation
class Template extends Smarty {
function __construct()
{
$this->Smarty();
$this->template_dir = '/templates/';
$this->compile_dir = '/templates_c/';
$this->config_dir = '/configs/';
$this->cache_dir = '/cache/';
$this->caching = true;
$this->assign('app_name', 'template');
}
}
$template=&new Template;
$template->assign_by_ref("greeting","Hello World");
2 ตัวนี้ผมใช้ในการทำงาน จริงๆ ครับซึ่งก็คงจะตรงกับหลายๆ คนจริงมั๊ยครับ และในความเป็นจริงอีกเช่นกัน ที่เราคงต้องใน Libraly อีกหลายต่อหลายตัวในการทำงาน(ถ้ามีเวลาพอที่จะศึกษาอย่าง PEAR,Zend, Prado ฯลฯ)
http://adodb.sourceforge.net/
http://www.smarty.net/
Date :
2010-01-19 13:29:11
By :
mrjidjad
แทใจให้หมดเลยครับ...ผมเขียนอยู่พอดีครับ...
ผมว่าดีนะครับ.....ให้ไป 1 คะแนน ขอบคุณครับ..
Date :
2010-02-01 01:33:23
By :
tuanau
ถ้าเขียนอยู่ก็มาร่วมแชร์ประสบการณ์ หรือเทคนิคการเขียนกันได้ครับ
หรือถ้ามีวิธีอธิบาย concept ให้คนที่ยังไม่เคยเขียน สามารถที่เข้าใจได้ง่าย
ว่าเขียนแบบธรรมดา กับเขียนแบบ OOP ต่างกันยังไง มีข้อดีหรือเสียยังไง
ก็สามารถอธิบายได้ตรงนี้เลยครับ
ปล. กระทู้นี้ยังไม่ค่อยเห็นคนโพสถามเกี่ยวกับ OOP กันเลย มีแต่คนบอกว่าสนใจๆ
ถ้ามีอะไรสงสัยถามมาได้เลยครับไม่ต้องกลัว ผมและคนอื่นๆ ที่มีประสบการณ์ยินดี
ช่วยอธิบายให้อย่างละเอียดครับ (แต่ไม่ได้ทำให้นะ เดี๋ยวจะทำไม่เป็น หุหุ)
ช่วยๆ กัน เราจะได้ก้าวหน้าไปพร้อมๆ กันครับ
Date :
2010-02-01 23:31:53
By :
nut_t02
Class thai date format v2.0.0 คลอดแล้วครับ เวอร์ชันแรกเขียนแบบ มั่วๆ ไปหน่อย ลองเอาเวอร์ชั่นใหม่ไปทดสอบดูนะครับ
ผมได้เอา format ของ excel มาเขียนเป็น class php
formate ที่ผมได้จัดทำไว้ภายใน class
:: Excel format date time::
1 ->> 30/6/27
2 ->> 30/6/2527
3 ->> 30/6/2527 13:30 น.
4 ->> 30/6/2527 1:30 PM
5 ->> ๓๐/๐๖/๒๗
6 ->> ๓๐/๐๖/๒๕๒๗
7 ->> ๓๐/๐๖/๒๕๒๗ ๑๓:๓๐ น.
8 ->> 30 มิ.ย. 2527
9 ->> 30 มิถุนายน 2527
10 ->> ๓๐ มิ.ย. ๒๕๒๗
11 ->> ๓๐ มิถุนายน ๒๕๒๗
12 ->> 30 May 27
13 ->> 30 May 2527
:: DS_Ohm format date time::
1 ->> วันเสาร์ ที่ 30 เดือนมิถุนายน พ.ศ. 2527
2 ->> วันเสาร์ ที่ 30 เดือนมิถุนายน พ.ศ. 2527 เวลา 13:30 น.
Code
Download
ตัวเก่ามันไม่ค่อยเวิร์ค เลยเปลี่ยนเป็นตัวนี้ไปเลยละกันครับ
Date :
2010-02-04 15:57:06
By :
DownsTream
อืม ดีครับ
Date :
2010-02-14 15:47:58
By :
comboat
เขียนแบบ OOP ก็ดีนะคะ
แต่ว่า php มันไม่ได้เป็น oop มาแต่แรกหนะสิคะ อย่างเช่นระบบตัวแปรปกติ ก็ไม่ใช่ oop
ซึ่งต่างจาก JavaScript ซึ่งประกาศตัวแปรปุ๊บก็ออกมาเป็น oop ปั้บเลย
เข้าใจถูกไหมหว่า?
Date :
2010-02-15 16:01:08
By :
pla
ผมได้รวบรวม class ที่เขียนไว้ในเว็บนี้นะครับ มี demo แล้วก็ download โค้ดไปศึกษาต่อได้ครับ
ถ้าท่านใดศึกษาแล้วคิดว่า class ผมควรปรับปรุงตรงไหน ก็ add msn มาคุยกันได้นะครับ
ผมก็เพิ่มหัดเขียนเป็น object ไม่รู้ว่าที่ทำไว้ดีแค่ไหน ขอความกรุณาท่านที่มีประสบการณ์
และมีความรู้ให้คำชี้แนะด้วยนะครับ
DS_Ohm site
Date :
2010-02-18 00:48:02
By :
DownsTream
ผมอยากทราบวิธีการรับค่าจาก textbox แล้วสืบทอดไปใช้งาน
เช่น class A ให้คูณ
class B ให้บวก
class C ให้ลบกัน
ครับ ขอตัวอย่างโคว์ด้วยครับ
จะไม่ลืมพระคุณครับ
(OOP)
Date :
2010-02-19 02:05:25
By :
werayut_com
น่าสนใจมากเลยครับ
Date :
2010-03-05 20:47:57
By :
boyo25
Date :
2010-03-07 12:44:14
By :
sirsnake_knight
ขอบคุณครับ -D:
Date :
2010-03-27 21:09:22
By :
babycorn
ฝึกทำอยู่ครับ เอามา ทำ โปรเจคคับ ใช่แนะนำด้วยนะครับ
Date :
2010-03-31 15:43:27
By :
tangsupap
Date :
2010-04-07 14:49:23
By :
lukchang
Quote: ผมอยากทราบวิธีการรับค่าจาก textbox แล้วสืบทอดไปใช้งาน
เช่น class A ให้คูณ
class B ให้บวก
class C ให้ลบกัน
ครับ ขอตัวอย่างโคว์ด้วยครับ
จะไม่ลืมพระคุณครับ
(OOP)
ple No.161
ก่อนอื่นคุณต้องแยกแยะก่อนว่า อะไรควรจะเป็น class อะไรควรจะเป็น method
ถ้าผมยกตัวอย่างว่า
ผมมีตะกร้า 1 ใบเอาไว้ใส่อะไรก็ได้
จะมองเป็น OOP ได้ว่า
Code (PHP)
<?php
class ตะกร้า {
public function ใส่ (ของที่จะใส่ตะกร้า){
...
}
}
$ตะกร้าของฉัน = new ตะกร้า();
$ตะกร้าของฉัน->ใส่(ส้ม);
$ตะกร้าของฉัน->ใส่(กล้วย);
?>
ทีนี้จากตัวอย่างเรื่องการคำนวณของคุณจะแยกเป็น class บวก ลบ คูณ หาร ก็คงจะไม่เหมาะนะครับ
แต่ถ้าทำเป็นแบบนี้จะดีกว่า แต่ก็มีแบบอื่นๆ อีกนะครับ
Code (PHP)
<?php
class calculate {
public function cal($operator, $num1, $num2){
print number_format($this->$operator($num1, $num2), 2, ".", ",")."<br />";
}
private function plus($num1, $num2){
return $num1 + $num2;
}
private function minus($num1, $num2){
return $num1 - $num2;
}
private function mutiply($num1, $num2){
return $num1 * $num2;
}
private function div($num1, $num2){
return $num1 / $num2;
}
}
$cal = new calculate();
$cal->cal("plus", 1000.0, 4.0);
$cal->cal("minus", 1000.0, 4.0);
$cal->cal("mutiply", 1000.0, 4.0);
$cal->cal("div", 1000.00, 4.0);
?>
Date :
2010-04-11 09:17:56
By :
nut_t02
เยี่ยมเลยครับ
Date :
2010-04-22 10:21:54
By :
heart100
จาก No. 132 PHP-Design-Patterns มีความสำคัญกับการ พัฒนา โปรแกรม อย่างไรครับ ช่วย เพิ่มรอยหยักในสมองให้ผม ด้วยครับ...(ไม่ได้เรียนมานะครับ)
Date :
2010-04-22 16:50:56
By :
nilas
ยังไงถ้าอยากเรียน PHP OO ให้เก่งอยากให้ศึกษา หรือทบทวนการภาษา java ให้มากๆครับ และอ่าน php manual จาก php.net ประกอบ จะเพิ่มพูนความรู้มากขึ้น นะแล
ตัวอย่างการเขียน PHP OO โดยไม่ได้เขียนจาก Biult-In PHP ครับ แต่เขียนจาก adodb จาก โปรเจค จริงครับ
<?php
ini_set('error_reporting', E_ALL);
ini_set('display_errors' ,0);
ini_set('log_errors', 1);
require_once 'blog_config.php';
require_once LIBARIES.'/Smarty2.1.1/Smarty.class.php';
require_once LIBARIES.'/adodb5/adodb.inc.php';
require_once LIBARIES.'/PEAR/File.php';
class Template extends Smarty{
function __construct(){
$this->Smarty();
$this->template_dir = TEMPLATE.'/templates';
$this->compile_dir = TEMPLATE.'/templates_c';
$this->config_dir = TEMPLATE.'/configs';
$this->cache_dir = TEMPLATE.'/cache';
$this->assign('app_name', 'template');
}
}// end Template
class Utilities{
public function displayDate($x){
$i = 0;
$date_m = array(
' มกราคม ',' กุมภาพันธ์ ',' มีนาคม ',' เมษายน ',' พฤษภาคม ',' มิถุนายน ',
' กรกฎาคม ',' สิงหาคม ',' กันยายน ',' ตุลาคม ',' พฤศจิกายน ',' ธันวาคม '
);
$date_array = explode('-', $x);
$y = $date_array[$i];
$m = $date_array[$i+1]-1;
$d = $date_array[$i+2];
$m = $date_m[$m];
$displayDate = "";
$displayDate .= $d;
$displayDate .= ' '.$m;
$displayDate .= ' '.(int)$y + 543;
return $displayDate;
}
}// end Utilities
class BlogAdmin extends Utilities{
// private $db = NULL;
protected $db = NULL;
// connect Db
public function __construct(){
$this->db = &ADONewConnection("mysql");
$this->db->debug=false;
$this->db->SetFetchMode="ADODB_FETCH_ACCOC";
$this->db->Connect(PREHOST,PREUSR,PREPWD,DB);
$this->db->Execute('SET NAMES tis620');
return $this->db;
}
// เพิ่ม Blog ใหม
public function countBlogs($date_today){
$preStatment = $this->db->Prepare(
"SELECT * FROM ".PREFIX."_blog ".
"WHERE date_blog = ? ".
" ");
return $this->db->Execute($preStatment, array($date_today))->RecordCount();
}
public function insertNewBlogToDb($title, $detail, $date_today, $time_today){
$preStatment = $this->db->Prepare(
"INSERT INTO ". PREFIX."_blog ".
"VALUES('', ?, ?, ?, ?) ".
" ");
return $this->db->Execute($preStatment, array($title, $detail, $date_today, $time_today));
}
//แก้ไข Blog
public function updateBlogFormDb($title_edit, $detail_edit, $id_blog){
$preStatment = $this->db->Prepare(
"UPDATE ".PREFIX."_blog ".
"SET title_blog= ?, detail_blog= ? ".
"WHERE id_blog = ?".
" ");
return $this->db->Execute($preStatment, array($title_edit, $detail_edit, $id_blog));
}
public function queryFormDb($id_blog){
$i = 0;
$list_arr = array();
$preStatment = $this->db->Prepare(
"SELECT * FROM ".PREFIX."_blog ".
"WHERE id_blog = ? ".
" ");
$rs = $this->db->Execute($preStatment, array($id_blog));
while($field=$rs->FetchRow()){
$list_arr[$i]['id_blog'] = $field['id_blog'];
$list_arr[$i]['title_blog'] = $field['title_blog'];
$list_arr[$i]['detail_blog'] = $field['detail_blog'];
$list_arr[$i]['date_blog'] = $this->displayDate($field['date_blog']);
$list_arr[$i]['time_blog'] = $field['time_blog'];
++$i;
}
return $list_arr;
}
// ลบ blog
public function delBlogById($id_blog){
$preStatement = $this->db->Prepare(
"DELETE FROM ".PREFIX."_blog ".
"WHERE id_blog= ?".
" ");
return $this->db->Execute($preStatement, array($id_blog));
}
// แสดง blog ทั้งหมด
public function displayAllBlogs(){
$i =0;
$list_arr = array();
$preStatment = $this->db->Prepare(
"SELECT * FROM ".PREFIX."_blog ".
"ORDER BY id_blog desc ".
" ");
$rs = $this->db->SelectLimit($preStatment,20,0);
while($field=$rs->FetchRow()){
$list_arr[$i]['id_blog'] = $field['id_blog'];
$list_arr[$i]['title_blog'] = $field['title_blog'];
$list_arr[$i]['detail_blog'] = $field['detail_blog'];
$list_arr[$i]['date_blog'] = $this->displayDate($field['date_blog']);
$list_arr[$i]['time_blog'] = $field['time_blog'];
++$i;
}
return $list_arr;
}
// show replace word
public function display_replace_word(){
$return_replace_word = ' ';
$i = 1;
$File = new File();
$word_replace = $File->read(ROST_CK_REPLACE, filesize(ROST_CK_REPLACE));
$rudeword_replace = explode("\n", trim($word_replace));
$data = $File->read(RPE_CK_RUDES, filesize(RPE_CK_RUDES));
$rudeword = explode("\n", trim($data));
while($i < sizeof($rudeword_replace)+1){
if($i % 5 == 0 /* && $i != 0 */){
$replace_line = " \n<br> ";
// $replace_line = " \n<br /> ";
}else{
$replace_line = " ";
}
$return_replace_word .= " ".$rudeword[$i]." ".$rudeword_replace[$i]." ".$replace_line;
++$i;
}
return $return_replace_word;
}
} // end BlogAdmin
class IndexBlog extends BlogAdmin{
public function queryForIndex($id_blog = NULL){
$i = 0;
$list_arr = array();
if(isset($id_blog) && $id_blog != ''){
$pre_stmt = $this->db->Prepare(
"SELECT * FROM ".PREFIX."_blog ".
"WHERE id_blog = ?".
" ");
$rs = $this->db->Execute($pre_stmt, array($id_blog));
}else{
$pre_stmt = $this->db->Prepare(
"SELECT * FROM ".PREFIX."_blog ".
"ORDER BY id_blog DESC ".
" ");
$rs = $this->db->SelectLimit($pre_stmt, 10 ,0);
}
while($field = $rs->FetchRow()){
$list_arr[$i]['id_blog'] = $field['id_blog'];
$list_arr[$i]['title_blog'] = $field['title_blog'];
$list_arr[$i]['detail_blog'] = $field['detail_blog'];
$list_arr[$i]['date_blog'] = $this->displayDate($field['date_blog']);
$list_arr[$i]['time_blog'] = $field['time_blog'];
//count comment
$pre_stmt = $this->db->Prepare(
"SELECT * FROM ".PREFIX."_comment ".
"WHERE ref_id_blog = ? ".
" ");
$list_arr[$i]['comments'] = $this->db->Execute($pre_stmt, array($field['id_blog']))->RecordCount();
if($id_blog){
$list_arr[$i]['title_page'] = $list_arr[$i]['title_blog'];
}
++$i;
}
return $list_arr;
}
// เพิ่ม/query comments
public function addComment($name, $detail, $id_blog){
$date_today = date("Y-m-d");
$time_today = date("H:i:s");
$pre_stmt = $this->db->Prepare(
"INSERT INTO ".PREFIX."_comment".
" VALUES('', ?, ?, ?, ?, ?)".
" ");
return $this->db->Execute($pre_stmt, array($name, $detail, $date_today, $time_today, $id_blog));
}
public function queryAllComment($id_blog){
$i = 0;
$list_arr = array();
$pre_stmt = $this->db->Prepare(
"SELECT * FROM ".PREFIX."_comment ".
"WHERE ref_id_blog = ? ".
"ORDER BY id_comment DESC ".
" ");
$rs = $this->db->SelectLimit($pre_stmt, 20, 0, array($id_blog));
while($field = $rs->FetchRow()){
$list_arr[$i]['id_comment'] = $field['id_comment'];
$list_arr[$i]['name_comment'] = $field['name_comment'];
$list_arr[$i]['detail_comment'] = $field['detail_comment'];
$list_arr[$i]['date_comment'] = $this->displayDate($field['date_comment']);
$list_arr[$i]['time_comment'] = $field['time_comment'];
$list_arr[$i]['ref_id_blog'] = $field['ref_id_blog'];
++$i;
}
return $list_arr;
}
// ลบ comment
public function delComment($id_comment){
$pre_stmt = $this->db->Prepare(
"DELETE FROM ".PREFIX."_comment ".
"WHERE id_comment = ? ".
" ");
return $this->db->Execute($pre_stmt, array($id_comment));
}
} // end IndexBlog
?>
Date :
2010-04-30 22:29:43
By :
mrjidjad
ตัวอย่างการใช้งาน M(Model) อ่อมันก็คือ Class ครับ ส่วนตัวที่จะนำเสนอต่อก็ คือ C (Controller) ครับ
<?php
header('Content-type: text/html; charset: tis620');
require_once 'blog_function.php';
session_start();
$page_admin = true;
$form1_hide = false;
$date_today = date("Y-m-d");
$time_today = date("H:i:s");
$error = array();
$success = array();
$blog = new BlogAdmin();
$utilities = new Utilities();
$template = new Template();
$template->assign('page_admin', $page_admin);
// login โดย admin
if($_POST){
if(isset($_POST['user_login']) && isset($_POST['pass_login'])){
$user_login = $_POST['user_login'];
$pass_login = $_POST['pass_login'];
if($user_login == 'admin' && $pass_login == 1234){
$_SESSION['sess_userid'] = session_id();
}else{
$error[]= ' ชื่อ หรือรหัสผ่านไม่ถูกต้อง ! ! ';
}
}
}
// เพิ่ม Blog ใหม่้
if($_GET['do'] == 'add_blog' && $_SESSION['sess_userid'] == session_id()){
$thai_date = $utilities->displayDate($date_today);
if(isset($_POST['title']) && $_POST['title'] != ''){
$title = $_POST['title'];
$detail = checkRude2($_POST['detail']);
// $detail = $_POST['detail'];
$countRows = $blog->countBlogs($date_today);
if($countRows > 10){ //กำหนดไว้ 10 blogs
$error[] = ' ไม่อนุญาติให้เพิ่ม Blog ! ! ';
}else{
$rs = $blog->insertNewBlogToDb($title, $detail, $date_today, $time_today);
if(!$rs){
$error[] = " ไม่สามารถเพิ่มข้อมูลได้ ! ! ";
}else{
$success[] = " เพิ่มข้อมูลเรียบร้อยแล้ว ! ! ";
}
}
}
$date_today = $utilities->displayDate($date_today);
$template->assign('add_blog',true);
$template->assign('date_today',$thai_date);
$template->assign('time_today',$time_today);
}
//แก้ไข Blog
if($_GET['do'] == 'edit' && isset($_GET['id_blog'])){
$id_blog = $_GET['id_blog'];
$list_arr = array();
if(isset($_POST['title_edit']) && $_POST['title_edit'] != ''){
$title_edit = $_POST['title_edit'];
$detail_edit = checkRude2($_POST['detail_edit']);
$rs = $blog->updateBlogFormDb($title_edit, $detail_edit, $id_blog);
if(!$rs){
$error[] = " ไม่สามารถแก้ไขข้อมูลได้ ! ! ";
}else{
$success[] = " แก้ไขข้อมูลเรียบร้อยแล้ว ! ! ";
}
}
$list_arr = $blog->queryFormDb($id_blog);
$template->assign("edit_blog", true);
$template->assign('list_arr2', $list_arr);
}
// ลบ blog
if($_GET['do'] == 'del' && isset($_GET['id_blog'])){
$id_blog = $_GET['id_blog'];
$rs = $blog->delBlogById($id_blog);
if(!$rs){
$error[] = " ไม่สามารถลบข้อมูลได้ ! ! ";
}else{
$success[] = " ลบข้อมูลเรียบร้อยแล้ว ! ! ";
}
}
// แสดง blog ทั้งหมด
if($_SESSION['sess_userid'] == session_id()){
$list_arr = array();
$list_arr = $blog->displayAllBlogs();
$template->assign('display_blog', true);
$template->assign('list_arr', $list_arr);
}
// ตรวจสอบ session
if($_SESSION['sess_userid'] != session_id()){
$error[] = ' คุณยังไม่ได้ล๊อกอิน ! ! ';
}else{
$form1_hide = true;
}
if(sizeof($error) != 0){
$template->assign('error', $error);
}else{
$template->assign('success', $success);
}
// show replace word
if($_GET['do'] == 'replace_word'){
$return_replace_word = $blog->display_replace_word();
$template->assign('return_replace_word',$return_replace_word);
}
$template->assign("form1_hide" ,$form1_hide);
$template->assign('title', TITLE);
$template->assign('header_tag', HEADER_TAG);
$template->assign('libs', LIBARIES);
$template->display('admin.tpl', 'template');
// end code
?>
และนี่คือส่วน V(View) ครับ
{include file="header.tpl"}
<div id="alert">
{if $error neq ''}
{foreach key=key item=item from=$error}
{$item}
{/foreach}
{/if}
{if $success neq ''}
{foreach key=key item=item from=$success}
{$item}
{/foreach}
{/if}
</div>
<h3>{$header_tag}</h3>
[<a href="?do=add_blog">เพิ่ม blog ใหม่</a>]
[<a href="?do=replace_word"> บล๊อกคำ </a>]
[<a href="blog_logoff.php?logoff=yes">ออกจากระบบ</a> ]
<br>
{if $display_blog}
<!-- แสดง blog -->
<div id="display_blog">
<div id="content">
<div>วันที่เขียน</div>
<div>หัวข้อ</div>
<div> แก้ไข </div>
<div> ลบ </div>
</div>
<br clear="left">
<div id="content">
{foreach key=key item=item from=$list_arr}
<div> {$item.date_blog} </div>
<div> <a href="index.php?id_blog={$item.id_blog}" target="_blank">{$item.title_blog}</a></div>
<div>[<a href="?do=edit&id_blog={$item.id_blog}" target="_parent">แก้ไข</a>]</div>
<div>[<a href="?do=del&id_blog={$item.id_blog}" onClick="return confirm(' คุณต้องการลบ Blog นีเหรือไม่ ');" target="_parent">ลบ</a>]</div><br>
{/foreach}
</div>
</div>
{/if}
<br clear="left">
<div id="form1">
<br clear="left">
<!-- login -->
<form action="" method="post">
ลงชื่อ<input type="text" name="user_login" > <br>
รหัสผ่าน <input type="password" name="pass_login"><br>
<input type="submit" value="ส่ง">
<input type="reset" value=" เริ่มใหม่">
</form>
</div>
<br clear="all">
{if $add_blog}
<!-- เพิ่ม Blog -->
<div id="form2">
<h3> เพิ่ม Blog ใหม่ </h3>
<form id="fm" action="" method="post">
หัวข้อ <input id="name" type="text" name="title"><br>
เนื้อหา<textarea id="detail" name="detail" cols="55"></textarea><br>
วันที่ {$date_today} {$time_today}<br>
<input id="fs" type="button" value=" เพิ่ม ">
<input type="reset" value="เริ่มใหม่">
</form>
</div>
{/if}
{if $edit_blog}
<!-- แก้ไข Blog -->
<div id="form2">
<h3> แก้ไข Blog ใหม่ </h3>
{foreach key=key item=item from=$list_arr2}
<form id="fm" action="" method="post">
หัวข้อ <input id="name" type="text" name="title_edit" value="{$item.title_blog}"><br>
เนื้อหา<textarea id="detail" name="detail_edit" cols="55">{$item.detail_blog}</textarea><br>
วันที่ {$item.date_blog} {$item.time_blog}<br>
<input id="fs" type="button" value=" แก้ไข ">
<input type="reset" value="เริ่มใหม่">
</form>
{/foreach}
</div>
{/if}
{if $return_replace_word}
<!-- word replace -->
<h3> คำหยาบที่ค้นหาเจอ </h3>
<ol>
{foreach key=key item=item from=$return_replace_word}
<li>{$item}</li>
{/foreach}
</ol>
{/if}
{if $form1_hide}
{literal}
<script type="text/javascript">
(function($){
$(document).ready(function(){
$("#form1").hide();
$("input:button#fs").click(function(){
var title = $("#name").val();
var detail = $("#detail").val();
if(title.length == 0 || detail.length == 0){
alert( ' กรุณาใส่ข้อหัวข้อด้วยค่ะ ' );
$("#name").focus().select();
}else{
return $("#fm").submit();
}
});
});
})(jQuery);
</script>
{/literal}
{/if}
{include file="footer.tpl"}
ยังไงถ้าอยากเขียน PHP OO ก็อยากฝากให้ศึกษาเรื่องของ MVC ครับ สำหรับ PHP Programmer เก่งๆ ทุกท่าน
Date :
2010-04-30 23:01:18
By :
mrjidjad
55+ ยากจังแฮ่ะ แต่ต้องรู้เรื่องให้ได้
Date :
2010-05-01 01:09:45
By :
t1u2m3
ขอบคุณความรู้จากเหล่าเทพนะครับ กำลังศึกษาแนวคิดและทดลองทำอยู่เลย
Date :
2010-05-14 14:03:09
By :
hatori
คับๆๆๆ สู้เค้านะ
Date :
2010-05-20 00:09:19
By :
นิส
ขอบคุณความรู้จากเหล่าเทพนะครับ กำลังศึกษาแนวคิดและทดลองทำอยู่เลย
Date :
2010-05-21 17:22:21
By :
superhack
ขอบคุณพี่ๆทั้ง หลายที่ได้แบ่งปัน ความรู้
Date :
2010-05-24 16:19:49
By :
boonp
กระทู้ดี +1 ไปเลยคับท่าน
Date :
2010-06-02 06:21:50
By :
kerb
แวะมาดู oop ก็มันดีเนอะ
Date :
2010-06-14 09:50:30
By :
tungman
แง่ว ยิ่งมาดู OOP ของ PHP ยิ่ง แอนตี้ PHP เข้าไปใหญ่ อันนี้ความเห็นส่วนตัวค่ะ
คือถ้าจะเขียน OOP ให้เต็มประสิทธิภาพกันจริงๆ programmer ควรโดนบังคับโดยปริยาย
ให้เขียนแบบ OOP เท่านั้น และควรมี FRAMEWORK ที่เป็น OOP
และครอบคลุม CODE ในการใช้งานจริงในทุกส่วน
อันนี้อ้างมาจาก JAVA กับ .NET ค่ะ
ก็ยังมีความรุสึกว่าเป็น OOP แบบกระต่ายสามขาอะค่ะ
จะโดนรุมประชาทัณฑ์มะนี้ แต่คิดว่าอย่างนั้นจริงๆค่ะ ยิ่งกับภาษาที่ไม่ Strong type
เวลาคิดกรอบความคิดจะเป็นอีกแบบ มั้งคะ
คืออยากจะบอกว่า ถ้าอยากจะฝึกเขียน OOP ไปเขียนกะ JAVA ไม่ก็ .NET
จะดีกว่าปะคะเพราะ DESIGN มาเพื่อ OOP อยู่แล้ว
แต่คุณ PHP นี่งอกส่วนนี้ออกมา แบบไม่รุดิคะ เป็น OOP ที่ขัดๆมากเลย
ปากเสียอีกแระเรา ^^
ถ้าทำให้พี่ๆเพื่อนๆเคือง ก็ขออภัยมา ณ ที่นี้ด้วยค่ะ
สาเหตุที่ ANTI PHP
1. ตัวแปรไม่ strong type
2. code มักจะปนกันไป คือมีทั้ง UI ,BUSINESS LOGIC ทั้ง DATA ACCESS LAYER
ครบเลยใน form เดียวและมักจะเป็นอย่างนั้นเสมอๆ
คือโดนฝึกมาให้มองสามส่วนนี้ให้ออกและแยกให้เด็ดขาด
พออ่าน code php ทีรัย จะอื้ออีกแระ แต่เข้าใจว่าข้อดีคือพัฒนาง่ายและเร็วค่ะ
อันนี้ก็ความเห็นส่วนตัวล้วนๆ ยินดีรับทุกคำวิจารณ์ค่ะ
Date :
2010-06-20 15:08:18
By :
blurEyes
ลองดูโค้ด java กับ .net โดยไม่ใช้ editor ตัวช่วยดูครับ จะรู้ว่าทำไม php ถึงเป็นที่รักของเว็บโปรแกรมเมอร์ทั่วโลก
ข้อเสียของ php อย่างนึงก็คือไม่ค่อย autocomplete ชัดเจน อันนี้เป็นข้อเสียของ weak type อาจจะเป็นข้อด้อยที่ทำให้ใช้งานไม่สะดวกอยู่บ้าง
แต่ถ้าจะมองในอีกแง่หนึ่งแล้ว weak type จะมีความสามารถสูงกว่า strong type อยู่มาก ทำให้การโปรแกรมมิ่งเป็นในเชิงตรรกกะมากกว่า มากกว่าพวก java หรือ .net ซึ่ง strong type โปรแกรมเมอร์จะเสียเวลาในการเขียนโครงสร้างภาษา เสียเวลาแก้ปัญหาในส่วนที่ไร้ประโยชน์จำนวนมาก อย่างจะส่งตัวแปรชนิดอะไรกันแน่ไปในอีกตัวแปรหนึ่ง และการสร้าง array สักตัวนึงต้องผ่านการ include lib การแทรกโครงสร้างของภาษานับ 10 บรรทัด แต่ถ้าเป็น php ใช้แค่บรรทัดเดียว
พลังของ php คือโค้ดสั้นอ่านเข้าใจง่ายถ้าใช้ framework ที่ดีและออกแบบคำสั่งดีแล้วจะเขียนได้เร็วกว่าพวก java .net นับสิบเท่าครับ แต่เครื่องมือที่ดีอย่าง php ความง่ายเกินไปจะทำให้มีคนหลายประเภทมาใช้ครับ ต่างกับภาษา java ซึ่งคนที่เขียนได้ก็เป็น advance programmer ในระดับนึงแล้ว จึงค่อนข้างเขียนเป็นระเบียบ
แต่ถ้าคนระดับเขียน java มาเขียน php แล้วจะรู้ว่า java กับ .net มันยังมีหลายๆ อย่างเทียบ php ไม่ได้ (ไม่รวม editor นะ) อิๆ
Date :
2010-06-20 19:20:52
By :
num
จะว่าไปภาษา ไดนามิค มันย่อมเขียนและเรียนได้ง่ายกว่าอยู่แล้วแต่ ไดนามิค ยังมีแยกเป็น strong type และ weak type ซึ่ง php มันเป็น weak type ซึ่งตัว php เอง ถ้าเอาไปเขียน desktop app มันก็คงไม่เหมาะเท่าไหร่ เพราะจริงๆ ผมคิดว่า desktop app มันมีจำนวนบรรทัดมาก เพราะต้องเขียน ด้าน gui อีกไม่น้อย ซึ่งผมคิดว่า strong type เหมาะกับการเขียน desktop app มากกว่าคับ
โดยเฉพาะเครื่องมือ จะสังเกตว่า php มีแค่ array แต่ java มี Collection package ต้อง include เข้ามา บรรทัดมันก็ต้องมากกว่าอยู่แล้ว แต่ถ้าเป็น .net ผมไม่เคยเขียนนะ ide มันคงจะจัดการให้เอง
และแน่นอนว่า ภาษา static โค้ดมันต้องเยอะกว่าภาษา dynamic อยู่แล้ว แต่ถ้าบอกว่า มันเทียบกันไม่ได้ผมว่า php มันยังเทียบกับ ภาษา java หรือ .net ไม่ได้หรอกคับ อย่างน้อยก็เพราะมัน เหมาะกับงานที่หลากหลายชนิดมากกว่าภาษา dynamic และ สามารถสร้างแอพพลิเคชั่นที่ใหญ่ได้ดีกว่า เพราะมันเป็น static type นั่นเอง
Date :
2010-06-20 21:29:48
By :
pjgunner
อันนี้เคยเขียนแล้วค่ะ โดนบังคับเลยไม่ได้ยากอะไร ใช้ notepad++ ที่ syntax Highlight ธรรมดานี่แหละค่ะ
ทุกวันนี้อาจารย์ที่สอน ท่านก้อเขียน ASP.NET ด้วย Notepad++ อยุ่ framework 1.1 ด้วย
แต่ในเมื่อมีของดีๆให้ใช้ อย่าง Visual studio ก้อใช้ดิคะ อันนี้ไม่น่าเกี่ยวขึ้นกับความเคยชินมากกว่าค่ะ
ปริมาณความเป็นไปได้ในการผิดพลาดต่างกันเยอะครับ
ภาษาที่เขียนยาวกว่าปริมาณการเขียนที่มากกว่า การผิดพลาดย่อมเยอะกว่าครับ
ถ้าลองให้เขียนกันจริงๆ แล้วไม่มีทางเป็นไปได้ที่คนเขียนภาษาที่มีความยาวมากกว่า
จะเขียน error น้อยกว่า และแก้โจทย์ปัญหาที่เข้ามาได้เร็วกว่า
==========
ก็ไม่ได้เสียอะไรนี่คะ เรามีโครงสร้างทุกแบบที่ใช้กันทั้งไม่ว่าจะซับซ้อนหรือยืดหยุ่นยังไง
เช่น hashtable stack เรื่อยจนไปถึง auto optimize tree ให้ใช้ง่าย ๆ
เรียกมาด้วย using นี่ก็บรรทัดเดียว ที่เสียเวลาคือคุณต้องไปเรียน
และเข้าใจโครงสร้างข้อมูลว่าจะใช้แบบไหนเสียมากกว่าค่ะ
ส่วนที่ไร้ประโยชน์ไม่ทราบสิคะ มันคือยังไงอันนี้ขึ้นกับทักษะของโปรแกรมเมอร์มากกว่ามังคะ
ถ้าจะพูดถึง function ที่นำกลับมาใช้ใหม่ ก็ยังต้องเสียเวลาศึกษามากกว่า php อยู่ดีครับ
กว่าจะรู้ว่าต้องส่ง parameter ประเภทไหนยังไง ต้องเสียเวลาอ่านกี่รอบ
ประกาศโครงสร้างชื่อตัวแปรไงครับ ระยะเวลาที่จะต้องเลือกประเภทตัวแปร
การประกาศโครงสร้างต่างๆ ในรูปแบบที่ซับซ้อน นอกจากจะทำให้โปรแกรมอ่านยากขึ้น
การที่มีคำสั่งจำนวนมากและโครงสร้างภาษามาก ถ้าเขียนโค้ดที่วางแผนมาไม่ดี
อ่านและแก้ไขยากกว่าการเขียนแบบ php มาก บางครั้งที่โปรแกรมเมอร์ที่เพิ่งเริ่มต้นเขียน
มาเขียนภาษา php ยังเขียนคำสั่งได้ดูดีกว่าพวกระดับเซียน ด้วยซ้ำ
=========
ตรง array ไม่เถียงครับว่าประกาศแค่นั้น แล้ว array นั้น dynamic หรือยังครับ
แล้วถ้าจะเอา array มันมีหลายชั้นจะต้องเขียนวุ่นแค่ไหนครับ
โครงสร้างที่คล้ายๆ array ที่มีหลายประเภท การนำมาใช้ร่วมกันจะต้องเขียนกี่บรรทัดครับ
==========
อันนี้ก้อเหมือนกันค่ะ เพียงแต่ไม่ได้เลือกที่จะเขียนให้สั้นสุดๆ ปกติจะเขียนให้คนด้วยกันอ่านง่ายๆ
code ที่เขียนน่าจะยาวเท่าๆ กันค่ะ เรื่องความเร็วพราวว่าอยู่ที่ตัวโปรแกรมเมอร์มากกว่ามั้งคะไม่น่าเกี่ยว
สมัยก่อนอาจใช่ ASP.NET รันไม่เร็วเท่า CLIENT SIDE แต่ปัจุบันไม่หรอกมั้งคะ
คำสั่งจะยาวเท่ากันได้ไงครับ ถ้าต้องแทรกคำสั่งประกาศประเภทตัวแปรแทบทุกบรรทัด
========
อันนี้ก้อโดนบังคับเรียนมาทั้งสองภาษาแหละค่ะ php ก็โดนมาบังคับด้วยละ แล้วพี่หนุ่มละคะ ลองมาเขียน JAVA กะ .NET มั่งยัง
ผมไม่เคยเรียน php, java แล้วก็ .net ครับ
เคยเรียนแต่ pascal กับ c
แต่ผมเขียนได้หมดครับ ยกเว้น java เขียนได้แค่ระดับ jsp ไม่ได้ไปยุ่งกับ servlet ซักเท่าไหร่ เอา servlet มาทำแค่พวก filter สำหรับระบบ authentication
===========
ในเรื่องการคำนวนและการทำงานบางที่ต้องประมวลผลสูงพวก .net หรือ java จะแม่นและเร็วกว่า php อยู่ครับ
แต่เรื่องความเร็วและโครงสร้างที่ยืดหยุ่นและสะดวกในการแก้ปัญหาแล้ว php เหมาะที่สุดครับ
แต่ผมก็คิดว่าพวกงาน enterprise ถ้าใช้ php ที่ออกแบบโครงสร้างมาดีแล้ว
จะเร็วได้เกือบเทียบเท่า platform เหล่านี้ และคำสั่งโอกาสข้อผิดพลาดต่ำกว่าไม่รู้กี่เท่าครับ
============
OOP ที่ไม่มี pattern ก็คือโค้ดที่สร้างปัญหาให้กับโปรแกรมเมอร์มากกว่าตอบโจทย์การแก้ปัญหาครับ
คำสั่งที่ซับซ้อนเกินไป จะเป็นการสร้างปัญหาใหม่ๆ ขึ้นมามากกว่าครับ
=============
พี่รักภาษาที่ทำให้ปัญหาน้อยครับ แฮ่ๆ
Date :
2010-06-20 21:42:35
By :
num
jagged array ก็ยังไม่ใช่ array ที่เทียบเท่า array ของ php ครับ
ถ้า hash จะใกล้เคียงมากกว่าแต่กว่าจะประกาศ hash และการจะสร้าง hash multi level
ของภาษาอย่าง java ขึ้นมามันไม่ได้เขียนสบายๆ ครับ
ที่พี่ว่ามันเสียเวลาในสิ่งที่ไม่จำเป็นก็คือ การนำตัวแปรประเภทต่างๆ มาใช้เพื่อประสานเพื่อแก้ปัญหา
ถ้า php โดยปกติก็จะใช้พลังของ array ที่ว่าเพียงอย่างเดียว แต่ถ้าภาษา strong type การจะรวบรวมเอาหลายๆ อย่าง มารวบรวมเข้าด้วยกัน ซึ่งโค้ดแบบ strong type มันไม่ใช่โค้ดที่เราจะมองเป็น logic ล้วนๆ แต่มันเป็นโค้ดแบบ spaghetti รูปแบบหนึ่ง ที่พยายามจะเอาตัวแปรประเภทต่างๆ มาใช้ร่วมกัน ซึ่งโค้ดแบบ strong type ต้องเสียเวลาในการใช้ความพยายามแบบนี้มากกว่าแบบ weak type มาก และแทบจะทุกๆ ครั้ง เมื่อต้องการโครงสร้างข้อมูลที่ค่อนข้างซับซ้อนกว่าแบบ linear
pattern ในการสร้างเว็บไซท์ของ asp.net มีหลายอย่างที่ช่วยให้สามารถสร้างโค้ดได้เร็วขึ้น
แต่การนำโครงสร้างแบบ xml มาสร้างเป็นส่วนประกอบในโปรแกรม ทำให้คุณสมบัติในการแก้ไขออกแบบได้ยากขึ้น
ในการทำงานของโปรแกรมแปลภาษาเองแล้วโอกาสที่จะเจอ error ของ strongtype มากกว่าครับ เพียงแค่ใส่ตัวแปรผิดประเภทก็ error ทันทีทั้งที่จริงๆ สามารถอนุโลมได้อย่างเช่น "1" กับ 1 หรือ 0 กับ false
การเขียนโปรแกรมจะต้องเจอปัญหาประเภทนี้บ่อยๆ ไม่ใช่เรื่องน่าสนุกครับ
Date :
2010-06-20 23:56:37
By :
num
สำหรับประเด็นเรื่อง oop พี่คิดว่าการที่ php ไม่บังคับเรื่อง oop เพราะเค้าต้องการสร้างภาษาที่เหมาะสมกับการเขียนเว็บน่ะครับ และเป็นภาษาสำหรับทุกคน ถ้าให้ oop เป็นหลักเลยจะทำให้เป็นเว็บโปรแกรมเมอร์เก่งๆ ที่ไม่ได้เรียนเรื่อง oop มาไม่ได้เปิดตัวออกมาก็ได้ครับ :)
Date :
2010-06-21 00:09:48
By :
num
แหมๆ ชอบจังครับ ท่านที่ชอบแบ่งปัน มีน้ำใจจริงๆ
ผมเพิ่งเข้าสู่วงการน่ะครับ มีเรื่องอยากรู้เต็มไปหมด
แต่ในความคิดผม ผมคิดเขียนแบบ Function ดีกว่านะครับ
เพราะว่ามันเขียนโค๊ดเยอะดี เขียนยาวพรืดๆๆๆ หน้าเดียวกันไปเลย
เอ๊ะมันดีตรงไหนหว่า (มุขครับแก้เครียด) ต้องแบบ OOP สิ่
เห็นๆกันอยู่ใช่ไหมครับ ยังไงก็ขอรบกวนผู้รู้แบ่งปันด้วยนะครับ ^^
Date :
2010-06-21 14:02:26
By :
hikari42
ก้อพราววถึงบอกนี่งาย ถ้าเรียน oop ไปเรียนกะอย่างอื่นดีกว่าแล้วค่อยมา อะไรยังไงกะ php
ตอนที่ php เกิดมา oop ยังเป็นวุ้นอยู่เลยมั้งคะ
ยังไม่ยอมอะ
multiple array หรอคะ ก้อมีอะ tree กะ node อยากแอด ก้อแอดเลยเหมือนกัน อ้างแบบ dictionary ได้อีก
ไม่ได้อ้างด้วย index อย่างดียวค่ะ มันเกิดมาทีหลัง อะไรที่ของดีๆของชาวบ้านเค้าก้อเอามาใส่หมดแหละพี่หนุ่ม
ไม่ได้เป็น spaghetti หรอกค่ะ
อันนี้พราวไม่รุน้า แต่เรื่องของเรื่อง vb 6 ที่เป็น weak type คล้ายกะ php ก็ obsolete ไปแล้ว
ภาษาที่ยังไม่ strong type เหลือแต่พวก script ยังไงสะ oop ก็คงยังไปได้ไกล
วันนึง php นี่อาจจะถูกยำใหญ่เหมือนกะ vb.net มั้งคะ
Date :
2010-06-22 10:21:02
By :
blurEyes
พี่ว่าอย่าเถียงกันเลยเพราะการที่จะเขียน oop กับภาษาอะไรก็แล้วแต่ ขึ้นอยู่กับความต้องการของคนเขียน
โปรแกรมทุกภาษามีทั้งข้อดี และข้อเสียในตัวของมันเอง ขึ้นอยู่กับทักษะของโปรแกรมเมอร์มากกว่าว่าถนัดทางด้านไหน
และสามารถนำมาประยุกต์ใช้ให้เหมาะสมกับระบบงานของตัวให้เกิดประโยชน์สูงสุดด้วยภาษาอะไรค่ะ
เพราะเถียงกันไปก็อเหมือนไก่กับไข่อะไรเกิดก่อนกัน ปัญหาโลกแตกค่ะ...พี่อ่านแล้วอึดอัด
Date :
2010-06-22 10:38:14
By :
Gumme
oop เกิดมาก่อนช่วง php ไม่รู้กี่สิบปีละครับ
tree จะแทรกข้อมูลง่ายกว่า array ของ php ได้ไงครับ อิๆ
php ไม่ได้เป็นอริกับ oop นะครับ แต่เป็นยืดหยุ่นทำได้หลายอย่าง
ทั้งแบบง่ายและแบบ oop แนวโน้มของ php6 จะ fix ข้อเสียของ php รุ่นก่อนๆ เกือบทั้งหมดแล้วครับ
และตอนนี้ก็พัฒนาให้ใช้ anonymous function ได้อย่าง javascript แล้ว มีแต่คนจะใช้เยอะขึ้นครับ
และ php มีแนวโน้มจะ fix ปัญหาที่ด้อยกว่า strongtype อยู่เรื่อยๆ ดังนั้น
ภาษาที่ยุ่งยากกว่าแต่ให้ผลลัพธ์เท่ากัน คนก็ต้องเลือกใช้ที่ง่ายกว่าอยู่แล้วครับ
Date :
2010-06-22 10:59:07
By :
num
ผมว่าการเขียน php6 นั้นต่างกับ php5 ไม่น้อย และคิดว่า server น่าจะแยกกันเลยแหละ รันตัวเก่า กับตัวใหม่ เพราะคงมีหลายตัวที่รันไม่ได้ (ต้องแก้ เช่น ไม่ได้ escape string ให้อัติโนมัติ อันนี้ +1)
อีกอย่าง ผมว่า ฟีเจอร์บางอย่างของ php6 คิดว่าทำให้โค้ดอ่านยากไปอีกแบบนึง อย่าง anonymous มันก็ดีไม่ต้องเสียชื่อฟังชั่นไปอีก แต่ยังมี goto นี่สิผมงงๆ และยังจะมี lambda คล้าย ruby แต่ผมก็ไม่เข้าใจหรอก
Date :
2010-06-22 14:12:19
By :
pjgunner
มะมีรัยพี่มี่ เบื่อเจ๋ยๆ พวก request login ทำ table ยังไงอะค่ะ
พี่วินก้อสอนแล้ว tutorial ก็ทำแล้ว ถามมาตอบไปเป็นสิบเป็นร้อยครั้งละ
ถามซ้ำๆย้ำๆกันนั่นอะ แค่รุจักค้นค้า search เอาจาก board นี่ก็ไม่ทำ
เลยชวนๆ ถก กันทะนั้นเองค่าพี่มีี่
ได้โปรดอย่าอึดอัดยิ้มค่ะยิ้มปายเรื่อยๆ อารมดีแจ่มใสค่ะ ^^
Date :
2010-06-22 22:55:17
By :
blurEyes
คุยภาษาเทพ อ่านสามรอบยังไม่รู้เรื่องเลย ถกอะไรกัน
Date :
2010-06-22 23:41:28
By :
plakrim
เห็นด้วยกับกับคุณ Stupid gal ครับกับการที่เราควรเรียนรู้ OO กับ .NET และ JAVA เพราะลำพังตัวผมเองก็เริ่มตั้นจากตรงนั้นเหมือนกัน ด้วยที่ว่า ผมเป็นโปรแกรมเมอร์ ที่ไม่ได้จบคอมพิวเตอร์โดยตรง ก็อาศัยศึกษาด้วยตัวเองกับศึกษาจากโปรแกรมเมอร์ รุ่นพี่เอา เหตุที่ผมต้องมาศึกษา OO เพราะต้องใช้ Framework ในการทำงาน(เพราะใครๆ ก็ใช้กัน) ตอนแรกก็ ศึกษาจาก www.php.net โดยตรงแต่ไม่เข้าใจพอผมเลยมาศึกษาจาก JAVA แทนซึ่งเข้าใจโดยหลักการมากกว่าทำให้มาประยุกต์กับ OO PHP ได้มาก OO ของ PHP v5.3/v6 -> แนวโน้มจะเอาข้อดี OO ของทั้ง JAVA, .NET มายำผสมกัน (ถ้าไม่เชื่อก็ลองอ่าน www.php.net ครับเทียบกับ JAVA และ .NET) แต่อย่างไร ผมก็เขียน OO PHP แบบ v4 ซึ่งง่ายและ classic ดีดูเป็นตัวของ PHP มากกว่า 555++ ตรงนี้ไม่ควรเอาเป็นแบบอย่างครับควรตามเทคโนโลยีดีกว่า
ยิ้มไว้ครับสไตล์ ใครสไตล์มัน
<?php
// share path ADOdb database Library
include 'common.php'; // share
//
class ADOdb{
var $_db = NULL;
var $_sql = ' ';
function ADOdb($_conn = NULL){
$this->_db = ADONewConnection($_conn['_driver']);
$this->_db->Connect($_conn['_server'],
$_conn['_user'],
$_conn['_password'],
$_conn['_db']
);
$this->_db->debug = false; // debug false
return $_db;
}
// Execute
function executeSqlGetArr(){
return($this->_db->Execute($this->_sql)->GetAssoc());
}
function executeSql(){
$_rs = $this->_db->Execute($this->_sql);
$_i = 0; $_array = array();
while($_fl = $_rs->fetchRow()){
$_array[$_i]['id'] =$_fl['id'];
$_array[$_i]['date_created'] =$_fl['date_created'];
$_array[$_i]['date_updated'] =$_fl['date_updated'];
++$_i;
}
return $_array;
}
// sizeOfRecord
function sizeOfRecord(){
return($this->_db->Execute($this->_sql)->RecordCount());
}
// utiities
function closeADOdb(){
return($this->_db->Close());
}
}
// Class caller
$_adodb = new ADOdb($_conn); if(!$_adodb) die(' disconnected to database ! ! ');
$_adodb->_sql = 'select * from places order by id asc';
$_rs_arr = $_adodb->executeSqlGetArr(); // Execute() & GetAssoc();
$_rs_arr_ = $_adodb->executeSql();
$_rc = $_adodb->sizeOfRecord(); // RecordCount();
print ' <pre> ';
// print_r();
print_r($_rs_arr);
print_r($_rs_arr_);
print '</pre>';
// close
$_adodb->closeADOdb();
?>
Date :
2010-06-28 23:36:29
By :
mrjidjad
น่าสนใจครับ
Date :
2010-06-29 11:52:01
By :
sonnalin
เห็นด้วยกับกับคุณ Stupid gal ครับกับการที่เราควรเรียนรู้ OO กับ .NET และ JAVA เพราะลำพังตัวผมเองก็เริ่มตั้นจากตรงนั้นเหมือนกัน ด้วยที่ว่า ผมเป็นโปรแกรมเมอร์ ที่ไม่ได้จบคอมพิวเตอร์โดยตรง ก็อาศัยศึกษาด้วยตัวเองกับศึกษาจากโปรแกรมเมอร์ รุ่นพี่เอา เหตุที่ผมต้องมาศึกษา OO เพราะต้องใช้ Framework ในการทำงาน(เพราะใครๆ ก็ใช้กัน) ตอนแรกก็ ศึกษาจาก www.php.net โดยตรงแต่ไม่เข้าใจพอผมเลยมาศึกษาจาก JAVA แทนซึ่งเข้าใจโดยหลักการมากกว่าทำให้มาประยุกต์กับ OO PHP ได้มาก OO ของ PHP v5.3/v6 -> แนวโน้มจะเอาข้อดี OO ของทั้ง JAVA, .NET มายำผสมกัน (ถ้าไม่เชื่อก็ลองอ่าน www.php.net ครับเทียบกับ JAVA และ .NET) แต่อย่างไร ผมก็เขียน OO PHP แบบ v4 ซึ่งง่ายและ classic ดีดูเป็นตัวของ PHP มากกว่า 555++ ตรงนี้ไม่ควรเอาเป็นแบบอย่างครับควรตามเทคโนโลยีดีกว่า
ยิ้มไว้ครับสไตล์ ใครสไตล์มัน
ไม่จำเป็นต้องเริ่มต้นจาก java หรือ .net ครับ เพราะคนที่เรียน java หรือ .net เริ่มจากทฤษฎีพื้นฐานก่อนเหมือนกัน
และไม่มีการเขียนโปรแกรมที่มีความเป็น oop ได้โดยไม่รู้จักพื้นฐานมาก่อน
และที่บอกว่า php เอาข้อดีของ java หรือ .net ก็เป็นเรื่องจริงครับ แต่ไม่ได้เอาแค่ java หรือ .net มายังเอามาจากภาษาอื่นๆ อีกด้วย และถ้าสังเกตดู java หรือ .net ก็พยายามเอาข้อดีของภาษา script เข้าไปแทรกอยู่มากขึ้นเรื่อยๆ ครับ
ดูอย่างที่ https://scripting.dev.java.net/
Date :
2010-06-29 17:00:07
By :
2123
กำลังเริ่มศึกษา งงกับเจ้าตัว
this -> จริงๆว่าเวลาไหนเราควรใช้แล้วทำเพื่ออะไร พอจะอธิบายให้กระจ่างเลยได้ไหมคะ
กับ return อีกตัวว่าเวลาไหนเราจะใช้
Date :
2010-07-07 16:10:32
By :
SG14
555+ ก็เพิ่งรู้ว่าเทพ php ก็องุ่นเปรี้ยวเป็นเหมือนกัน
พูดซะยังกับว่าคนอื่นไม่รู้จักว่า php เป็นยังไง
ลองเปิดใจสิครับ แล้วจะลืม oop แบบ php ไปเลย
ส่วนตัวผมพอดีว่าเริ่มต้นด้วย dotnet จะลองมาจับ php ก็ทำใจไม่ได้เหมือนกัน
เพราะเหตุผลเหมือนอย่างข้างบนนั่นแหละ แต่ใช่ว่าจะไม่เป็นนะ ก็พออ่านโค้ด php
ได้บ้าง แต่ถ้าให้เขียนก็เขียนไม่ออกเหมือนกัน เพราะจำ syntax ไม่ได้ อิอิ
Date :
2010-07-07 18:34:03
By :
tungman
มึนสุดๆ ส่วนตัวเขียนphp แบบปกติว่าจะเอา oop ติดตัวไปบ้างพยายามศึกษาอยู่แต่ก็ติดบ้างตัวที่โพสไว้นะคะ
Date :
2010-07-07 18:44:33
By :
SG14
ผมก็ว่าแรงนะ แต่ผมไม่ได้โกรธแค้นใคร ด่าแล้วผมก็จบ
ใครจะโกรธอย่างไรไม่ถือหรอกครับ แค่พูดที่ตัวเองรู้สึกจริงๆ
และยินดีโดนด่ากลับครับ
Date :
2010-07-07 22:26:51
By :
tungman
คนเราเกิดมาต้องรู้จักกาละเทสะ เรื่องบางเรื่องต้องรู้ว่าสมควรพูดเวลาใด และพูดกับใคร เท่าที่รู้คุณก็ไม่ได้สนิทอารายกับหนุ่ม แล้วการที่คุณไปด่าเค้ามานถูกต้องแล้วเหร๋อ จริงๆ แค่คำว่าขอโทษมานพูดไม่ยากหัดพูดให้ติดปาก อย่ามั่นใจในตัวเองมากนัก คนเราทำผิดกันได้ และทุกคนเค้าให้อภัยถ้าเค้ารู้จักยอมรับเสียบ้าง ไม่ใช่ยืดอกยอมรับคำต่อว่าแล้วเฉยๆ ผิดหวังอย่างแรงเลย เพราะเห็นมาหลายกระทู้มาก แต่ไม่อยากพูด คิดเองก้อแล้วกันโตๆ กันแล้ว
Date :
2010-07-07 22:38:23
By :
Gumme
ขอโทษครับ คือผมเพิ่งรู้ว่าคำว่า องุ่นเปรี้ยวเป็นคำด่า
แต่ถ้าทำให้ไม่สบายใจ ผมก็ขอถอนคำพูดขอรับ
Date :
2010-07-08 08:26:04
By :
tungman
เง้อๆ เข้าสู่ oop กันเถอะคะ สรุปที่เราถามมีผู้ใจดีขยายความให้ไหมคะ
อ่านไปมา this-> มันคล้ายกับ this. ในจาวาปะคะ
Date :
2010-07-08 10:13:59
By :
SG14
ขอบคุณมากครับจะพยายามศึกษาครับ
Date :
2010-07-08 18:50:58
By :
itzone
สรุปแล้วเขียนภาษาไหนก็ต้องเหนื่อยทั้งนั้น อิๆ
Date :
2010-07-08 19:36:00
By :
2123
เอิ่ม ผมไม่ได้เข้ามาดูตั้งนาน กระทู้ความรู้กลายเป็นกระทู้ดรามาซะแล้ว
ผมขอออกตัวก่อนนะครับว่าผมยังไม่ได้อ่านครบทุกความเห็น อ่านคร่าวๆ แค่บางความเห็น
ผมว่าทุกภาษามีข้อดีและข้อเสียปะปนกันไปทุกภาษา เท่าที่ผมทราบมา java เป็นภาษา OO ในยุคแรกๆ เลย
หลังจากนั้นก็มีภาษาอื่นๆ เกิดขึ้นตามมามากมาย โดยมีการเอาข้อดีของภาษาที่เกิดก่อนมาเป็นพื้นฐานของภาษาใหม่
เรียกง่ายๆ ว่ามีการประยุกต์ปรับปรุงและก็พัฒนาต่อยอดกันมาเรื่อยๆ นี่แหละครับเรียกว่าภาษามีการพัฒนาและมีวิวัฒนาการของมัน เพราะฉะนั้นไม่มีภาษาไหนดีและไม่ดีหรอกครับ มันขึ้นอยู่กับสภาพแวดล้อมในการประยุกต์ใช้งานมากกว่า
การเลือกภาษาในการใช้งานมีหลายปัจจัยเข้ามาเกี่ยวข้อง โดยเฉพาะเรื่องลิขสิทธิ์
บางความเห็นก็บอกว่า MSSQL & VSS มี version ที่เป็น express version ที่เป็นฟรี
แต่ MSSQL ยังคงต้องลงบนเครื่องที่เป็น windows อยู่ซึ่งตรงนี้ถือว่ามี cost ของ software เกิดขึ้น ซึ่ง PHP สามารถลงบน platform ระบบต่างๆ ได้ทั้งฟรีและไม่ฟรี นี่นับว่าเป็นข้อดี PHP
นักพัฒนาอิสระสามารถหารายได้โดยการ implement ระบบใหญ่ๆ ให้บริษัทใหญ่ๆ ที่ serious เรื่องลิขสิทธิ์ได้
ด้วยภาษาที่มี cost น้อยที่สุด ซึ่งก็น่าจะเป็นที่ต้องการของตลาดอยู่ ณ ตอนนี้
เช่นเดียวกับ tool ในการเขียนโปรแกรมต่างๆ ก็มีการพัฒนาตามภาษามาเรื่อยๆ เหมือนกัน
โดย tool สมัยหลังๆ มานี้ก็เน้นเรื่อง ประสิทธิภาพของการเขียนโปรแกรม ช่วยเพิ่มความสะดวกให้กับโปรแกรมเมอร์ทั้งหลาย ภาษาทุกภาษามีความยืดหยุ่นไม่เท่ากัน เช่นเดียวกับ tool tool ของภาษาเดียวกันยังมีความสามารถได้ไม่เท่ากันเลยครับ
ผมว่าอย่าเอาประเด็นเรื่องภาษามาเถียงกันเลยดีกว่าครับ
เอาเป็นว่าคนที่สนใจ OO ของ PHP เราก็มาถามตอบกันต่อแล้วกันนะครับ
นี่ถ้ามีคนมาถามผมข้างนอกที่ไม่ใช่ในเวบผมจะยินดีอธิบายเกี่ยวกับ OO มากๆ เลย
เพราะสิ่งสำคัญของ OO ไม่ใช่ตัวภาษา แต่เป็นแนวคิดและความเป็นระบบระเบียบของ programmer เองล้วนๆ ครับ
จะเขียนให้ทุกอย่างรวมกันหมด หรือให้ทุกอย่างแยกกันหมดก็ย่อมได้
Date :
2010-07-10 23:48:50
By :
nut_t02
java ไม่ใช่ oop ในยุคแรกๆ แน่นอนครับ
turbo pascal ผมยังเห็น class & object แล้ว อิๆ
Date :
2010-07-11 01:59:15
By :
2123
แวะผ่านมาครับ เห็นคุยกับเรื่อง PHP OOP เป็นสิ่งที่น่าสนใจนะครับ แล้วก็ไม่ใช่สิ่งใหม่อะไร เพราะว่าปัจจุบันนี้ตัว PHP เองก็
มี framework หลาย ๆ ตัวมาสนับสนุน แล้วก็ส่วนใหญ่จะเน้นเรื่อง OOP ซะด้วย ซึ่งจากที่เคยได้ใช้ framework มาบ้าง ประโยชน์ที่เป็นได้ชัดเลยก็เป็นเรื่องของคุณสมบัติของ OOP นี่แหล่ะ
framework แนะนำก็เป็น symfony ครับ เป็น framework ที่ดีตัวหนึ่ง มีคนใช้เยอะ พร้อมทั้งคู่มือเอกสารต่าง ๆ ก็เยอะแล้วก็ค่อยข้างละเอียดเลยล่ะครับ แล้วก็อีกตัวหนึ่งก็เป็น Propel ORM อันนี้เป็นเรื่องของ Object Relational Mapping ใช้สำหรับการดึงข้อมูลให้ออกมาเป็น Object แทนที่จะเป็น Recordset หรือว่า Rowset ยังไงก็ลองหาอ่านดูนะครับ โลกนี้มีอะไรให้ศึกษาอีกไม่สิ้นสุด
อ้อ อีกเรื่องหนึ่งครับ ถ้ารักที่จะเขียน OOP ด้วย php ควรหาเครื่องมือที่สนับสนุนครับ เพราะว่ามันจะช่วยในเรื่องของ auto completing ในการเรียก property และ method ของ object ได้ ซึ่งผมเีลือกใช้ eclipse pdt ครับ
Date :
2010-07-14 19:06:06
By :
Ti
กำลังหัดเขียน แบบ oop ตัวอย่างนี้ดีมากเลยคับ
Date :
2010-07-29 15:49:45
By :
noomthapla
.... โอ้สุดยอดเลยครับพี่น้อง เห็นเหล่าอัศวินและเทพทั้งหลายแลกเปลี่ยนความรู้กันแล้วรู้สึกทึ่งมากๆ ทำให้ผมพลอยได้รับประโยชน์ไปด้วย
ขอบคุณมากๆ ครับ
Date :
2010-07-31 15:16:08
By :
mrsitti
เพิ่งจะได้เข้ามาศึกษา php ฝากเนื้อฝากตัวด้วยนะครับ
Date :
2010-07-31 15:27:38
By :
meduzaa
เดี๋ยวจะลองศึกษาดูครับ
Date :
2010-07-31 19:04:54
By :
smokietor
ขอนำไปศึกษาหน่อยนะครับ
Date :
2010-07-31 20:18:28
By :
kitnaruk99
อยากเก่งแบบ..เทพ..จัง..อยากเปนเทพอะครับ
Date :
2010-07-31 22:06:55
By :
kirita_a
เด๋วจะไปลองใช้ดู
Date :
2010-07-31 22:55:24
By :
pound_3066
จะทำตามที่ท่าน........ต้องการ
Date :
2010-07-31 23:55:20
By :
mosaddzero
กำลังศึกษาอยู่ครับ แต่ยังไม่ค่อยถนัดเท่าไร
Date :
2010-08-01 06:51:17
By :
bennadic
กำลังสนใจพอดีคะ แต่ว่าไม่เก่งเลยยยยยยยยยย เห้อ
Date :
2010-08-01 11:00:18
By :
pondpond
ยอดเยี่ยมมากเลยครับ
ต้องศึกษาเพิ่มเติมอีกเยอะเลยผม
Date :
2010-08-01 11:04:28
By :
paitoons
น่าลองเล่นดูจัง
ขอบคุณที่แนะนำ สำหรับความรู้ต่างๆ
Date :
2010-08-01 13:38:13
By :
monsterb
ยัง งง อยู่ว่า What's thaicreate.com?
Date :
2010-08-01 13:57:40
By :
joecnx
เดี๋ยวขอสอบกลางภาคเส็ดก่อนคับ เดี๋ยวจะมาฝึกการเขียนแบบ oop แบบจริงจัง
เวลาไม่รอใคร จพยายามให้ถึงที่สุด ท่าทางจะยากใช่ย่อย
หุหุ
Date :
2010-08-01 14:44:30
By :
pipop1150
get the point
Date :
2010-08-01 15:46:33
By :
nitic
อืมขอบคุณ ไม่ได้มาเยี่ยมชุมนานมากมาย เปลี่ยนแปลงไปเยอะ
Date :
2010-08-01 16:48:41
By :
kaggyman
เห็นด้วยอย่างแรงครับ เพราะเหมาะแกการ reuse มากๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆ
Date :
2010-08-01 19:18:37
By :
pongpon_eve
ผมอยากศึกษามานานแล้วครับ พอดีทำโปรเจคจบอยู่
ท่าทางจะยาก แต่ก็ต้องลองดู
อิอิ
Date :
2010-08-01 19:30:28
By :
cskaza
ผมเห็นด้วยอย่างยิ่งเลยครับ เขียนแบบ OOP นี่จะยุ่งยากตอนแรกๆ แต่พอเรียบร้อยก็จะทำให้โค๊ดเราดูง่าย แก้ไขง่าย
Date :
2010-08-01 20:22:42
By :
intrinity
เยียมมากเลยครับ มีเวลาว่าแล้วจะลองศึกษาดูครับ
Date :
2010-08-01 20:25:45
By :
renovrtio
เดี๋ยวว่าง ๆ จะมาศึกษาดูค่ะ อยากเขียนเป็นมั้ง
Date :
2010-08-01 22:24:58
By :
catty_hp
อยากเขียนเป็นเหมือนกันอะ ไว้จะศึกษาดู ^^
Date :
2010-08-01 22:44:04
By :
mitscsu
ดีมากคับ
Date :
2010-08-02 01:22:14
By :
buvanan
น่าสนใจครับ
Date :
2010-08-02 07:16:43
By :
okazaa
ยอดเยี่ยมครับ กำลังจะศึกษา
ได้แนวทางต่อยอดพอดี
Date :
2010-08-02 08:32:56
By :
yodfiin
ก่อนอื่นก็ขอบคุณก่อนนะครับ สำหรับกระทู้ดีๆ อะไรที่ดีๆ ก็เก็บไว้ครับ คนเราเลือกได้
Date :
2010-08-02 08:33:39
By :
ton280176
*-*
Date :
2010-08-02 08:43:31
By :
reckadmcr
ก้อดีนะ
Date :
2010-08-02 08:44:53
By :
reckadmcr
ขอบคุณมากครับ สำหรับแนวทางดีดี แต่ผมเองคงต้อง เรียนรู้อีกเยอะ เลย
+1 ครับ
Date :
2010-08-02 09:49:34
By :
rexchrono
ขอบคุณครับ อยากได้อยู่พอดี มีประโยชน์มากครับ
Date :
2010-08-02 09:49:35
By :
sungwein
ดีครับกระทู้นี้
กำลังหัดเขียนแบบ OOP เลยครับ
Date :
2010-08-02 10:07:02
By :
konbin
ดีครับ ผมก็เขียน แบบ OOP เหมือนกัน
ดีครับ เห็นด้วย ช่วยกัน รณรงค์ๆ
ตัวอย่าง เข้าใจง่ายดีครับ ขอชมนะครับ
Date :
2010-08-02 10:33:20
By :
supasit_vn
เยี่ยมครับ ช่วยรณรงค์ครับผม
Date :
2010-08-02 12:14:54
By :
dekkeng
แบบ OOP เขียนไม่ยาก
แล้วก็หาจุดที่ผิดง่ายขึ้นด้วยนะค่ะ
Date :
2010-08-02 13:35:36
By :
Kmay
เห็นด้วย...การเขียนแบบ oop แก้ไขข้อผิดพลาดได้สะดวก
ไม่ว่าจะด้วยภาษาใด...ลองหันมาเขียนแบบ oop ดูแล้วจะรู้สึกได้ถึงความแตกต่าง
Date :
2010-08-02 13:43:56
By :
chada_pr
ที่ Thaicreate มีกูรูฝีมือดีคอยให้คำแนะนำอยู่
ไม่ยากเลยถ้าจะลองเริ่มต้นกับการเขียนโปรแกรมแบบ oop
Date :
2010-08-02 13:45:44
By :
chada_pr
ขอบคุณครับคุณ Nut ผมอยากศึกษา เกี่ยวกับ OOP พอดีเลย ซึ่งกำลังฮิตสุดๆเลย
Date :
2010-08-02 15:03:35
By :
dragonjza
ขอบคุณค่ะ กำลังเริ่มต้นศึกษาoop อยู่พอดีเลยค่ะ^^
Date :
2010-08-02 17:05:44
By :
sheik
ดีครับ..อยากโค้ดเป็นบ้าง..
มีประโยชน์มากๆ ครับ..ทันสมัยดี
Date :
2010-08-02 17:38:15
By :
aunmsu
เอ่อ ขอขอบพระคุณทุกๆท่านครับผมที่กรุณายกตัวอย่างบ้าง ให้คำแนะนำบ้าง (แต่บางทีก็มีตีกันบ้าง เหอๆๆ)ผมซื้อแต่หนังสือมาอ่นจนปวดตับแล้ว ยังไปไหนไม่รอดเลย(โง่ อยู่นั่น) จะรีบพยายาม อดหลับ อดนอน ให้มากกว่าเดิม เพื่อเสริมรอยหยักในสมองครับ ขอสัญญา ด้วยเกียรติ ของลูกเสือสำรอง ครับ หุหุหุ
Date :
2010-08-02 18:48:46
By :
farook
ขอพูดรวมๆครับการกำหนดค่าและเข้าถึง property ไม่ควรเป็น getName หรือ setName ควรใช้ชื่อเดียวในการเข้าถึง
จะดูเหมือนเป็น function ธรรมดา ไม่ใช่ property เช่นกำหนดค่าก็ใช้ $this->Name('dekku'); การอ่านค่าก็ควรเป็น this->Name();
จะให้ความรู้สุกเป็น property มากกว่าน่ะครับ
Code (PHP)
<?
class people
{
private static $name="";
/*
ถ้าเรียกใช้ function โดยมีตัวแปรในวงเล็บเป็นการอ่าน
ถ้าเรียกใช้ function โดยไม่มีตัวแปรในวงเล็บเป็นการตั้งค่า
*/
public static function Name($in="")
{
if($in=="")
{
echo self::$name;
}
else
{
self::$name=$in;
}
}
}
$test=new people('weera');
$test->Name('hacker');
$test->Name();
?>
ประวัติการแก้ไข 2010-08-02 22:18:13
Date :
2010-08-02 22:11:49
By :
dekkuza
ขอบคุณครับ
กำลังลองผิดลองถูกกับการเขียน OOP อยู่เลยครับ
Date :
2010-08-02 22:15:57
By :
bubbleworm
เ้ขียนเป็น class ดี ครับ เพราะเราสามารถนำกลับมาใช้ใหม่ได้ หรือปรับปรุง นิดเดียวก็สามารถใช้งานได้เลย ดีครับ
Date :
2010-08-03 09:20:29
By :
kruanet_7
อาจจะเป็นการทำงานที่ช้าในช่วงแรกๆแต่ สบาย ที่หลังเนอะ
Date :
2010-08-03 10:57:11
By :
sorapolt
อยากให้มีหัวข้อ เกี่ยวกับพื้นฐานของ OOP เพิ่มเติมครับ
Date :
2010-08-03 10:58:28
By :
kensawa
เดินหน้ากันต่อไป
Date :
2010-08-03 17:07:03
By :
kokko
เก่งๆกันทั้งนั้นเลย
Date :
2010-08-03 17:55:32
By :
kaisoft
อยากเขียนเป็นมั่งจังครับ
Date :
2010-08-03 18:52:26
By :
mameenoy
โชคดี ที่ได้เริ่มเขียนโปรแกรมแบบ OOP เลย
ส่วนตัวแล้ว เริ่มจาก JAVA แล้วค่อยมาเขียน PHP ฉะนั้นเขียน OOP เลยไม่ยากเท่าไรนัก
ไม่ยากนะค่ะ ถ้าเข้าใจ
Date :
2010-08-03 19:46:43
By :
mammiez
อย่างงี้ต้องลองครับ
Date :
2010-08-03 20:07:54
By :
kakarot
กำลังศึกษาการเขียน PHP แบบ OOP กับ การใช้ PHP Framework อยู่พอดีเลย
ขอบคุณมากค่ะ ที่ให้ความรู้ ^^
Date :
2010-08-03 20:20:35
By :
MolToptaP
อยากเขียนโปรแกรมเก่งๆ มั่งจัง ข้าน้อยยังอ่อนด้อยนัก
Date :
2010-08-03 21:22:22
By :
bluebaarii
สนใจอย่างแรง แต่ตอนนี้ยังเขียนได้แค่พื้นฐาน
จะพยายามสู้ต่อไปครับ
Date :
2010-08-04 02:28:35
By :
Soda-Ice
พยายามต่อไปนะครับ
Date :
2010-08-04 03:27:19
By :
kinomini
เยี่ยมมากครับ กำลังศึกษาเหมือนกันครับ
Date :
2010-08-04 05:07:57
By :
parda012
อยากให้รวมทำเป็นหนังสือ เป็น pdf ให้โหลดอ่านกันได้หรือเปล่าครับ
Date :
2010-08-04 08:46:37
By :
sak5555
โดยส่วนตัวเขียนโค้ดเองไม่เป็นได้แต่เพียงศึกษาและใช้งานเครื่องมือต่างๆเท่านั้นซึ่งมันง่ายก็จริง แต่เราต้องมีในสิ่งที่คนอืนไม่มีเลยอยากลองเขียนเองดูบ้าง มันยากไหมครับ อยากลองดูจังเลยครับ แล้วจะเข้ามาศึกษาจากที่นี่บ่อยๆครับ
Date :
2010-08-04 08:59:15
By :
arther
สอนตัวอย่างเยอะๆ นะครับ
จะได้เข้าใจได้ง่ายๆ หลายๆ แบบ
Date :
2010-08-04 09:32:14
By :
nonilsri
มีประโยชน์ดีครับสอนคนไม่เป้นด้วยนะครับเพราะคนไม่เป็นอ่านไม่ค่อยออก ?><
Date :
2010-08-04 10:23:15
By :
mongames
ดีครับ ผมเห็นด้วย
เอาเลย ๆ ว่าง ๆ จะเข้ามาช่วยด้วย
เอาจากที่นี่ไปเยอะแหละ
Date :
2010-08-04 10:30:56
By :
didoman
อยากไ้ด้ เมลล์เทพ สักท่านจังครับ
ไม่รู้เรื่องไรคงจะได้ความรู้มากขึ้น
ปล.เพิ่งหัดเขียนครับแต่ไม่เก่งเรื่อง class ยังเริ่มต้นอยู่เลยครับ
Date :
2010-08-04 15:21:56
By :
narin_2205
สุดยอดเลยครับ ผมกำลังเริ่มศึกษาแนวคิด OO อยู่พอดีเลย จะได้มีที่แลกเปลี่ยนครับ
Date :
2010-08-04 15:48:42
By :
pakky999
เห็นด้วยครับ เพราะมันแก้ง่ายกว่าแบบโครงสร้างเยอะเลย
Date :
2010-08-04 15:49:50
By :
pichitchaip
เว็บนี้ดีจริงๆ นึกอะไรไม่ออกก็มาที่นี่ได้คำตอบทุกที
Date :
2010-08-04 17:34:08
By :
melodyApinan
++ ;
ให้ไปเลย
Date :
2010-08-04 18:26:33
By :
omeezyo
ก็อย่างที่เจ้าของกระทู้แนะนำค่ะ น่าจะเปลี่ยนวิธีการเขียนมาเป็นแบบ OOP ยังไงจะลองเปลี่ยนมาเขียนแบบนี้ดีกว่า
Date :
2010-08-05 09:26:30
By :
isumi_jang
เคยลองเขียนอยู่ครับ จะยากตอนแรก ๆ แต่พอทำไว้เหมดแล้ว เวลาอยากได้อะไรใหม่
ทำได้เร็วมากเพราะเราทำเป็น Function ไว้หมดแล้ว
Date :
2010-08-05 09:41:22
By :
hunter_cis
อยากลองเขียนแบบOOP
บ้างอะคับ
งัยก็จะเข้ามาติดตามผลงานเรื่อยๆคัย
Date :
2010-08-05 10:55:33
By :
singtocs
อยากเขียนเป็นมั่งจัง แต่แค่พื้นฐานก็ยัง งงๆ
Date :
2010-08-05 11:12:26
By :
cs_thammakan
เพิ่งเริ่มหัดเขียน php แนว oo แต่ไม่รู้ว่าจะได้เริ่มมั๊ย ขอบคุณมากเลยนะคะที่มีบทความแบบนี้มาให้ศึกษา
Date :
2010-08-05 14:21:01
By :
aey43
อยากลองเต็มๆบ้างจัง
Date :
2010-08-05 16:19:38
By :
iheerman
อยากลองเขียนบ้าง..
Date :
2010-08-05 20:10:20
By :
dragon_ryu
ต้องลองแน่ๆ
Date :
2010-08-05 21:58:24
By :
pirwun
ต้อง ลองศึกษา ดูแล้ว ขอบคุณครับ ที่นำเสอนสิ่งดีมาให้ศึกษาครับ
Date :
2010-08-06 12:14:26
By :
ufirst
ขอบคุณมากๆครับกำลังหาอยู่พอ
Date :
2010-08-06 12:16:02
By :
lajlwm
ได้ความรู้อื้อเลย Thank U
Date :
2010-08-06 14:37:20
By :
lidter
ผมค่อนข้างจะงงๆๆ เพราะว่า ผมมือไหม่อยู่ อิอิ
Date :
2010-08-06 16:14:10
By :
fishopat
กำลังจะเริ่มเขียนใหม่เหมือนกันค่ะ
Date :
2010-08-06 18:15:27
By :
sirilak999
ได้ความรู้มากมายเลยครับ.......เป็นแนวทางในการพัฒนาต่อไป..........
Date :
2010-08-07 10:51:36
By :
The_Thank
สนับสนุน ได้ความรู้เยอะมากครับ
Date :
2010-08-08 17:40:57
By :
mixer
สุดยอดครับ
Date :
2010-08-08 21:42:53
By :
minimum
ขอบคุณครับ สำหรับบทความดีดี
Date :
2010-08-08 22:48:51
By :
haguhagu200
ผมมีขอสงสัย ว่า
การเขียนระหว่าง oop กับ php framework ต่าง ๆ เช่น cakephp , ci , zend และอื่น ๆ มีข้อแตกต่างกัน อย่างไร
คัยก็ได้ช่วยแนะนำที ว่า ผมควรจะใช้ framework ตัวไหน เพราะสาเหตุ ไร
ตอนนี้ผมใช้ ado อยู่
ขอบคุณครับ
Date :
2010-08-08 23:14:41
By :
nopaket_kong
ขอบคุณกับสิ่งดีๆที่มีให้กันตลอดมา
Date :
2010-08-09 08:54:49
By :
ronman
ดีมากเลยครับ ง่ายและฟรีน่าสนใจมาก
Date :
2010-08-09 09:01:34
By :
DATEDATE
สนใจครับ กำลังศึกษา เดี๋ยวจะมาให้ปรึกษา นะครับ
Date :
2010-08-09 12:37:59
By :
pumin99
เป็นความคิดเห็นที่ดีครับ
Date :
2010-08-09 13:27:19
By :
spanishtt
ระบบใหญ่ลอง yii ครับ เร็วและเขียนอย่างละเอียดรอบคอบดีมากครับ
Date :
2010-08-09 13:30:33
By :
num
มือใหม่
Date :
2010-08-09 22:36:04
By :
birdman29
Thanks mak mak
ผมเขียนไม่เก่งอ่ะ
Date :
2010-08-11 10:44:30
By :
supaman
มือใหม่อ่านแล้วปวดหัวเลย เขียนธรรมดาก็งงมากมาย ถ้าเขียนแบบOOPอีกหละก้อหัวละเบิดแน่ๆเลย -"- แต่ก็สนับสนุนครับเพราะยังไงก็เขียนJavaอยู่แล้ว หุหุ
Date :
2010-08-11 23:22:55
By :
yakuzaoooo
โอ พระเจ้า
ทำให้มันยากขึ้นไปอีกรึเปล่าเนี่ย แต่ก็เพิ่งรุ้ว่ามันเขียนแบบ OOP ได้แฮะ
Date :
2010-08-13 11:54:27
By :
noppamas
ผม หลอน กับ oop พอสมควรครับ หลอนเพราะว่า ผม แพ้ JAVA ด้วยมั้ง -_- แต่ ใจ นึง ชอบนะjava ภาษา บ้าอะไรไม่รู้ เขียนยาวดี 55
Date :
2010-08-13 20:35:32
By :
muay5157
อือครับ
แต่ตอนนี้ผมก็กำลังเรียน จาวาอยู่พอดีครับ
ถ้าเอามาปรับใช้กับ php ได้ก็เยี่ยมเลยครับ
++
Date :
2010-08-14 16:58:30
By :
noomsci
สุดยอด OOP หรือ ไม่ คงต้องเป็นเรื่องของผู้ใช้แล้วครับ
Date :
2010-08-14 21:27:49
By :
apichat_L
oop เทอมที่แล้วเจอไปเต็มๆเลยครับ เหอะๆ ยาวได้ใจกันไป
Date :
2010-08-15 01:06:16
By :
dearcs
ยังมองภาพตัวอย่างไม่ออกเลยครับ มือใหม่
Date :
2010-08-17 08:12:50
By :
smokietor
กำลังพยายาม
แต่ชินกับ function อยู่
Date :
2010-08-20 14:03:45
By :
watcharaha
ตอนนี้ผมทำโปรเจ็คทุกครั้งผมจะพยายามใช้แต่นึกไม่ออกว่าควรจะเริ่มที่อะไรยังไง
คือมีความเข้าใจบ้างแต่ไม่รู้จะประยุกต์อย่างไร แล้วเวลาที่เราทำคลาสหนึ่งแล้วอีกคลาสหนึ่งที่ใช้พร้อมกันในหน้าเดียวกัน อะไรทำนองเนี้ยครับ
งง
สุดท้ายมาตายที่เขียนแบบ function ธรรมดาตลอด
ปล. อยากทราบแนวคิดนะครับเวลาที่คนจะเขียน oop เขาจะคิดเรื่องการแบ่งคลาสอย่างไร สมมติว่าเป็นระบบง่ายๆเช่น ระบบหลังบ้าน แบบจัดการแค่ member อย่างเดียวลืมเพิ่มแก้ไขได้ ทำนองเนี้ยครับ
Date :
2010-08-24 09:51:34
By :
oxygenyoyo
ระบบหลังบ้าน แบบจัดการแค่ member อย่างเดียวลืมเพิ่มแก้ไขได้ ทำนองเนี้ยครับ
ปกติถ้าเป็นระบบหลังบ้านผมจะมอง ออกเป็นสองส่วน
1. การสร้าง form
การสร้าง form ก็จะได้มา class นึงคือ class Form เวลาเราใช้งานก็แค่ประกาศ object แล้วส่ง พวก input ต่างๆ เข้าไปผมเรียกมันว่า configuration ละกันครับ
2. การแสดงผล การแสดงผล
- การแสดงผลก็อยู่ในรูปแบบของตาราง ได้ class นึงคือ Table
- ถ้าต้องการแบ่งหน้าแสดงผล ก็จะได้มาอีก class นึง คือ Pager
ลองเขียน 3 class นี่ด้วยตัวเอง ถ้าคุณเขียนได้แล้วคุณจะมองเห็นถึงประโยชน์ของมัน
ที่สำคัญผมคิดว่า โค้ดเราจะเป็นระเบียบดูง่าย ซึ่งจะง่ายต่อการหา bug
นี่ class ที่ผมเขียนไว้
มีดดาบที่ไม่ได้ลับ ย่อมจะหมดความคมฉันใด ความรู้ที่ไม่ได้ใช้ก็ย่อมจะลืมไปฉันนั้น
Date :
2010-08-24 13:25:20
By :
DS_Ohm
คือผมกำลังจะเขียน php เชิง oop อยู่เหมือนกันครับแต่ concept ผมยังไม่ได้เลยครับ
ไม่รู็หลักการว่าทำงานยังไง พี่ๆที่มีน้ำใจสนับสนุน รบกวนกวนช่วยส่ง โค้ด php เชิง oop พร้อมคำอธิบาย
จะเป็นพระคุณมากครับ เมล์ [email protected]
Date :
2010-08-26 12:26:24
By :
sleepington
ดูว่าพอสร้าง class แล้วเขียนเว็บง่ายขึ้นหรือยากขึ้นก็เป็นคำตอบว่าเขียน oop แบบที่ดีหรือเปล่า..
Date :
2010-08-26 17:55:54
By :
...
ขอบคุงง้าบบบบบบบบบบบบ
Date :
2010-08-26 22:02:33
By :
Sirichut
มันต่างกันอย่างไรครับ อยากลองทำเหมือนกันครับ
Date :
2010-08-31 11:01:56
By :
jakratam
น่าเขียนครับ แต่ต้องศึกษาก่อนนะ
Date :
2010-08-31 12:30:39
By :
yUmzA
ดีจังเลยค่ะพึ่งหัดเขียน
Date :
2010-10-07 14:19:07
By :
ueng
รบกวนขอความรู้ OOP in PHP หน่อยครับ ผมคิดจะเขียน แต่ไม่รู้จะเขียนอย่างไงดี ผมยัง งงๆ กับ OOP in PHP อยู่เลยครับ
Date :
2010-10-11 14:55:32
By :
2m2n
คล้าย c++ เลย
ดูไม่น่ายากนะคะ ถ้ามีปัญหาอะไรคงต้องขอปรึกษาหน่อยแล้วล่ะค่ะ ^^
Date :
2010-10-11 20:26:00
By :
princezpunch
ลงนามใช้ oop ด้วยคนครับ อิอิอิอิอิอิ ผมได้ทดลองเขียน บน joomla ดูแล้ว ครับ เห็นถึงความสะดวกและเป็นระเบียบเลยชอบครับ
Date :
2010-10-12 13:09:03
By :
SOUL
เยี่ยมมากเลยครับ กระทู้นี้มีประโยชน์อย่างมากกับการพัฒนาโปรแกรมครับ
Date :
2010-10-15 21:35:43
By :
hanami99
ขอถามหน่อยนะครับสมมุติว่าผมเขียน class จัดการตาราง ดึงข้อมูลมาโชว์ ผมจะสร้าง new object ใหม่แล้วให้มันโชว์ข้อมูลเป็นแถวเป็นคอรัม
ยังไงครับ
<?php
class book {
var $book_id;
var $au_id;
var $isnb_no;
var $book_name;
var $str_massage;
function book() {
$this->book_id = "";
$this->au_id = "";
$this->isnb_no = "";
$this->book_name = "";
$this->str_massage = "";
}
function select_tbl_book($page){
$db_connet = new db_connect();
$util = new utility();
$rowPerPage = $util->getRowPerPage();
$dataList = array();
$select_sql = "SELECT "
." tbl_book.book_id"
.",tbl_book.au_id"
.",tbl_book.isnb_no"
.",tbl_book.book_name"
." FROM tbl_book"
." WHERE tbl_book.book_id <> 0";
$select_sql .= " ORDER BY tbl_book.book_id ";
$select_rst = mysql_query($select_sql);
$numRec = mysql_num_rows($select_rst);
$maxPage = ceil($numRec/$rowPerPage);
if($page == NULL || $page == ""){
$page = 1;
$max = $rowPerPage;
}else{
$max = $page*$rowPerPage;
}
if($page==1){
$min = 0;
}else{
$min = $max - $rowPerPage;
}
$rec = $min;
$select_sql .= " LIMIT $min,$rowPerPage";
$select_rst = mysql_query($select_sql);
$dataList[0] = $page;
$dataList[1] = $maxPage;
$dataList[2] = $numRec;
$i=3;
while($select_row=mysql_fetch_object($select_rst)){
$rec++;
$dataList[$i] = $rec;
$dataList[$i+1] = $select_row->book_id;
$dataList[$i+2] = $select_row->au_id;
$dataList[$i+3] = $select_row->isnb_no;
$dataList[$i+4] = $select_row->book_name;
$i += 5;
}
return $dataList;
}
}
?>
Date :
2010-11-08 14:47:58
By :
teekaiman
เขียนแบบ oop ก็ดีนะคะ ขอตัวอย่างเยอะ ๆ หน่อยได้ไหมคะ เผื่อศึกษาหน่ะคะ ขอบคุณล่วงหน้านะคะ
Date :
2010-11-08 15:31:05
By :
auengfa
เขียน php แบบ oop ทำได้ถ้าเก่งแล้ว จริงๆนะ มันเป็นสัดส่วนดี
แนะนำ ถ้าคนพึ่งเริมเขียนโปรแกรมแบบ oop ไปเริ่มกับอะำไรที่เป็น real oop ไม่ดีกว่าหรือครับ
ให้เทพเค้า mix&math เองดีกว่า
Date :
2010-11-19 10:48:12
By :
kabarobace
oop คือการเขียนโปรแกรมแบบอ้างอิงเหมือนวัตถุไม่ใช่ภาษา ดังนั้นภาษาอะไรถ้าเข้าใจ oop ก็เขียน oop ได้
Date :
2010-11-20 00:07:37
By :
--
พี่ๆๆครับ ช่วยชี้แนวทางให้ผมหน่อยครับ
พอดีผมเรียน vb.net อ.ท่านสั่งให้เขียนโปรแกรม แบบว่า มีฟอร์มอยู่ 5 ฟอร์ม โดยฟอร์มทั่งหมดจะต้องใช่โค้ดร่วมกัน
ช่วยชี้แนวทางให้ด้วยนะครับ
(มือใหม่หัดเขียน)
ขอบคุณครับ
Date :
2010-11-20 18:14:16
By :
เด็มคอมศึกษา
มีคำถามนิดหน่อยครับ คือแบบว่าสงสัย
OOP ต่างกับ function อย่างไร เพราะโครงสร้างของ OOP เป็น
Code (PHP)
<?php
class ... {
function ....() {
คำสั่งใน method()
}
}
?>
ซึ่งจากที่ดู function จะถูก Encapsulation โดย class เวลาเรียก ต้องสร้าง Object ผ่าน class
แต่ถ้าเราเขียนเป็นฟังก์ชั่นเลย ไม่ต้องประกาศ class ก็สามารถ เรียกชื่อฟังก์ชั่นมาใช้ได้เลย
ผมเลยงงว่า มันต่างกันอย่างไร มีดี มีเสียอย่างไร อะไรที่ function ทำไม่ได้ แล้ว OOP ทำได้
หรือผมอาจจะยัง ไม่ค่อยเข้าใจใน OOP ก็ไม่รู้อ่ะครับ
ขอความกระจ่างด้วยนะครับ ขอบคุณครับ
Date :
2010-11-21 17:41:56
By :
adaaugusta
oop vs procedural
พูดถึงตัวแปร global ก่อนนะครับ
ถ้าใช้ตัวแปร global แสดงว่าทุก function สามารถเข้าถึงตัวแปร global ได้หมด
เวลาเกิด error ขึ้นในโปรแกรม โดยเฉพาะ error จาก logic เราจะไม่สามารถวิเคราะห์ได้ว่า
ภายใน function ไหนที่เป็นตัวเข้าไปแก้ไขทำใ้ห้ตัวแปร global หรือโปรแกรมของเราทำงานผิดพลาด
ดังนั้นภายในโปรแกรมควรจะจำกัดตัวแปร global ให้น้อยที่สุดครับ
ถึงจะมีข้อแนะนำว่าไม่ควรใช้ตัวแปร global หรือใช้น้อยที่สุด
แต่ว่าบางโปรแกรมที่จำเป็นต้องใช้ตัวแปรร่วมระหว่าง function ครับ
f1($a); ต้องการตัวแปร $x ไปประมวลผล
f2($a,$b); ต้องการตัวแปร $x ไปประมวลผล
f2($c,$d); ต้องการตัวแปร $x ไปประมวลผล
ซึ่งถ้าเราไม่ใช้ตัวแปร global เราก็ต้องเขียนแบบนี้ครับ
f1($a,$x);
f2($a,$b,$x);
f2($c,$d,$x);
แต่ว่าปัญหาเกิดครับ มีโค้ดซ้ำ ได้แก่ ,$x ซึ่งทำให้โปรแกรมเขียนและอ่านยากขึ้น
และเราไม่สามารถบอกได้ว่า function f1,f2,f3 มีความสัมพันธ์ต่อเนื่องกันหรือไม่
ซึ่งถ้าเขียนแบบ function ก็ทำได้ครับเช่น mysql_connect, mysql_query อันนี้เป็นการระบุความสัมพันธ์จาก คำหน้าหน้าชื่อ function
สำหรับการเขียนแบบ class นะครับ
เป็นการแก้โจทย์ปัญหาเกี่ยวกับตัวแปรร่วมที่ใช้ function ต่างๆ โดยไม่ต้องส่ง parameter ไปมา
การสร้างเป็น class นั้น ตัวแปรที่เป็นตัวแปรร่วมจะเรียกว่า member ของ class
ส่วน function จะเรียกว่าเป็น behavior ของ class (บรรทัดนี้และบรรทัดบนนี้ไม่รู้ถูกป่าวนะผมก็แค่ฟังๆผ่านๆจาก lecture ที่มหาวิทยาลัย)
ประโยชน์อย่างหนึ่งก็คือจัดกลุ่มของ function ที่สัมพันธ์กันโดยไม่ต้องมี คำนำหน้าเดียวกัน และไว้ที่เดียวกัน
ประโยชน์อีกอย่างคือ ตัวแปร member จะถูกแก้ไขโดย function และำคำสั่งภายใน class เท่านั้น
ทำให้พอจะระบุตำแหน่งของ error ได้ง่ายขึ้น เพราะในการเขียนแบบ oop ไม่จำเป็นต้องใช้ตัวแปร global มากมายอย่างในแบบ procedural
ประโยชน์อีกอย่างก็คือการจัดรูปแบบของ program จะมีลักษณะเป็นวัตถุกลุ่มก้อนมากขึ้น
การมองการเขียนโปรแกรมในรูปแบบ oop จะต่างจาก function ซึ่งเพียงแต่จะเน้นเพียงวัตถุประสงค์ให้โปรแกรมทำงานสำเร็จลุล่วง
แต่ จะมองว่าเป็นการพยายามทำให้วัตถุต่างๆ ในโปรแกรมสื่อสารโต้ตอบกัน ใน oop เรียกว่าส่ง message การทำแบบนี้จะทำให้โปรแกรมที่ค่อนข้างซับซ้อน สามารถนำกลับมาใช้ใหม่ได้สะดวกครับ แต่การเขียนแบบอิสระก็จะทำให้เกิดความไม่เป็นระเบียบได้เหมือนกันจึงมีผู้ ออกแบบ oop design pattern ที่ใช้กันบ่อยๆ ขึ้นมาครับ ซึ่งแม้ว่าการเขียนแบบ function ธรรมดาก็ทำได้เช่นเหมือนกัน แต่จะจัดระเบียบยุ่งยากกว่าแบบ class อยู่พอควรครับ
ประวัติการแก้ไข 2010-11-21 20:42:36
Date :
2010-11-21 20:40:14
By :
num
คับพี่หนุ่มอธิบายได้ดีมากครับ ตรงข้ามกับผมลิบลับ
ถ้าจะให้ลิส ว่าทำไม class method ถึงดี ก็น่าจะเป็น
1. ทำให้ใส่ชื่อ เมธอดได้ง่าย
ถ้าเราเขียนเป็นฟังชั่น บางทีฟังชั่นชื่อคล้ายๆ กัน เราต้องเสียเวลาคิดตั้งชื่อนานคับ เพราะฟังชั่นต่างๆ เป็น global visible หมด แถมถ้าเราพัฒนาไปเรื่อยๆ อาจต้องมีการ refactoring ชื่อฟังชั่นอีก (แต่ OOP ก็มีการรีแฟคเตอร์ชื่อมันบ่อยเหมือนกัน)
แต่ปัจจุบันได้แต่เขียนเว็บ เลยไม่ได้คิดอะไรอีก ซักเท่าไร่(รู้สึกว่าโง่ลง) เพราะมันไม่ค่อยได้ใช้ OOP ซึ่งมันทำงานช้ากว่า จะไปเขียน Object member (admin, guest, member) แบบถ่ายทอดคุณสมบัติ มันก็กะไรอยู่ ทั้งที่เว็บ ไม่ได้ซับซ้อนอะไรมาก
ส่วน MVC ก็ใช้แพทเทิร์น มันก็สบายเพียงพอละ
Date :
2010-11-21 21:04:37
By :
pjgunner.com
ไง ไม่ไงไม่รู้ แต่โปรเจ็คจบเราได้ เทพ แถวนี้ช่วยถึงเสร็จ และ เกรดเป็น A
Date :
2010-11-23 13:35:06
By :
Fursan
อาจจะยาก ในตอนเริ่มต้น แต่พอนานเข้า ท่านจะรู้สึกได้เลยว่า อะไร ๆ มันก็ง่ายไปหมดครับ ไม่ต้องมาทำมาเขียนอะไรให้ยาว ๆ ๆ จะหยิบ จะจับ จะดึงจะใช้อะไรก็ง่าย ๆ แสนงาน ยิ่ง เอาที่เขาเขียนไว้แล้ว เช่น framework ต่าง ๆ มันก็ยิ่งง่ายไปหมอครับ
ยกตัวอย่างหน่อยแล้วกันเนาะ
$ar=arrya(
"id"=>$this->input->post("id"),
"name"=>$this->input->post("name")
);
$rs = $this->db->insert("tb_order",$ar);
save ได้ละ
Date :
2010-11-27 08:06:59
By :
kalamell
ผมเองตอนนี้ก็ทำ Class ที่เกี่ยวกับ mysql พื้นฐาน ไว้ใช้งาน เพราะ class ง่ายๆสำหรับเิริ่มต้นศึกษา
class นี้ผมทำแค่ connectdb,insert,select,update,delete แค่นี้ครับถ้าใช้อยากเริ่มศึกษาเอาตรงนี้เป็นตัวเริ่มเหมือนผมก้ได้ครับ
พอหลังจากที่ผมได้ทำดูมันก็สนุกและเวลาแก้ไขนั้นง่ายมากแก้ไขแค่ไฟล์เดียว จบเลย 5555
แต่ผมยัง งง อยู่กับเครื่องหมายพวกนี้ครับ
_ อันเดียว กับ __ สองอัน ที่อยู่ด้านหน้าตัวแปรหรือชื่อ function ไม่รู้ว่าเรียกถูกหรือเปล่านะครับ แล้วก็ :: อันนี้เอาไว้ทำไรครับ
มือใหม่หัดเดิน OOP นะ
Date :
2010-12-09 08:52:42
By :
somparn
ป๊ๅดด ตาลายเลย
Date :
2010-12-26 14:03:18
By :
CETA
รักกระทู้นี้จริงๆ เลยพี่น้อง
....แม้จะเป็นเหล่าเทพคุยกันก็เหอะ แต่ผมก็พอถูๆ ไถ ไปได้ มันมีประโยชน์มากๆ เลย
ขอบพระคุณทุกๆ ท่าน
สุดยอดดดด
Date :
2010-12-27 09:42:35
By :
mrsitti
คือๆ อ้าย กำลังลองอยู่เพราะ oo มันเป็นลำดับดี แยกสัดส่วนชัดเจน และก็ประกอบได้ง่ายด้วย การทำงานเป็นทีมถ้าเขียนแบบoo ยิ่งลื่นไหลจนหัวแตก ค้นหามาให้ศึกษาเยอะๆแน่เด้อครับ จะได้เก่งๆๆกัน ยิ่งๆขึ้ั้นไป
Date :
2011-01-16 07:08:15
By :
ruudshowห่วย
OOP นี่ดีจังต้องศึกษาแล้ว
Date :
2011-01-17 12:41:14
By :
dragonjza
ผมจะลองหัดเขียน PHP ดูครับ ปกติไปทาง VB
Date :
2011-01-24 10:08:07
By :
iheerman
Date :
2011-03-02 11:34:35
By :
NAMDANGSODAZA
PHP แบบ oop ต้องหัดมาจริงจังด้านนี้จริงๆจังๆบ้างละ
Date :
2011-03-27 21:24:30
By :
mzchewiize
ใช้ oop นี่ก็ดีนะครับ แต่ถ้าเขียนแล้วไม่ได้คอนเซป oop ก็เสียเวลาเปล่า
Date :
2011-04-08 13:08:37
By :
cpuchare
มีประโยชน์ดีครับ
Date :
2011-05-07 10:56:28
By :
suchinee
สำหรับคนที่ใช้ .NET 2005,2008 มา
อยากให้ลอง PDO แทนที่จะเขียนเองดูนะครับ
(เขียนเองต้องนั่งคิดวิธีกัน SQL Injection เองด้วย -_-")
เนื่องจาก PDO Function ต่างๆคล้ายกับ SqlCommand, SqlConnection มาก
ทำให้เรียนรู้ได้รวดเร็วกว่ามาขึ้นโครงเองใหม่ทั้งหมดครับ
Date :
2011-05-27 09:24:52
By :
King
ศึกษา OOP แนะอีกนิดเราจะต้องผนวกเข้ากับสถาปัตยกรรมซอฟท์แวร์แบบ MVC ด้วยจะทำให้เรารู้และมองเห็นประโยชน์ของการเขียนโปรแกรมในรูปแบบเชิงวัตถุว่า มันคุ้มกับการที่ต้องเหนื่อยอย่างไร
http://th.wikipedia.org/wiki/Model-view-controller
Date :
2011-05-30 02:35:52
By :
Manussawin
Code (PHP)
<?php
class mysql_config {
var $dbconfig = array(
'hostname' => NULL ,
'username' => NULL ,
'password' => NULL ,
'database' => NULL ,
'collation_connection' => NULL ,
'character_set' => NULL
);
function mysql_config(){
$GLOBALS['global_mysql_querydb_timer'] = 0;
$GLOBALS['global_mysql_querydb_counter'] = 0;
}
function get_querydb_timer() {
global $static_query_timer;
if(isset($static_query_timer)) return $static_query_timer;
else return $GLOBALS['global_mysql_querydb_timer'];
}
function get_querydb_counter() {
global $static_querydb_count;
if(isset($static_querydb_count)) return $static_querydb_count;
else return $GLOBALS['global_mysql_querydb_counter'];
}
function set_querydb_timer($value) {
global $static_query_timer;
if(isset($static_query_timer)) $static_query_timer = $value;
else $GLOBALS['global_mysql_querydb_timer'] = $value;
}
function set_querydb_counter($value) {
global $static_querydb_count;
if(isset($static_querydb_count)) $static_querydb_count = $value;
else $GLOBALS['global_mysql_querydb_counter'] = $value;
}
function set_hostname($value) {
$this->dbconfig['hostname'] = $value;
}
function set_username($value) {
$this->dbconfig['username'] = $value;
}
function set_password($value) {
$this->dbconfig['password'] = $value;
}
function set_database($value) {
$this->dbconfig['database'] = $value;
}
function set_collation_connection($value) {
$this->dbconfig['collation_connection'] = $value;
}
function set_character_set($value) {
$this->dbconfig['character_set'] = $value;
}
function get_configdb() {
return $this->dbconfig;
}
}
class mysql_operator extends mysql_config {
var $link = NULL;
var $result = NULL;
var $mysql_version = NULL;
var $string_error = array();
function set_configdb(&$array_dbconfig) {
$this->set_hostname($array_dbconfig['hostname']);
$this->set_username($array_dbconfig['username']);
$this->set_password($array_dbconfig['password']);
$this->set_database($array_dbconfig['database']);
$this->set_collation_connection(
$array_dbconfig['collation_connection']
);
$this->set_character_set($array_dbconfig['character_set']);
}
function set_error_msg($string){
array_push($this->string_error, $string);
}
function get_error_msg(){
while (count($this->string_error) - 1)
$string_output = '<b>MySQL Error : </b> '.
array_pop($this->string_error).'<br />';
return $string_output;
}
function mysql_operator(&$dbconfig) {
if(is_array($dbconfig)) $this->set_configdb($dbconfig);
else $this->set_configdb($dbconfig->get_configdb());
}
function set_mysql_version($value) {
$this->mysql_version = $value;
}
function get_mysql_version() {
return $this->mysql_version;
}
function opendb($newlink = FALSE) {
$this->link = mysql_connect($this->dbconfig['hostname'],
$this->dbconfig['username'],
$this->dbconfig['password'],
$newlink);
if (!$this->link)
$this->set_error_msg(
mysql_errno($this->link).':'.
mysql_error($this->link)
);
$this->set_mysql_version(mysql_get_server_info());
if (!mysql_select_db ($this->dbconfig['database']))
$this->set_error_msg(
mysql_errno($this->link).':'.
mysql_error($this->link)
);
if(!empty($this->dbconfig['character_set'])) {
$this->querydb("SET CHARACTER SET ".
$this->dbconfig['character_set'].";"
);
$this->querydb_counter_decrement();
}
if(!empty($this->dbconfig['collation_connection'])) {
$this->querydb("SET collation_connection = ".
$this->dbconfig['collation_connection'].";");
$this->querydb_counter_decrement();
}
}
function closedb() {
if (!mysql_close($this->link))
$this->set_error_msg(mysql_errno($this->link).':'.
mysql_error($this->link)
);
}
function querydb($string_query) {
$start_time = array_sum(explode(chr(32), microtime()));
$this->result = mysql_query ($string_query);
$end_time = array_sum(explode(chr(32), microtime()));
if (!$this->result)
$this->set_error_msg(
mysql_errno($this->link).':'.mysql_error($this->link)
);
$this->set_querydb_timer(
$this->get_querydb_timer() + ($end_time - $start_time)
);
$this->querydb_counter_increment();
}
function list_fields($table) {
$fields = mysql_list_fields(
$this->dbconfig['database'], $table, $this->link
);
$columns = mysql_num_fields($fields);
for ($i = 0; $i < $columns; $i++)
$array_fields_in_table[$i] = mysql_field_name($fields, $i);
return $array_fields_in_table;
}
function querydb_counter_increment() {
$this->set_querydb_counter($this->get_querydb_counter()+1);
}
function querydb_counter_decrement() {
$this->set_querydb_counter($this->get_querydb_counter()-1);
}
function querydb_transac_begin() {
if($this->get_mysql_version() > 3)
$this->querydb("START TRANSACTION;");
}
function querydb_transac_commit() {
if($this->get_mysql_version() > 3) $this->querydb("COMMIT;");
}
function querydb_transac_rollback() {
if($this->get_mysql_version() > 3) $this->querydb("ROLLBACK;");
}
function querydb_transac_set_autocommit_to_zero() {
if($this->get_mysql_version() > 3)
$this->querydb("SET AUTOCOMMIT=0;");
}
function querydb_transac_check_for_rollback_or_commit() {
if(!($this->get_resultdb())$this->querydb_transac_rollback();
else $this->querydb_transac_commit();
}
function num_rows_in_table($table, $condition = NULL) {
$num_rows = new mysql_operator($this->get_configdb());
$num_rows->opendb();
$num_rows->querydb("SELECT COUNT(*) FROM $table $condition;");
$num_rows->closedb();
return mysql_result($num_rows->get_resultdb(), 0);
}
function has_data_in_table($table, $field, $value) {
$value = trim($value);
if(empty($field) or empty($value)) $sql_condtion = NULL;
else $sql_condtion = "WHERE ".$field."='".$value."'";
if($this->num_rows_in_table($table, $sql_condtion) > 0)return TRUE;
else return FALSE;
}
function reset_querydb() {
$this->set_resultdb(NULL);
}
function set_resultdb($resource) {
$this->result = $resource;
}
function get_resultdb() {
return $this->result;
}
function get_resultdb_fetch_data() {
return mysql_fetch_array($this->get_resultdb());
}
function get_resultdb_num_rows() {
return mysql_num_rows($this->get_resultdb());
}
function get_resultdb_num_fields() {
return mysql_num_fields($this->get_resultdb());
}
function get_last_insert_id(){
return mysql_insert_id();
}
function get_resultdb_atrow($row = 0) {
return mysql_result($this->get_resultdb(), $row);
}
}
?>
Code (PHP)
<?php
$obj_dbconfig = new mysql_config();
$obj_dbconfig->set_hostname("localhost");
$obj_dbconfig->set_username("root");
$obj_dbconfig->set_password("");
$obj_dbconfig->set_database("test");
$obj_dbconfig->set_character_set("utf8");
$obj_dbconfig->set_collation_connection("utf8_general_ci");
$obj_db = new mysql_operator($obj_dbconfig->get_configdb());
$obj_db->opendb();
$obj_db->querydb("SELECT * FROM table;");
$obj_db->closedb();
echo $obj_db->get_resultdb_num_rows();
while ($row = $obj_db->get_resultdb_fetch_data()) {
echo $row[0];
?>
Date :
2011-06-10 14:03:40
By :
xyz
No. 167
เขียน Class Calculate แบบนั้นได้ไงครับ มันไม่ต่างจากการเขียนแบบ function เลยนะครับ
คุณ nut_t02 ครับ ไม่ทราบว่ามือตกไปหรือปล่าว ตั้งแต่ No.1 ดูเหมือนคุณรู้เรื่อง oop ดี แต่จาก class Calculate ที่คุณเขียน ผมว่าคุณสอบตกเรื่องการ เข้าใจ oop นะครับ
จริงๆแล้วมันน่าจะเขียนแบบนี้ต่างหาก
Code (PHP)
class Calculate {
private $value = 0;
function __construct($value) {
$this->value = $this->filterValue($value);
}
function filterValue($value) {
if (is_numeric($value)) {
return $value;
}if ($value instanceof Calculate) {
return $value->getValue();
}
}
public function plus($value) {
$this->value = $this->value + $this->filterValue($value);
return $this;
}
public function minus($value) {
$this->value = $this->value - $this->filterValue($value);
return $this;
}
public function mutiply($value) {
$this->value = $this->value * $this->filterValue($value);
return $this;
}
public function div($value) {
$this->value = $this->value / $this->filterValue($value);
return $this;
}
public function pow($value) {
$this->value = pow($this->value, $this->filterValue($value));
return $this;
}
public function reset() {
$this->value = 0;
return $this;
}
public function getValue() {
return $this->value;
}
public function __toString() {
return number_format($this->getValue(), 2);
}
}
$cal1 = new Calculate(3);
$cal1->plus(3)->plus(5)->minus(1)->mutiply(2)->div(2)->pow(3);
echo $cal1; //1,000.00
$cal1->reset();
$cal1->plus(3);
$cal1->plus(3);
$cal1->plus(5);
$cal1->minus(1);
$cal1->mutiply(2);
$cal1->div(2);
$cal1->pow(3);
echo $cal1; //1,000.00
$cal2 = new Calculate(5);//5
$cal2->mutiply(2); //10
$cal3 = new Calculate(5); //5
$cal3->minus($cal2)->div(2);
echo $cal3; //-2.50
$cal4=new Calculate($cal3);
echo $cal4; //-2.50
Date :
2011-06-11 16:02:42
By :
VP9
ถ้าเคยได้ลอง Java มาจะรู้ว่า ทำไม OOP ถึงมีประโยชน์อย่างมากครับ ถ้าจะลองหัด เขียน PHP แบบ OOP แล้วหล่ะก็ ลองไป เรียบ ๆ เคียง ๆ concept จาก Java ก่อนจะดี เพราะว่า เพราะจะได้รู้ครับ ว่า มันมีประโยชน์อย่างไรครับ ส่วนเรื่องของ syntax ก็ไม่ใช่ปัญหา ใช้เวลาไม่นานก็ทำได้แล้วหล่ะครับ
Date :
2011-06-14 15:43:34
By :
kalamell
ได้ความรู้เยอะเลยครับ เหอๆ
Date :
2011-06-20 22:30:54
By :
OoDie
มีแต่คนเทพๆ อะ ผมก็เข้ามาศึกษาบ่อยๆ
Date :
2011-06-29 10:44:30
By :
jakkathon
คนเทพๆเยอะเลย ขอเก็บความรู้นี้ไปใช้ต่อนะครับ
Date :
2011-06-29 10:45:52
By :
jakkathon
มึนเลย พึ่งหัดเขียน php ครับ พี่ๆๆ นิ เทพ จังเลยอ่ะ
Date :
2011-07-01 16:45:13
By :
seree
ขอบคุณ ครับ
Date :
2011-07-05 13:07:32
By :
Dekbannok14
น่าสนใจมากค่ะ เพราะตอนนี้ ก็ทำ OO แบบ MVC ค่ะ เด๋วจะเข้ามาติดตามบ่อยๆ และจะมาสอบถามบ่อยๆนะคะ
Date :
2011-07-10 23:41:03
By :
OracialPC
ผมกำลังจะศึกษา สักวันต้องเก่งแบบพี่ๆบ้าง
Date :
2011-07-13 16:09:36
By :
arta
php นี่เวลา new ขึ้นมาใหม่แล้วต้องการทำลายทิ้งใช้คำสั่งอะไรเหรอครับ
Date :
2011-07-18 16:16:20
By :
Feista
ขอบคุณครับ
Date :
2011-07-22 12:39:01
By :
gujoe124
มันยากอยู่น้าาาา แต่ก็จะพยายามละกันนะร่วมมือกัน
Date :
2011-07-22 13:18:54
By :
bkawngog
ศึกษาจากเว็บนี้เลยครับ ตอบโจทย์ ได้เป็นอย่างดีเลย
http://www.php.net/oop
Date :
2011-07-25 13:09:34
By :
kalamell
ผมเกิดมากับจาวาอ่ะคัฟ มันเป็น oop อยู่แล้ว เว็ปที่เคยทำมาตอนเรียนก็มีแต่ jsp แต่พอมาทำงานกลับได้งานที่เป็น php เลยต้องหันมาศึกษา php ซะเยอะเลย แต่ผมก็ว่ามันก็ปรับเป็น oop ไม่ยากนะ เพราะ function มันก็มองเป็น method ใน java แต่เรื่องตัวแปรนี่ยังไม่ไหวอ่ะ มันไม่ครอบคลุม ถึงจะประกาศเป็น Global แล้วก็เหอะ
Date :
2011-07-27 14:14:57
By :
princefenris
ดีครับ เพิ่งลองเขียนเหมือนกัน ผมต้องเริิ่มนับหนึ่งเลย เป็นกระทู้ที่มีประโยชน์มากเลยครับ
Date :
2011-08-09 12:05:55
By :
nut1990
ไว้มีเวลาว่างเมื่อไหร่ ผมจะศึกษาการเขียนแบบ oop ทันทีครับ เพราะเคยเรียน Java มาตอนปี 2 ตอนนี้อยู่ปี 3 จะขึ้นปี 4 แล้ว
เรื่อง class, abstract, extent พวกนี้ก็พอเข้าใจอยู่ครับ น่าจะใช้เวลาศึกษาไม่นาน และโดยส่วนตัวคิดว่าการเขียนแบบ oop มีประโยชน์มากมาย เพราะมอองทุกอย่างเป็น object
Date :
2011-08-15 01:54:27
By :
fogza
ขอให้คุณ u สุขภาพแข็งแรง เอาความรู้มาแบ่งปันชาว thaicreate อีกนะครับ
Date :
2011-09-04 18:44:58
By :
noomthapla
ขอบคุณครับ
Date :
2011-09-05 07:30:32
By :
kalamell
ขอสอบถามหน่อยครับพี่
$this->page->setContent
-> 2 ครั้งแบบนี้
หมายความว่ายังไงหรอครับ
Date :
2011-09-05 17:00:03
By :
ramuna99
ตัวแปร $page ได้ถูกสร้างให้เป็น object ของ class เมื่อเรียกใช้จะเรียก
$this->page
ส่วน setContent ก็คือ propeties ใน class ที่ เวลาเรียกใช้ก็คือ
$this->page->setContent
คือ สั่งให้ page ไปทำการเรียก setcontent ที่อยู่ใน Class มาใช้งาน หากเป็น method หรืออาจจะคุ้นในชื่อ ของ function เราต้องใช้เป็น setContent() เป็นต้นครับ
ลองดูวีดีโอก็ได้ แล้วจะเข้าใจครับ
Date :
2011-09-06 12:58:34
By :
kalamell
ขอบคุณมากนะครับ
Date :
2011-09-06 13:32:24
By :
ramuna99
กำลังศึกษาอยู่พอดีเลยครับ เล่นเอาปวดหัวไปเลย
Date :
2011-10-12 14:49:34
By :
vampireza
ขอบคุณค่ะ
Date :
2011-10-28 21:01:52
By :
pattisier
กำลังฝึกเขียนอยู่เหมือนกันครับ
Date :
2011-11-01 10:45:39
By :
TonHaDy
พอมีตัวอย่างที่เขียนแบบ cakephp บ้างละป่าวครับ
Date :
2011-11-02 13:57:37
By :
matay107
น่าสนใจดีนะครับ
Date :
2011-11-07 15:14:04
By :
SheetCS
อยากเก่งเรื่อง php จัง ตอนนี้กำลังศึกษาอยู่เลยครับ ปต่ก็ขอบคุณครับ
Date :
2011-11-08 16:02:00
By :
directload
น่าสนใจมากครับ เดี๋ยวต้องไปลอง
Date :
2011-11-24 15:24:18
By :
sabudchor11
กำลังศึกษาอยู่พอดีเลยคร้าา
Date :
2011-12-06 11:59:17
By :
iibuu
http://gonzalo123.wordpress.com/2011/11/28/playing-with-the-new-php5-4-features/
<?php
$a = [1, 2, 3];
print_r($a);
?>
short array syntax !!!
Date :
2011-12-10 13:50:04
By :
num
Date :
2011-12-15 04:49:24
By :
วุ้น
กำลังเริ่มศึกษา php เลยครับ ^_^
Date :
2012-01-04 16:04:27
By :
nattapol.siri
ดิฉันเพิ่งหัดเขียน php แบบ OOP ค่ะ
ตอนนี้พบปัญหาดังนี้ค่ะ คือสับสนว่าเราควร นำ sql string พวก select , update, insert ไว้ใน class หรือ เอาไว้ที่หน้า form ดีคะ
Code (PHP)
--- itemList.php-----
include("DBConnect.php");
require("class_itemmaster.php");
$objItemList = new ItemList;
$conn = new DBConnect;
echo $objItemList->itemLoad(); // หรือ นำ code ใน class itemlist,function itemLoad มาไว้ที่นี่ดีคะ ???
----DBConnect.php-------
ob_start();
Class DBConnect
{
private $_host = "localhost";
private $_user = "root";
private $_pass = "1234";
private $_db = "test_db";
private function openDB()
{
$charset = "set names utf8";
$link = mysql_pconnect($this->_host, $this->_user, $this->_pass);
if (!$link) {
die('Could not connect to the server: ' . odbc_error());
}
$db_selected = mysql_select_db($this->_db, $link);
if (!$db_selected) {
die ('Could not connect to the database"' . $this->_db ." get error: " . mysql_error());
}
mysql_query($charset) or die('Invalid query: ' . mysql_error());
}
private function closeDB()
{
mysql_close($link);
}
public function return_sql($sql)
{
self::openDB();
$result = mysql_query($sql) or trigger_error("SQL", E_USER_ERROR);
if ($result){
$arrData = array();
while ($rows = mysql_fetch_array($result)) {
$arrData[] = $rows;
}
}else{
$message = 'This command of : ' . mysql_error() . " incorrect<BR />";
$message = mysql_error();
die($message);
}
return $arrData;
self::closeDB();
}
public function exe($sql)
{
self::openDB();
$result = mysql_query($sql);
if (!$result) {
$message = 'This command of : ' . mysql_error() . "incorrect<BR />";
die($message);
}
}
}
?><?php ob_end_flush();?>
--------class_itemmaster.php-----
class ItemList {
public $itemcode;
public $itemname;
public $unittype;
public $status;
public $remark;
public $createby;
public $sql;
public function DuplicateItem ($fitemcode,$fitemname,$funittype,$fstatus,$fremark,$fcreateby) {
$this->itemcode=$fitemcode;
$this->itemname=$fitemname;
$this->unittype=$funittype;
$this->status=$fstatus;
$this->remark=$fremark;
$this->createby=$fcreateby;
$conn = new DBConnect;
$sSql = "select * from itemmaster where itemcode ='$this->itemcode'";
$arrData = $conn->return_sql($sSql);
if ( $arrData=true) {
return "<script>alert('Duplicate Data !');</script>";
}
else {
AddNewItem($this->itemcode,$this->itemname,$this->unittype,$this->status,$this->remark,$this->createby);
}
}
public function AddNewItem ($fitemcode,$fitemname,$funittype,$fstatus,$fremark,$fcreateby) {
$this->itemcode=$fitemcode;
$this->itemname=$fitemname;
$this->unittype=$funittype;
$this->status=$fstatus;
$this->remark=$fremark;
$this->createby=$fcreateby;
$conn = new DBConnect;
$sSql = "Insert into itemmaster (ItemCode,ItemName,Unit,Status,Remark,Createby) VALUES ('$this->itemcode','$this->itemname','$this->unittype','$this->status','$this->remark','$this->createby')";
$arrData = $conn->exe($sSql);
return "<meta http-equiv='refresh'Content =0;URL='ItemList.php'>";
}
public function itemLoad () {
$conn = new DBConnect;
$sSql = "SELECT * FROM itemmaster";
$arrData = $conn->return_sql($sSql);
return $arrData; // จากตรงนี้จะ return ค่าเป็น ไปยัง form ยังงัยดีคะ หรือว่า ต้องสร้าง html แทรกไว้ใน class ที่นี่ดีคะ ??
// ถ้าสร้างที่นี่ /*
echo "<table width=200 border=1>";
echo " <tr><td cellpadding= 0 cellspacing=3 bgcolor=#99CCFF align=center class=style274>ItemCode</td>
<td cellpadding= 0 cellspacing=3 bgcolor=#99CCFF align=center class=style274>ItemName</td>
<td cellpadding= 0 cellspacing=3 bgcolor=#99CCFF align=center class=style274>Unit</td></tr>";
$j=0;
foreach($arrData as $row){ {
echo "<tr><td cellpadding= 0 cellspacing=1 bgcolor=#99CCFF>"; echo $row['ItemCode']; echo"</td>";
echo "<td cellpadding= 0 width=100 cellspacing=1 bgcolor=#99CCFF >"; echo $row['ItemName']; echo"</td>";
echo "<td cellpadding= 0 width=250 cellspacing=1 bgcolor=#99CCFF >"; echo $row['Unit']; echo"</tr></td>";
echo "<br\n>";
}echo "</table>";*/
}
public function itemCodeSearch ($fitemcode) {
$this->itemcode=$fitemcode;
$conn = new connectDB;
$sSql = "SELECT * FROM itemmaster WHERE ItemCode ='$this->itemcode' ";
$arrData = $conn->return_sql($sSql);
return "<meta http-equiv='refresh'Content =0;URL='ItemList.php'>";
}
}
รบกวนผู้รู้ทั้งหลายช่วยเข้ามาตอบด้วยค่ะ ตอนนี้มึนกับ OOP มั่กๆๆ หรือว่าจากลับไปเขียนแบบไม่ OOP ดีมั้ย???
ยังงัยรบกวน ช่วยยกตัวอย่างให้ดูได้มั้ยคะ
เื่ผื่อจะเข้าใจมากขึ้น
แล้วที่งงอีกอย่างก็คือ ถ้าเราเอา query string ไปไว้ในหน้า form (จริงๆต้องไว้ใน class?) แระมันจะเป็น OOP ตรงไหนค่ะ
หรือว่า php เขียน oop เฉพาะตอนติดต่อ database เท่าันั้นเหรอคะ
Date :
2012-01-22 10:09:30
By :
เนย
เขียน php อยู่ค่ะแต่ยังไม่เก่งเท่าไหร่ ขอบคุณกระทู้ดี ๆ และคำแนะนำดี ๆ ของทุก ๆ ท่านค่ะ เป็นประโยชน์มาก ๆ เลย ^^
Date :
2012-01-23 16:59:22
By :
nuch-ja
อยากได้โค้ด วาลิเดทพวก เทคบอกซ์ อ่ะคะ พวกที่ใช้กับฟอร์มสมัครสมาชิกอ่ะค่ะ เคยมีเอกสารอยู่ แต่มันเสียหายไปตอนที่น้องงน้ำมาเยี่ยม
พี่กรุงอ่ะคะ จำได้ว่ามันเป็นจาวาสคริป ไม่ยากเท่าไหร่ แต่ก็จำไม่ได้แล้วอ่ะคะ เพราะมีช่วงที่เปลี่ยนไปเขียน VB.NET อยู่พักหนึ่งอ่ะคะ
ท่านผู้รู้ ช่วยหน่อยนะคะ
Date :
2012-02-23 13:01:43
By :
จุ๊
JQUERY สิครับ มีอยู่
Date :
2012-02-24 16:39:42
By :
ALTELMA
มือใหม่เข้ามาเปิดกะโหลกครับ สุดยอดมากๆ
Date :
2012-03-09 17:57:21
By :
maxsaag
ดีจริงๆๆค่ะ
Date :
2012-04-08 10:08:44
By :
pampam1999
มีความรู้ดีครับ
ศึกษาไว้ เอาไปประยุกต์ในโปรเจ็ค ^^
Date :
2012-04-09 10:47:11
By :
rootElement@kmutnb
สิ่งดีๆ ที่ควรปักหมุดมาก
ประวัติการแก้ไข 2012-04-12 11:07:02
Date :
2012-04-11 19:36:59
By :
khemkiki
เเจ๋วๆๆเลย ครับ พี่ๆๆๆ
Date :
2012-04-11 20:18:24
By :
eiei4749
ดีมากเลยครับ
Date :
2012-04-19 10:30:12
By :
reekoong
ผมเอา php oop ไปเขียนแบบว่าใช้เป็น คำสั่งทำงานกับฐานข้อมูลซะเป็นส่วนใหญ่เพื่อให้ง่ายต่อการเรียกใช้งาน ไม่รู้มาถูกทางเปล่า พอดีไปลองดู Codeigniter แล้วเห็นการเรียกใช้ฟังก์ชั่นต่างๆแล้ว เลยลองเอามาปรับให้เป็นแบบของผมดู
อย่างการ Insere ลงฐานข้อมูลผมเขียน คาสไว้แบบนี้
Code (PHP)
public function get($sql){
//ส่งคำสั่ง sql ไปทำการ query กับฐานข้อมูลแล้ว ส่งค่ากับเป็น true หรือ false
$resultData = mysql_query($sql,$this->con);
if($resultData)
return true;
else
return false;
}
public function insert($tb,$data,$strwhere=""){
//ฟังก์ชั่น insert ข้อมูล และส่งกลับค่าออกไปเป็น true และ false
//การส่งข้อมูลเข้ามาต้องส่งเป็น array เข้ามา
$fieldtb = "(";
$datatb= "(";
$countArrayData = count($data);
$numcheck = 1;
foreach($data as $field => $data)
{
if($countArrayData==$numcheck){
$fieldtb .= $field.")";
$datatb .= "'".$data."')";
}else{
$fieldtb .= $field.", ";
$datatb .= "'".$data."', ";
}
$numcheck++;
}
if($strwhere=="")
$query = "INSERT INTO {$tb}{$fieldtb} VALUES{$datatb};";
else
$query = "INSERT INTO {$tb}{$fieldtb} VALUES{$datatb} WHERE {$strwhere};";
return $this->get($query);
}
Date :
2012-07-09 15:26:23
By :
thekknd
เห็นด้วยครับ แต่ลอง ADODB ดีกว่าครับง่ายกว่าเยอะเลย
ผมว่าหา Framework มาเล่นด้วยดีไหมครับ
Date :
2012-07-09 18:36:59
By :
kongoon
ประวัติการแก้ไข 2012-07-16 12:25:50
Date :
2012-07-16 12:24:48
By :
jutathipphp
ช่วยได้เยอะมากๆ เลยครับ
Date :
2012-09-03 21:20:20
By :
jeerawat
Date :
2012-09-07 14:03:32
By :
korn
ใครอยากเห็น production ที่ใช้ php oop แบบของจริง และยังเป็น Framework ให้เราพัฒนาต่อได้ ลองศึกษา SugarCRM ครับ
SugarCRM เป็น Web App ที่พัฒนาเพื่องานธุรกิจอย่างแท้จริง อีกทั้งยังมีเวอร์ชั่น Open Source ที่ผมกล้าพูดเพราะมันคือ Product ตัวหนึ่งที่บริษัทของผมพัฒนาอยู่ มี Lib ให้ครบครันเลยครับ
แนวคิดของเขาก็คือ Modular ครับ โดยแต่ละโมดูลจะเป็นตัวแทนของแต่ละ Class เช่น คลาส Account และ Contact สืบทอดมาจาก Person ซึ่งจะมี property เหมือนกัน, คลาส Currency จะมี method ที่เกี่ยวข้องกับการแปลงค่าเงิน, คลาส TimeDate ไว้คอยจัดการวันที่เวลา เป็นต้น
Date :
2012-09-07 22:05:31
By :
bankjetdo
/*
CREATE TABLE `tbcontact` (
`id` INT(4) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
ENGINE=MyISAM
*/
//configuration
$dbname = 'test';
$user = 'root';
$pass = '';
try{
//connect
$db = new PDO("mysql:host=localhost;dbname=$dbname;", $user, $pass, array(
PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES UTF8'
));
}catch (Exception $e){
echo 'error:'.$e->getMessage();
}
//insert
$stmt = $db->prepare('insert into tbcontact(name) values(:name)');
$stmt->bindValue(':name','nobita');
$stmt->execute();
$info = $stmt->errorInfo();
if ($info[0]=='0000')
echo 'no error';
else
echo 'error: '.$info[2];
//select
echo '<hr /><h1>FETCH TO OBJECT</h1>';
$stmt = $db->query('SELECT id,name from tbcontact',PDO::FETCH_OBJ);
foreach($stmt as $row) {
echo $row->id,'...',$row->name,'<br','>';
}
echo '<hr /><h1>FETCH TO ARRAY</h1>';
$stmt = $db->query('SELECT id,name from tbcontact',PDO::FETCH_ASSOC);
while($row = $stmt->fetch()) {
echo $row['id'],'...',$row['name'],'<br','>';
}
echo '<hr /><h1>FETCH TO VARIABLE</h1>';
$stmt = $db->query('SELECT id,name from tbcontact',PDO::FETCH_BOUND);
$stmt->bindColumn('id',$id);
$stmt->bindColumn('name',$name);
while($row = $stmt->fetch()) {
echo $id,'...',$name,'<br','>';
}
echo "column count = {$stmt->columnCount()}, row count= {$stmt->rowCount()}";
class pdo เป็น class หลักของ php ที่ใช้ในการต่อ database
dbms อย่างเช่น sqlite mysql odbc mssql oracle ฯลฯ สลับไปมาค่อนข้างสะดวก
เนื่องจากทุกตัวใช้คำสั่งใน class php pdo เหมือนกันหมดครับ
http://web-programming-bookmark.blogspot.com/2012/09/php-pdo.html
Date :
2012-09-09 21:25:42
By :
num
หนู กำลังเขียนอยู่เลย
Date :
2012-10-12 14:44:22
By :
chanajun
ขอคุณคับCode (PHP)
[pre][/pre]
Date :
2012-10-16 02:09:00
By :
direkutong
ว่าจะลองเขียนหลายทีแล้ว
แต่ไม่มีเวลาซักที งานหน้าต้องลองใช้ดู
(ถ้ามันไม่เร่งนะ)
Date :
2012-10-16 02:10:08
By :
direkutong
รบกวนด้วยนะค่ะ ต้องกาเก็บค่า $emp_fnm_thai จาก private static function SetFnmThai($emp_id) ไว้ใน public static function GetFnmThai() มีวิธีการทำยังไงค่ะ
<meta http-equiv="Content-Type" content="text/html; charset=window-874" />
<?PHP
include ("../../annai/class/conn.php");
class Employee {
private static $emp_id;
private static $emp_fnm_thai;
private static function Class_Initialize(){
$emp_id = "";
$emp_fnm_thai = "";
}
public static function SetEmpID ($emp_str){
$emp_usr = new Employee;
$emp_id = $emp_str;
$emp_usr ->SetFnmThai($emp_id);
}
private static function SetFnmThai($emp_id){
$sqlemp = "";
$sqlemp = "Select UD_USR_FNM from COM_USR_DTLS where UD_USR_ID = '$emp_id'";
$queryemp = mysql_query($sqlemp) or die ("error $sqlemp");
$rowemp = mysql_fetch_array($queryemp);
$emp_fnm_thai = $rowemp['UD_USR_FNM'];
}
public static function GetFnmThai(){
ต้องการเก็บค่า $emp_fnm_thai จาก SetFnmThai(); ในนี้
}
}
?>
Date :
2012-11-16 16:56:19
By :
rilakkuma
โอ้ยมีแต่คนเก่ง
มือสมัครเล่นอย่างเรา
เศร้าเลย___T_T
Date :
2012-11-23 21:12:37
By :
เหลนไฟ
ไม่หรอกครับ ลองๆ ดูไว้ไม่เสียหาย ครับ สนุกดีผมว่า ^ ^
Date :
2012-12-13 09:52:17
By :
ALTELMA
Code (PHP)
<?PHP
include('../../annai/class/conn.php');
class Employee
{
private static $emp_id;
private static $emp_fnm_thai;
private static function Class_Initialize()
{
$emp_id = '';
$emp_fnm_thai = '';
}
public static function SetEmpID($emp_str)
{
$emp_usr = new Employee;
$emp_id = $emp_str;
$emp_usr->SetFnmThai($emp_id);
}
private static function SetFnmThai($emp_id)
{
$sqlemp = '';
$sqlemp = 'Select UD_USR_FNM from COM_USR_DTLS where UD_USR_ID = \''.$emp_id.'\'';
$queryemp = mysql_query($sqlemp) or die('error '.$sqlemp.'');
$rowemp = mysql_fetch_array($queryemp);
self::$emp_fnm_thai = $rowemp['UD_USR_FNM'];
}
public static function GetFnmThai()
{
return self::$emp_fnm_thai;
}
}
?>
จาก NO.411 ประมาณนี่เปล่าครับ
Date :
2013-05-06 19:27:23
By :
atoms18
พี่ ๆ ครับ :: ใช้ยังไง เอาไว้ทำอะไรครับ ผมเขียนแบบเก่า ไม่เคยเจอเลย ขอบคุณครับ
ขออธิบายแบบภาษาชาวบ้านนะครับ ผมเด็กใหม่ จบ ไอที เพิ่งเริ่มหัดเขียน OOP ครับ
Date :
2014-11-07 09:33:15
By :
tumjuk
มาดูดความรู้ แนว OOP แต่เขียน connect select,insert,delete,update ได้
แต่ยังเขียนเป็น แบบ Class ไม่ได้ สงสัยต้องเรียนรู้ต่อไป ขอบคุณความรู้ดีๆทุกท่านน่ะครับ
ประวัติการแก้ไข 2018-09-13 08:35:18
Date :
2018-09-10 11:08:12
By :
Hararock
ผ่านมา 9 ปีแล้ว ยังมีคนสนใจขุดกระทู้ขึ้นมาอีก ^^
ป่านนี้หลายๆคนคงเขียน OOP ไปกันไกลมากแล้ว
ผมดีใจนะครับที่ช่วยจุดประกายเล็กๆ ให้กับหลายๆ คนหันมาเขียนแบบ OOP
แต่เทคโนโลยีตอนนี้ไปไกลมากแล้ว อย่ายึดติดกับอะไรเก่าๆ กันนะครับ
ผมเองก็เปลี่ยนเส้นทางชีวิตไปสาย data แทนสาย web สักพักใหญ่ๆ แล้ว
ถ้ามีอะไรที่ผมพอช่วยได้ หรือให้ไกด์ให้เห็นภาพได้ ผมก็ยินดีนะครับ
หรือถ้าจะหางานให้ผม เชิญหลังไมค์เลยครับ 555
Date :
2018-09-12 21:32:14
By :
nut_t02
ครับผม ความรู้ในที่นี้ https://www.thaicreate.com ผ่านไปกี่ปี ไม่น่าจะหาย แต่ถ้าเขียนใส่กระดาษ คงย่อยสลาย ตามการเวลา ขอบคุณครับ ที่แบ่งปั่นความรู้
Date :
2018-09-13 08:40:12
By :
Hararock
อยากจะเขียน OOP จริงๆ ไป java หรือ c# เลยดีกว่าครับ
Date :
2018-09-13 10:53:05
By :
DK
Load balance : Server 01