PHP – установка унаследованного статического свойства также установит его в других классах, наследующих его

У меня есть иерархия классов, представляющих элементы html. Некоторые из них могут быть несовместимы с некоторыми версиями браузера. Например, холст HTML5 не совместим с Internet Explorer до версии 9.

Я хотел бы, чтобы каждый тип элемента мог знать, поддерживаются или не поддерживаются вызывающим браузером.

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

Что я могу сделать, чтобы предотвратить это?

Спасибо, что нашли время для чтения.

-Virus

Внутри статического метода вы можете использовать get_called_class() (PHP 5.3+), чтобы узнать, к какому классу он вызывается.

 FormView::SetFirstCompatibleVersion() 

Функция get_called_class() вернет 'FormView' . Вот как вы можете различать свои подклассы.

Вы не можете этого предотвратить. Все дочерние элементы AbstractView разделяют статические переменные класса. Вместо этого вы можете использовать объекты или устанавливать их совместимость в статической переменной в каждом классе вместо использования SetFirstCompatibleVersion.