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,037

HOME > PHP > PHP Forum > โค๊ดผมเรียก fn ภายใต้คลาสเดียวกันทำไมใช้ $this-> ไม่ได้ต้องใช้ชื่อคลาสแทน



 

โค๊ดผมเรียก fn ภายใต้คลาสเดียวกันทำไมใช้ $this-> ไม่ได้ต้องใช้ชื่อคลาสแทน

 



Topic : 108891



โพสกระทู้ ( 52 )
บทความ ( 0 )



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




สงสัย อยากเคลียร์ครับ สอบถามว่าทำไม เรียก fn ภายใต้คลาสเดียวกันทำไมใช้
$this-> แทนชื่อคลาสไม่ได้ RTypeController:: Line 14-15 รันแล้วหน้าเว็บมันทำงานได้ถึงจุดที่เรียกโค๊ดแล้วหยุด error ไม่โชว์
แต่ดูใน firebug มันขึ้นว่า Network error ต้องมาใช้ชื่อคลาสแทน $this
ปล. ผมเพิ่งหัดใช้ Yii Framework เรียกจากหน้า View ใน cGridview

Code (PHP) หน้า Controller
<?php
class RTypeController extends Controller
{
	/**
	 * @var string the default layout for the views. Defaults to '//layouts/column2', meaning
	 * using two-column layout. See 'protected/views/layouts/column2.php'.
	 */
	public $layout='//layouts/column2';

    /* ImageLink open Popup FancyBox */
    public static function imgFancy($targetID,$path){
        if($path!=''){
            //  ทำไมใช้ $this-> แทน RTypeController:: ไม่ได้
            $link = RTypeController::fancyLink_img($targetID, $path);
            $link .= RTypeController::fancyContent_img($targetID, $path);
        }else $link='no image';
        return $link;
    }
    /* Link open FancyBox */
    public static function fancyLink_img($targetID,$path){
        if($path!=''){
            $image = CHtml::image($path,NULL,array("class"=>"fancy-thumb"));
            $link = CHtml::link($image, '#'.$targetID,array("class"=>"fancy-click"));
        }else $link='no image';
        return $link;
    }
    /* Content in FancyBox */
    public static function fancyContent_img($targetID,$path){
        if($path!=''){
            $image = CHtml::image($path,NULL,array('id'=>$targetID,"class"=>"fancy-content"));
        }else $image='no image';
        return $image;
    }

    public function render_RTypeNum($data,$row){
        // Find the number of "RTypeID" RDetail:
        // SELECT COUNT(*) FROM h_rdetail WHERE RTypeID= $data->RTypeID
        $criteria = new CDbCriteria();
        $criteria->condition = 'RTypeID='.$data->RTypeID;
        $count = RDetail::model()->count($criteria);

        return $data->RTypeName." ($count) ";
    }

	public function filters()
	{
		return array(
			'accessControl', // perform access control for CRUD operations
			'postOnly + delete', // we only allow deletion via POST request
		);
	}

	public function accessRules()
	{
		return array(
			array('allow',  // allow all users to perform 'index' and 'view' actions
				'actions'=>array('index','view'),
				'users'=>array('*'),
			),
			array('allow', // allow authenticated user to perform 'create' and 'update' actions
				'actions'=>array('create','update'),
				'users'=>array('@'),
			),
			array('allow', // allow admin user to perform 'admin' and 'delete' actions
				'actions'=>array('admin','delete'),
				'users'=>array('admin'),
			),
			array('deny',  // deny all users
				'users'=>array('*'),
			),
		);
	}

	public function actionView($id)
	{
		$this->render('view',array(
			'model'=>$this->loadModel($id),
		));
	}


	/**
	 * Lists all models.
	 */
	public function actionIndex()
	{
		$dataProvider=new CActiveDataProvider('RType');
		$this->render('index',array(
			'dataProvider'=>$dataProvider,
		));
	}

