2012-06-01 40 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