Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,038

HOME > PHP > PHP Forum > อยากทราบวิธีการใช้ class แบบเหมือน extends แต่ไม่ได้ extends



 

อยากทราบวิธีการใช้ class แบบเหมือน extends แต่ไม่ได้ extends

 



Topic : 036771



โพสกระทู้ ( 4,759 )
บทความ ( 8 )



สถานะออฟไลน์




ตัวอย่าง
ผมมีไฟล์ html.php
Code (PHP)
class html {
	// คลาสนี้เป็นตัวหลักที่จะถูกเรียก
}


แล้วก็มีกำหนด config ไปใช้งานแบบ global ว่า $cfg['html_ver'] = "html4";

แล้วก็มีไฟล์ html4.php
Code (PHP)
class html4 {
	public function br($option='') {
		return "<BR>";
	}
}


ผมอยากทำแบบว่าเรียกใช้
Code (PHP)
$html = new html();
echo $html->br();

แล้วได้ <BR> ออกมา โดยไม่ต้องใช้ extends

เพราะถ้า extends ผู้ใช้จะต้องแก้โค้ดทุกจุดเมื่อตัดสินใจเปลี่ยนเวอร์ชั่น html
แต่นี่ผมให้กำหนด cfg ไว้จุดเดียว คลาส html จะเลือกเอาไฟล์ตามที่กำหนดเอง
จะทำได้ยังไงบ้างครับ?

ผมไปโหลด php thumbnailer http://phpthumb.gxdlabs.com/
มันมี plugin reflection ด้วย การใช้งานก็ไม่ต้อง extends เช่นเดียวกัน
http://wiki.github.com/masterexploder/PHPThumb/plugins-gd-reflection
เลยคิดว่าเอามาทำ html class น่าจะได้ แต่มันไม่ง่ายเลย

สคริปชุดนี้ถ้าทำได้ทำเสร็จแล้วจะเอามาแจกครับ



Tag : - - - -







Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2010-01-09 18:37:34 By : mr.v View : 1866 Reply : 7
 

 

No. 1



โพสกระทู้ ( 4,759 )
บทความ ( 8 )



สถานะออฟไลน์


อ้อ ผมลอง public function __call($name, $arg) แล้วนะครับ
มันก็ใช้ได้ ถ้า $html->br(); ตัวเดียวเฉยๆ

แต่ถ้ามี $html->br(); หลายๆตัว หรือ $html->br(array('class'=>'clear'));
มันจะกลายเป็น array แทนที่จะออกมาเป็น <BR class="clear">

__call() ใช้ไม่ได้ผลครับ






Date : 2010-01-09 18:40:37 By : mr.v
 


 

No. 2



โพสกระทู้ ( 1,463 )
บทความ ( 1 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Twitter Blogger

ผมใช้แบบนี้ครับ
<?php
    $HTML_CLASS = 'H1';
    abstract class H{
        /**
         * print Class name
         */
        abstract function e();
        /**
         * @return string Class name
         */
        abstract function r();
    }
    class H1 extends H{
        function e(){echo 'H1';}
        function r(){return 'H1';}
    }
    class H2 extends H{
        function e(){echo 'H2';}
        function r(){return 'H2';}
    }
    /**
     *
     * @global string $HTML_CLASS
     * @return H
     */
    function html(){
      global $HTML_CLASS;
      return new $HTML_CLASS;
    }
    $h = html();
    $h->e();
?>

Date : 2010-01-09 19:16:52 By : num
 

 

No. 3



โพสกระทู้ ( 4,759 )
บทความ ( 8 )



สถานะออฟไลน์


เดี๋ยวคืนนี้กลับมาลองครับ ขอบคุณไว้ก่อน
Date : 2010-01-09 19:21:53 By : mr.v
 


 

No. 4

Guest


อีกแบบนึงครับ
<?php
    $HTML_CLASS = 'H1';
    class H{
        private $obj;
        public function __construct() {
            global $HTML_CLASS;
            $this->obj = new $HTML_CLASS;
        }
        /*
        public function e(){
            $args=func_get_args(); return call_user_method_array(__FUNCTION__,$this->obj,$args);
        }
        public function r(){
            $args=func_get_args(); return call_user_method_array(__FUNCTION__,$this->obj,$args);
        }
        public function p($s){
            $args=func_get_args(); return call_user_method_array(__FUNCTION__,$this->obj,$args);
        }
        */
        public function __call($name, $params){
            call_user_method_array($name, $this->obj, $params);
        }
    }
    class H1 extends H{
        public function  __construct(){}
        public function e(){echo 'H1';}
        public function r(){return 'H1';}
        public function p($s){echo $s.'__H1';}
    }
    class H2 extends H{
        public function  __construct(){}
        public function e(){echo 'H2';}
        public function r(){return 'H2';}
        public function p($s){echo $s.'__H2';}
    }
    $h = new H();
    $h->e();
    $h->p('ddd');
?>

Date : 2010-01-09 20:28:17 By : num
 


 

No. 5



โพสกระทู้ ( 4,759 )
บทความ ( 8 )



สถานะออฟไลน์


ตัวอย่างล่างไม่เวิร์คอะครับ มันเงียบหายไปเลยแล้วก็ขึ้น The connection was reset

ตัวอย่างแรกจะติดตรงที่ ต้องสร้าง function เหมือนๆกันในทุกๆ class html



ดูโค้ดอีกที
Code (PHP)
class html {
	private $tag;
	
	public function __construct() {
		global $cfg;
		$this->tag = new $cfg['html_ver']; // ควรเป็น new html4;
	}// __construct
	
	public function __call($name, $arguments) {
		global $cfg;
		call_user_method_array($name, $this->tag, $arguments);
		//return $newhtml->$name($arguments);
	}// __call
	
}

html.php

Code (PHP)
class html4 extends html {
	
	/**
	* ทุกๆ function $option ให้ใส่เป็นแบบ array เช่น $html->tag(array('class'=>'classname'));
	*/
	public function br($option='') {
		$output = "<BR";
		if ($option != null) {
			foreach ($option as $attr=>$val) {
				$output .= " ".$attr."=\"".$val."\"";
			}
		}
		$output .= ">";
		return $output;
	}// br

html4.php

เขียน $html = new html();
echo $html->br();

เดี้ยงเลยครับ
Date : 2010-01-09 22:17:26 By : mr.v
 


 

No. 6



โพสกระทู้ ( 1,463 )
บทความ ( 1 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Twitter Blogger

ประกาศ public function __construct(){} ใน class html4 ครับ ถ้าไม่ประกาศมันจะ recursive ครับ


ดูอีกที html4 ไม่จำเป็นต้อง extends html ครับ ผมเขียนเกินไปครับ

ตรง
call_user_method_array($name, $this->tag, $arguments);
แก้นิดนึงเป็น
return call_user_method_array($name, $this->tag, $arguments);

จะทำให้ใช้งาน function return ได้ครับ
Date : 2010-01-09 22:59:28 By : num
 


 

No. 7



โพสกระทู้ ( 4,759 )
บทความ ( 8 )



สถานะออฟไลน์


จ๊าบบบบ ใช้ได้แล้ว (เท่าที่ลองดูหลายๆแบบนะ <br> <br id="id"> ,...)
ขอบคุณคร้าบ

return call_... ผมก็กำลังจะมาบอกพอดี
Date : 2010-01-09 23:56:09 By : mr.v
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : อยากทราบวิธีการใช้ class แบบเหมือน extends แต่ไม่ได้ extends
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 04
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2025 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่