PHP - 设置继承的静态属性也会在继承它的其他类中设置它

时间:2012-06-01 09:33:19

标签: php static inheritance

我有一个表示html元素的类层次结构。其中一些可能与某些浏览器版本不兼容。例如,HTML5画布与版本9之前的Internet Explorer不兼容。

我希望,对于每种类型的元素,都能够知道调用浏览器是否支持它们。

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&lt; 9。

我该怎么做才能防止这种情况发生?

感谢您花时间阅读。

-virus

2 个答案:

答案 0 :(得分:1)

在静态方法中,您可以使用get_called_class()(PHP 5.3+)来了解它被调用的类。

FormView::SetFirstCompatibleVersion()

get_called_class()将返回'FormView'。这就是你如何区分你的子类。

答案 1 :(得分:0)

你无法阻止这一点。 AbstractView的所有子项共享类静态变量。您可以改为使用对象,也可以在每个类的静态变量中设置它们的兼容性,而不是使用SetFirstCompatibleVersion。