	/**
	 * Manages all models.
	 */
	public function actionAdmin()
	{
		$model=new RType('search');
		$model->unsetAttributes();  // clear any default values
		if(isset($_GET['RType']))
			$model->attributes=$_GET['RType'];
        
		$this->render('admin',array(
			'model'=>$model,
		));
	}

	public function loadModel($id)
	{
		$model=RType::model()->findByPk($id);
		if($model===null)
			throw new CHttpException(404,'The requested page does not exist.');
		return $model;
	}

	protected function performAjaxValidation($model)
	{
		if(isset($_POST['ajax']) && $_POST['ajax']==='rtype-form')
		{
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}
	}
}


Code (PHP) หน้า View
$this->widget('zii.widgets.grid.CGridView', array(
	'id'=>'rtype-grid',
	'dataProvider'=>$model->search(),
	'filter'=>$model,
//    'afterAjaxUpdate'=>'function(){fancy();}',
	'columns'=>array(
        array(
			'name'=>'RTypeID',
            'htmlOptions'=>array('width'=>'20px', 'style'=>'text-align:center'),
		),
        array(
			'name'=>'RTypeName',
            'type'=>'raw',
            'header'=>RType::model()->attributeLabels()['RTypeName'].' (จำนวนห้อง)',
            'value'=>array($this,'render_RTypeNum'),
		),
        array(
			'name'=>'RTypeDetail',
            'type'=>'raw',
            'htmlOptions'=>array('width'=>'300px'),
		),
        array(
			'name'=>'Rcustnum',
            'htmlOptions'=>array('width'=>'30px', 'style'=>'text-align:center'),
		),
        array(
			'name'=>'RPictures',
            'type'=>'raw',
            'value'=>'$this->imgFancy("fancy".$row,$data->RPictures)',
            'htmlOptions'=>array('width'=>'70px', 'style'=>'text-align:center'),
		),
		array(
			'name'=>'PriceDefault',
            'htmlOptions'=>array('width'=>'70px', 'style'=>'text-align:right'),
		),
	array(
			'class'=>'CButtonColumn',
            'header'=>CHtml::link('Reset', array('')),
		),
	),
)); 


Code (PHP)
//เช่นกันใช้ $this ไม่ได้
'value'=>'$this->imgFancy("fancy".$row,$data->RPictures)',
//ต้องเรียกแบบนี้
'value'=>'RTypeController::imgFancy("fancy".$row,$data->RPictures)',
//แต่ถ้าเรียกแบบนี้ได้ 
'value'=>array($this,'imgFancy'),

ขอบคุณล่วงหน้าครับ



Tag : PHP, Windows, Linux, Web Hosting









ประวัติการแก้ไข
2014-06-04 17:21:06
2014-06-04 17:23:08
Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2014-06-04 17:19:25 By : Giguntic View : 1811 Reply : 9
 

 

No. 1



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



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

$this->RTypeController->imgFancy

ผมเรียกแบบนี้แฮะใน codeignitor






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-06-04 17:23:19 By : progamer2000
 


 

No. 2



โพสกระทู้ ( 52 )
บทความ ( 0 )



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


คือที่ผมไม่เคลียร์คือ ถ้าไม่อ้างอิงจาก Framework เอาแค่ syntax Object class PHP
เวลาจะเรียกใช้ fn ที่อยู่ภายในคลาสเดียวกันมันให้ใช้ $this-> แล้วตามด้วยชื่อ fn นี่นา
แต่ถ้าอยู่นอกคลาสต้องประกาศ instance มันก่อนเช่น objRTC = new RTypeController; แล้วเอา objRTC มาเรียกใช้แทน
แต่ถ้าประกาศเป็น static method จะเรียกใช้งานได้โดยไม่ต้องสร้าง instance แต่เรียกจาก ClassName::MethodName


ประวัติการแก้ไข
2014-06-04 19:48:37
2014-06-05 09:37:45
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-06-04 19:47:43 By : Giguntic
 

 

No. 3

Guest


