public static function createFromToken(ClassDefine $aClassToken, $sAspectFilepath = null) { $sAspectName = $aClassToken->fullName(); $aTokenPool = $aClassToken->parent(); $aAspect = new self($sAspectName); // 先定义 pointcut foreach ($aTokenPool->functionIterator($sAspectName) as $aMethodToken) { if (!($aDocCommentToken = $aMethodToken->docToken()) or !($aDocComment = $aDocCommentToken->docComment())) { continue; } // pointcut if ($aDocComment->hasItem('pointcut')) { $aPointcut = Pointcut::createFromToken($aMethodToken); $aAspect->pointcuts()->add($aPointcut); } } // 然后定义 advice foreach ($aTokenPool->functionIterator($sAspectName) as $aMethodToken) { if (!($aDocCommentToken = $aMethodToken->docToken()) or !($aDocComment = $aDocCommentToken->docComment())) { continue; } if ($aDocComment->hasItem('advice')) { $aAdvice = Advice::createFromToken($aMethodToken, $aAspect); $aAspect->addAdvice($aAdvice); } } $aAspect->sAspectName = $sAspectName; if ($sAspectFilepath) { $aAspect->setAspectFilepath(FSO::tidyPath($sAspectFilepath)); } return $aAspect; }