$object->name で名前にアクセスできるこのオブジェクトがありますが、スターラインとエンドラインを取得できません。$object->starline
nullを返してみる。
PHPParser_Node_Expr_Variable Object ( [subNodes:protected] => Array ( [name] => var ) [attributes:protected] => Array ( [startLine] => 2 [endLine] => 2 ) )
$object->name で名前にアクセスできるこのオブジェクトがありますが、スターラインとエンドラインを取得できません。$object->starline
nullを返してみる。
PHPParser_Node_Expr_Variable Object ( [subNodes:protected] => Array ( [name] => var ) [attributes:protected] => Array ( [startLine] => 2 [endLine] => 2 ) )
クラス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');