ศึกษาพื้นฐาน OOP ใน PHP ก่อนไปใช้ framework ก็ดีนะครับ
ลองสังเกตดูฟังก์ชั่นที่ต้องเรียกด้วย :: คือ static function (มี static ตรงส่วนประกาศ function)
function เหล่านี้เป็นของ class ไม่ใช่ของ instance
ซึ่ง instance คือ object ที่ได้จากการ new
เช่น


Code (PHP)
$o = new SomeClass(); // $o เป็น instance ของ SomeClass
$o->someMethod(); // เรียกใช้ function ที่ไม่ได้เป็น static
SomeClass::someStaticMethod(); // เรียกใช้ function ที่เป็น static


ซึ่ง $this จะสามารถใช้ได้ใน body ของ function ที่ไม่ใช่ static เท่านั้น
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-06-04 20:35:38 By : .
 


 

No. 4



โพสกระทู้ ( 52 )
บทความ ( 0 )



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


ตอบความคิดเห็นที่ : 3 เขียนโดย : . เมื่อวันที่ 2014-06-04 20:35:38
รายละเอียดของการตอบ ::
ขอบคุณครับสำหรับคำอธิบายเข้าใจได้ชัดเจนดี ทำให้นึกอ๋อขึ้นมาได้ oop ผมไม่ค่อยได้เขียนนานมันเลยจำค่อยไม่แม่น
แต่จริงๆผมได้ลองแล้วครับทั้งแบบมีคำว่า static และไม่มี มันก็ยังไม่ได้อยู่ดีครับ มันเลยเป็นเหตุให้ผมสงสัยว่าทำไมมันขัดกับทฤษฎี ผมเขียนผิดตรงไหน
Code (PHP)
    public static function imgFancy($targetID,$path){
        if($path!=''){
            $link = $this->fancyLink_img($targetID, $path);
            $link .= $this->fancyContent_img($targetID, $path);
        }else $link='no image';
        return $link;
    }
    /* Link open FancyBox */
    public function fancyLink_img($targetID,$path){
        if($path!=''){
            $image = CHtml::image($path,NULL,array("class"=>"fancy-thumb"));
            $link = CHtml::link($image, '#'.$targetID,array("class"=>"fancy-click"));
        }else $link='no image';
        return $link;
    }
    /* Content in FancyBox */
    public function fancyContent_img($targetID,$path){
        if($path!=''){
            $image = CHtml::image($path,NULL,array('id'=>$targetID,"class"=>"fancy-content"));
        }else $image='no image';
        return $image;
    }


แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-06-05 09:25:59 By : Giguntic
 


 

No. 5



โพสกระทู้ ( 52 )
บทความ ( 0 )



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


ตอบความคิดเห็นที่ : 3 เขียนโดย : . เมื่อวันที่ 2014-06-04 20:35:38
รายละเอียดของการตอบ ::
SomeClass::someStaticMethod(); // เรียกใช้ function ที่เป็น static

แถมไม่เป็น static มันก็ยังทำงานได้ นี่ก็งงเหมือนกันครับ หรือเป็นเพราะมันเรียกจากในคลาส
ก็จะกลับไปที่คำถามแรกว่าแล้วทำไมเรียกจากในคลาส ของผมใช้ $this-> กับ method ที่ไม่ได้ประกาศ static ไม่ได้
Code (PHP)
    public static function imgFancy($targetID,$path){
        if($path!=''){
            $link = RTypeController::fancyLink_img($targetID, $path);
            $link .= RTypeController::fancyContent_img($targetID, $path);
        }else $link='no image';
        return $link;
    }
    /* Link open FancyBox */
    public function fancyLink_img($targetID,$path){
        if($path!=''){
            $image = CHtml::image($path,NULL,array("class"=>"fancy-thumb"));
            $link = CHtml::link($image, '#'.$targetID,array("class"=>"fancy-click"));
        }else $link='no image';
        return $link;
    }
    /* Content in FancyBox */
    public function fancyContent_img($targetID,$path){
        if($path!=''){
            $image = CHtml::image($path,NULL,array('id'=>$targetID,"class"=>"fancy-content"));
        }else $image='no image';
        return $image;
    }

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-06-05 09:31:46 By : Giguntic
 


 

