使用变量来表示PHPStorm中静态属性的类名

时间:2012-12-18 21:44:19

标签: php static abstraction phpstorm

我正在尝试使用PHPStorm在PHP中编写一些抽象的MVC类。我用于泛型类包装器的一些重写类属性往往更适合使用静态方法和属性。 代码工作正常,但每当我使用变量来表示类名时,将其指向静态变量(存在于继承方法中的变量)时,PHPStorm不知道如何处理它并在IDE中将其显示为错误。我只是想知道是否有更好的方法来做这种事情,或者它是否只是我必须学会在IDE中忽略的东西。

示例:

class AbstractModel {
    protected static $_dataMapper     = null;
    protected static $_subs    = null;

    public function __construct($data=null) {
        // constructor omitted with things like a generic class init, etc.
    }

    // $_subs is a static array who's value is a class name use for
    // populating sub-objects as part of a class instance
    public function setSubProperty($subKeyName,$value) {
        $dataType = get_called_class();

        /*************************************
         * PHPStorm complains here on $_subs *
         *************************************/
        if(is_array($dataType::$_subs)
            && array_key_exists($subKeyName,$dataType::$_subs)) {

            $setMethod = 'set' . ucfirst($subKeyName);
            return $dataType->$setMethod($value);
        } else {
            return false; // or throw an exception
        }
    }
}

class SomedataModel extends AbstractModel {
    public $other = null;
    protected static $_subs = array(
        'other'   => "OtherModel"
    );

    public function __construct($data=null) {
        parent::__construct($data=null);
        foreach(array_keys(self::$_subs) as $_k) {
            $setMethod = 'set'.ucfirst($_k);
            $this->$setMethod();
        }
    }

    public function setOther($data=null) {
        // sanitize and set instance of 'other' as $this->other
    }
}

1 个答案:

答案 0 :(得分:1)

您可以使用static关键字轻松解决此问题:

...

public function setSubProperty($subKeyName,$value) {

    if (is_array(static::$_subs)
        && array_key_exists($subKeyName, static::$_subs)) {

        $setMethod = 'set' . ucfirst($subKeyName);

        ...

PHPStorm非常支持它。不支持将变量字符串值作为类名解析静态成员和属性。您可能想要打开一个功能请求(如果它尚不存在),但是我怀疑它在技术上是否可行,因为它不是类型提示,而是值得暗示我认为在Phpstorm中不支持。