-2

$object->name で名前にアクセスできるこのオブジェクトがありますが、スターラインとエンドラインを取得できません。$object->starlinenullを返してみる。

PHPParser_Node_Expr_Variable Object ( [subNodes:protected] => Array ( [name] => var ) [attributes:protected] => Array ( [startLine] => 2 [endLine] => 2 ) )

4

1 に答える 1

0

クラスPHPParser_NodeAbstractには魔法のメソッド __get() があるため、$object->name を取得します。

PHPParser_Node_Expr_Variableは、 PHPParser_NodeAbstractを拡張する PHPParser_Node_Expr を拡張します。したがって、 PHPParser_Node_Expr_Variable オブジェクトには、これらのクラスが持つすべてのメソッドがあります (オブジェクト継承)。

abstract class PHPParser_NodeAbstract implements ...
{
    ....

    public function &__get($name) {
        return $this->subNodes[$name];
    }

    ...

    public function &getAttribute($key, $default = null) {
        if (!array_key_exists($key, $this->attributes)) {
            return $default;
        } else {
            return $this->attributes[$key];
        }
    }
}

また、配列 subNodes にそのようなプロパティ「starline」がないため、$object->starline を取得できません。しかし、メソッド getAttribute() を見ると、このコードが機能する必要があることがわかります。

$object->getAttribute('startLine');
于 2013-09-28T17:29:15.540 に答える