У меня есть иерархия классов, представляющих элементы 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.