PHP: genişletilmiş sınıfındaki statik çağrısı sınıfadı olsun

4 Cevap php

İşte durum. Ben iki sınıf vardır: Aksiyon ve MyAction, sonuncusu olarak ilan edilir

class MyAction extends Action {/* some methods here */}

(Orada kalıtsal sınıfların bir sürü olacak ve ben hepsi bu yöntemi uygulamak istemiyorum çünkü, sadece içinde) statik çağrısı classname dönecekleri, tüm ihtiyacım Eylem sınıfta yöntemidir. İşte 'bahsediyorum budur:

Class Action {
 function n(){/* some actions */}
}

Ve ben onu çağırdığınızda:

MyAction::n(); // it should return "MyAction"

Ama üst sınıfta her beyan, sadece üst sınıfa erişimi (__CLASS__ değişken değeri "Eylem" vardır).

Bunu yapmak için herhangi bir olası yolu var mı?

4 Cevap

__CLASS__ her zaman kullanılmış olduğu sınıfın adını verir, bu yüzden statik bir yöntem ile pek yardımcı değil. Yöntem statik değilse sadece get_class ($ this) kullanabilirsiniz. örneğin

class Action {
    public function n(){
        echo get_class($this);
    }

}

class MyAction extends Action {

}

$foo=new MyAction;

$foo->n(); //displays 'MyAction'

Late static bindings, available in PHP 5.3+

Şimdi PHP 5.3 serbest olduğunu, size daha çok tanımlandığı zaman daha zamanında bir statik yöntem çağrısı için hedef sınıf çözelim ki, late static bindings kullanabilirsiniz.

Özellik size aracılığıyla çağrıldı classname anlatmak için yeni bir sihirli sabit tanıtmak değil iken, yeni bir fonksiyon sağlamaz, get_called_class() hangi size bir statik yöntem içeri çağrıldı sınıfın adını söyleyebilir İşte bir örnek:

Class Action {
    public static function n() {
        return get_called_class();
    }
}


class MyAction extends Action {

}


echo MyAction::n(); //displays MyAction

Bu ideal bir çözüm değil, ama PHP <çalışır 5.3.0.

Kod septuro.com kopyalanmıştır

if(!function_exists('get_called_class')) {
	class class_tools {
		static $i = 0;
		static $fl = null;

		static function get_called_class() {
		    $bt = debug_backtrace();

			if (self::$fl == $bt[2]['file'].$bt[2]['line']) {
			    self::$i++;
			} else {
			    self::$i = 0;
			    self::$fl = $bt[2]['file'].$bt[2]['line'];
			}

			$lines = file($bt[2]['file']);

			preg_match_all('/([a-zA-Z0-9\_]+)::'.$bt[2]['function'].'/',
			    $lines[$bt[2]['line']-1],
			    $matches);

	        return $matches[1][self::$i];
	    }
	}

	function get_called_class() {
	    return class_tools::get_called_class();
	}
}

(5.3 geldi zaman) Şimdi bu oldukça basit:

http://ua.php.net/manual/en/function.get-called-class.php

Hiçbir şekilde ne istediğinizi yapmak için, mevcut PHP sürümlerinde vardır. Paul Dixon çözümü sadece bir tanesidir. Yani, kod örneği, geç statik bağlamaları bahsediyor özellik olarak beta olduğu PHP 5.3, bir olarak kullanılabilir.