No. 6

Guest


method ที่ไม่ใช่ static สามารถเรียกในรูป static ได้ในกรณีที่ไม่มีการอ้างอิง $this ใน body ของ function เลย

Code (PHP)
public function abc() {
    return 1;
}


สมมติว่า function ข้างบนเป็นของคลาส XXX และสมมติว่า $xxx เป็น instance ของมัน
จะเรียก XXX::abc() หรือจะ $xxx->abc() หรือแม้แต่ $xxx::abc() ก็ได้ เพราะมันไม่มีการอ้างอิง $this ในนั้น
ถึง function แบบนี้แม้จะเรียกแบบไหนก็ได้ (แต่จริงๆ context มันไม่เหมือนกัน) แต่เพื่อความชัดเจนและไม่สับสน
:: ควรใช้กับ static method ส่วน -> ควรใช้กับ instance method

แล้วถ้าถามว่าทำไมใช้ $this-> กับ method ที่ไม่ได้ประกาศ static ไม่ได้
ใช้ได้ครับ แต่มันคงผิดตอนคุณเรียกใช้มัน


Code (PHP)
public function abc() {
    return $this;
}


ข้างบน ถ้าคุณเรียก $xxx->abc() อันนี้มันได้แน่นอน เพราะ $this จะชี้ไปที่ $xxx (คือ instance)
แต่ถ้าคุณเรียกในแบบ static ด้วย :: เช่น XXX::abc() หรือ $xxx::abc()
จะเป็นการเรียกใน context ของ class ไม่ใช่ของ instance และจะทำให้ $this ใน body ของ function ไม่มีตัวตน

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-06-05 10:45:29 By : .
 


 

No. 7



โพสกระทู้ ( 52 )
บทความ ( 0 )



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


ตอบความคิดเห็นที่ : 6 เขียนโดย : . เมื่อวันที่ 2014-06-05 10:45:29
รายละเอียดของการตอบ ::
ผมอ่านแล้วยัง งงๆนะครับ แต่คือผมเรียกจากในคลาสตัวมันเองเลย แถมผมยังเรียกจากใน body ของ function ด้วย

ซึ่งในหนังสือมันก็บอกว่า $this จะสามารถใช้ได้ใน body ของ function ที่ไม่ใช่ static
แต่ของผมก็ทำตามนั้นแล้วแต่ทำไมมันไม่ได้ แต่อีก fn ในคลาสเดียวกัน fn ของเฟรมเวริค์ มันทำได้

ทั้ง 2 fn ( imgFancy , fancyLink_img ) นี้ผมเขียนเพิ่มมาเอง
ใน Line 10 ผมใช้ $this เรียก fn Line 15 ไม่ได้
แต่ fn actionView และ loadModel ในคลาสเดียวกันมันเรียกด้วย $this ได้
Line 28 ใช้ $this เรียก fn Line 32 ได้
ผมก็สงสัยว่าทำไมมันไม่ตรงกับทฤษฎีที่ syntax บอก ก็คิดว่าผมเขียนผิดแต่ก็หาไม่เจอว่าผิดตรงไหน

Code (PHP) หน้า Controller
<?php
class RTypeController extends Controller
{
	public $layout='//layouts/column2';

    /* ImageLink open Popup FancyBox */
    public static function imgFancy($targetID,$path){
        if($path!=''){
            //  ทำไมใช้ $this-> แทน RTypeController:: ไม่ได้
            $link = $this->fancyLink_img($targetID, $path);    //  <=== ใช้ $this เรียก fn fancyLink_img ข้างล่างได้
        }else $link='no image';
        return $link;
    }
    /* Link open FancyBox */
    public function fancyLink_img($targetID,$path){
        if($path!=''){
            $image = CHtml::image($path,NULL,array("class"=>"fancy-thumb"));
            $link = CHtml::link($image, '#'.$targetID,array("class"=>"fancy-click"));
        }else $link='no image';
        return $link;
    }

/*  fn ข้างบนผมเขียนเอง ใช้ $this เรียกไม่ได้ ส่วน fn ข้างล่างเป็นของ Framework Generate ใช้ $this เรียกได้  */

