2012-06-01 41 views
2

我有代表html元素的類的層次結構。其中一些可能與某些瀏覽器版本不兼容。以HTML5畫布爲例,它與版本9之前的Internet Explorer不兼容。PHP - 設置繼承的靜態屬性也會將其設置在繼承它的其他類中

對於每種類型的元素,我都希望能夠知道它們是否被調用瀏覽器支持。

abstract class AbstractView // Base class, doesn't represent anything. 
{ 
    // ... 

    // By default, an element will be considered compatible with any version of ny browser. 
    protected static $FirstCompatibleVersions = array(
     'Firefox' => 0, 
     'Chrome' => 0, 
     'Internet Explorer' => 0); 

    protected static function SetFirstCompatibleVersion($browser, $version) 
    { 
     static::$FirstCompatibleVersions[$browser] = $version; 
    } 

    protected static function IsSupportedByBrowser() 
    { 
     $browser = // ... Assumed to be the calling browser name. 
     $version = // ... Assumed to be the calling browser version. 
     return static::$FirstCompatibleVersions[$browser] <= $version; 
    } 
} 

class CanvasView extends AbstractView // Displays a canvas. Not compatible with IE < 9. 
{ 
    // ... 
} 

CanvasView::SetFirstCompatibleVersion('Internet Explorer', 9); 

class FormView extends AbstractView // Displays a form. Assumed compatible with anything. 
{ 
    // ... 
} 

// Nothing to do form FormView. 

echo FormView::IsSupportedByBrowser(); // Should print 1 (true) (on firefox 12) but does not. 

我的問題是,當我執行:

CanvasView::SetFirstCompatibleVersion('Internet Explorer', 9); 

這不僅會設置CanvasView :: $ FirstCompatibleVersion [ 'Internet Explorer的'],但它也將設置這個值對所有其他類,就像這個數組對所有類都是共同的,這使得我所有的元素都與IE <不兼容。

我該怎麼做才能防止這種情況?

感謝您花時間閱讀。

-Virus

+0

忘記了,如果我重新聲明每個子類中的$ FirstCompatibleVersions數組,它可以正常工作。 – Virus721

回答

1

在靜態方法中,你可以使用get_called_class()(PHP 5.3+)來知道它被調用的是哪個類。

FormView::SetFirstCompatibleVersion() 

get_called_class()將返回'FormView'。這是你如何區分你的子類。

+0

N.B .:需要PHP> = 5.3.0 – lanzz

+0

@lanzz補充說,謝謝! :) –

+0

謝謝,但沒有static關鍵字已經處理了這個? – Virus721

0

你不能阻止這一點。 AbstractView的所有子項共享類靜態變量。您可以改爲使用對象,也可以在每個類的靜態變量中設置它們的兼容性,而不是使用SetFirstCompatibleVersion。

+0

這就是我一直在想的,但由於我有很多元素(超過100),我必須在每個元素上添加一個受保護的靜態數組。如果有人創建了一個新元素,他可能會忘記創建這個數組,因此objet將共享父類的數組(如果我理解的很好)。感謝您的回答 ! – Virus721

+0

@ Virus721你仍然需要調用SetFirstCompatibleVersion超過100次,不是嗎?有人可以忘記調用它... – meze

+0

不完全是,我只想在元素與調用瀏覽器存在兼容性問題時才需要調用它。大多數html 4元素不需要使用這個函數,但是一些html 5元素必須爲某些瀏覽器做。但是我仍然需要將自己的數組給予我的元素,否則它將使用父類的數組,對嗎? – Virus721