Bir üst sınıftan bir alt yöntem denilen olsun

6 Cevap

Ben büyük bir sorun var. Bir üst sınıftan alt sınıf yöntemi denilen olsun nasıl. Aşağıdaki kodu çalıştırınız.

class Model {

    public function render(){
    	echo '<br />class: '.get_class($this).' -- function: '.__FUNCTION__;
    }
}

class Product extends Model {

    public function show(){
    	$this->render();
    }
}

class User extends Model {

    public function index(){
    	$this->render();
    }
}


$p = new Product();
$u = new User();

echo $p->show();
echo $u->index();
result :
class: Product -- function: render
class: User -- function: render

Alt sınıf yöntemi adını almak nasıl yerine render?

Teşekkürler.

6 Cevap

__FUNCTION__ thingie So olursa olsun nesne modeli nasıl yapılandığını inç olduğunu fonksiyonunun adıyla derleme zamanında değiştirilir, siz __FUNCTION__ olan işlevini alırsınız PHP'nin önişlemci tarafından karşılandı.

Eğer çağrılan yöntemin adını bilmek istiyorsanız burada yapabileceğiniz en iyi, render () yöntemine bir parametre olarak eklemek için:

class Model {
    public function render($methodName){
        echo '<br />class: '.get_class($this).' -- function: '. $methodName;
    }
}

Ve bir yöntem çağrıları adını ekleyin:

class Product extends Model {
    public function show(){
        $this->render(__FUNCTION__);
    }
}

class User extends Model {
    public function index(){
        $this->render(__FUNCTION__);
    }
}

Bunu neden ihtiyaç olarak detaya gidebilir miyiz?

Ben yapmak için çalışıyoruz ne emin değilim, ama bir PHP çerçeve geliştirilmesi özellikle zaman miras temel kuralları kendinizi kısıtlamak gerekir.

Belki biraz daha iyi bu ile ulaşmak için çalışıyoruz ne göstermek olabilir.

Sadece şu şekilde değiştirin değil misiniz?

class Model {

    protected $_type='unspecified';

    public function render(){
        echo '<br />class: '.$this->_type.' -- function: '.__FUNCTION__;
    }
}

class Product extends Model {

    public function __construct(){
        $this->_type = 'product';
    }

    public function show(){
        $this->render();
    }
}

class User extends Model {

    public function __construct(){
        $this->_type = 'user';
    }

    public function index(){
        $this->render();
    }
}

Ya da sizin için işe yaramazsa herhangi bir neden var mı?

Eğer, örneğin, üst sınıftan içine render ne çalışır mantığı hareket olabilir:

class Model {

    public function render($type){
        echo '<br />class: '.get_class($this).' -- function: '.$type;
    }

    public function show() {
        $this->render('show');
    }

    public function index() {
        $this->render('index');
    }
}

class Product extends Model {
 public function show(){
        //some stuff
        parent::show();
    }
}

class User extends Model {

    public function index(){
        parent::index();
    }
}

Ben gerçekten bu size tavsiye, ama ne yapabilirdi bir istisna ve hemen onu yakalamak olduğunu bilmiyorum.

Sonra hale yöntemi denir hangi işlevi öğrenmek için bu özel durum yığın izlemesi kullanabilirsiniz.

Ben çalıştığını biliyorum, ama her ikisi de performancewise ve codingwise bu iyi bir seçenek değildir.

GÜNCELLEME:

<?php

class bla {
    function test1() {
    	$this->test2();
    }

    function test2() {
    	$method = "";
    	try {
    		throw new Exception("bla");
    	} catch(Exception $e) {
    		$trace = $e->getTrace();
    		$method = $trace[1]['function']);
    	}

    	echo $method; //will echo test1
    }
}

$blub = new bla();
$blub->test1();

Sana göstermek için çalışıyorum ne olsun umuyoruz.