	public function actionView($id)
	{
		$this->render('view',array(
			'model'=>$this->loadModel($id),   //  <=== ใช้ $this เรียก fn loadModel ข้างล่างได้
		));
	}

	public function loadModel($id)
	{
		$model=RType::model()->findByPk($id);
		if($model===null)
			throw new CHttpException(404,'The requested page does not exist.');
		return $model;
	}
}



ประวัติการแก้ไข
2014-06-05 17:51:02
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-06-05 17:45:03 By : Giguntic
 


 

No. 8

Guest


ก็เพราะมันเป็น static ไงครับ
ผมอธิบายไม่ชัดเจนเหรอครับ ผมบอกไว้ตั้งแต่ No3 แล้ว
"ซึ่ง $this จะสามารถใช้ได้ใน body ของ function ที่ไม่ใช่ static เท่านั้น"
และ function imgFancy ของคุณมันเป็น static มันถึงใช้ $this ไม่ได้ไงครับ
ไม่เกี่ยวกับว่าถ้าเรียกใน class แล้วจะใช้ $this ได้ทุกที่นะครับ ผมอธิบายไว้หมดแล้ว ลองอ่านให้ละเอียดๆ ครับ
หรือถ้าไม่เข้าใจจริงๆ ก็หาหนังสือมาอ่านสักเล่มครับ

public static function imgFancy($targetID,$path){ if($path!=''){ // ทำไมใช้ $this-> แทน RTypeController:: ไม่ได้ $link = $this->fancyLink_img($targetID, $path); // <=== ใช้ $this เรียก fn fancyLink_img ข้างล่างได้ }else $link='no image'; return $link; }

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-06-05 23:12:33 By : .
 


 

No. 9



โพสกระทู้ ( 52 )
บทความ ( 0 )



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


ตอบความคิดเห็นที่ : 8 เขียนโดย : . เมื่อวันที่ 2014-06-05 23:12:33
รายละเอียดของการตอบ ::
อ๋อ ขอโทษด้วยครับ เป็นผมอ่านแล้วเข้าใจผิดเอาเอง
"ซึ่ง $this จะสามารถใช้ได้ใน body ของ function ที่ไม่ใช่ static เท่านั้น"
ผมไปเข้าใจแยกกันเป็นว่า $this จะสามารถใช้ได้ใน body ของ function และ function ที่เรียกใช้ต้องไม่ใช่ static
ตอนนี้เข้าใจแล้วว่า "$this ต้องเรียกจากใน body ของ function ซึ่งฟังก์ชั่นที่เรียกและถูกเรียกทั้ง 2 ตัวต้องไม่ใช่ static function"
ขอบคุณมากๆครับที่พยายามอธิบาย

เดี๋ยวผมขอไปทำความเข้าใจจากลิงค์ข้างล่างนี้ใหม่ก่อนนะครับ รู้สึกว่ามันจะไม่ตรงกับที่ผมเข้าใจจากหนังสือผมนะ(คิดว่าเป็นที่ผมอ่านแล้วเข้าใจไม่ลึกซึ่้งจึงเข้าใจผิดอีกแน่เลย)
http://www.worldphp.com/blogs/51da448fb2745/PHP-OOP-%E0%B8%95%E0%B8%AD%E0%B8%99%E0%B8%97%E0%B8%B5%E0%B9%88-5-Static-Method-and-Properties.html#.U5GcgHZpdIY
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-06-06 18:08:04 By : Giguntic
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : โค๊ดผมเรียก fn ภายใต้คลาสเดียวกันทำไมใช้ $this-> ไม่ได้ต้องใช้ชื่อคลาสแทน
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ 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 05
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่