浜松のWEBシステム開発・スマートフォンアプリ開発・RTK-GNSS関連の開発はお任せください
株式会社シーポイントラボ
TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:静岡県浜松市中区富塚町1933-1 佐鳴湖パークタウンサウス2F

【PHP】ReflectionClass::getDocCommentでコメントを実装に反映させる

PHP: ReflectionClass::getDocComment – Manual
 ReflectionClass::getDocCommentはその名の通りクラスのDocコメントを取得するメソッドです。次のようにクラスのコメントを取得できます。

<?php
/**
 * @property string $fuga 
 */ 
class Hoge {
    public $fuga;
    public function __construct($fuga){
        $this->fuga = $fuga;
    }
}

$rc = new ReflectionClass('Hoge');
var_dump($rc->getDocComment()); 
// 
// string(36) "/**
//  * @property string $fuga 
//  */"

 これによってコメントとプログラム内を結び付けられました。これを元にコメントを反映するテストを書くことができます。例えば、次です。

<?php
/**
 * @property string $fuga 
 * @property string $foo 
 */ 
class Hoge {
    public $fuga;
    public function __construct($fuga){
        $this->fuga = $fuga;
    }
}
// Docコメント取得
$rc = new ReflectionClass('Hoge');
$doc = $rc->getDocComment();
$lines = explode(PHP_EOL, $doc);
// プロパティ名抜き出し
$properties = [];
foreach ($lines as $line) {
    if (preg_match('/@property\s+\w+\s+$(.+)$/', $line, $matches)) {
        $properties[] = trim($matches[1]);
    }
}
// プロパティの存在をテスト
$hoge = new Hoge('hoge');
foreach($properties as $property){
    assert(isset($hoge->$property), "property ${property} is not exist.");
}

// <br />
// <b>Warning</b>:  assert(): property foo is not exist. failed in <b>[...][...]</b> on line <b>26</b><br />

 これによってデータベースの変更を反映していないORMのコードを発見したりできます。もっと突き詰めるとDocコメントを元にオリジナルのアクセス制御、自動コード生成を実現できます。

  • この記事いいね! (0)