public static function createFromToken(FunctionDefine $aFunctionDefine, Aspect $aAspect) { if (!($aClassDefine = $aFunctionDefine->belongsClass())) { throw new Exception("传入的 \$aFunctionDefine 参数无效,必须是一个类方法的定义Token"); } if (!($aDocToken = $aFunctionDefine->docToken())) { throw new Exception("传入了无效Advice %s::%s() :没有DocComment申明。", array($aClassDefine->fullName(), $aFunctionDefine->name())); } $aDocComment = $aDocToken->docComment(); $sPosition = null; if ($aDocComment->hasItem('advice')) { $sPosition = $aDocComment->item('advice'); $sPosition = trim($sPosition); $sPosition = strtolower($sPosition); } if (!$sPosition) { $sPosition = self::after; } $aAdvice = new self($aFunctionDefine->name(), $aFunctionDefine->bodySource(), $sPosition, $aFunctionDefine); $aAdvice->aDefineAspect = $aAspect; // for pointcut foreach ($aDocComment->itemIterator('for') as $sPointcutName) { if (!($aPointcut = $aAspect->pointcuts()->getByName($sPointcutName))) { throw new Exception("定义Aspect %s 的 Advice %s 时,申明了一个不存在的 Pointcut: %s 。", array($sAspectName, $aAdvice->name(), $sPointcutName)); } $aAdvice->arrForPointcuts[] = $sPointcutName; } return $aAdvice; }
public function addFunction(FunctionDefine $aFunction) { if ($aClass = $aFunction->belongsClass()) { $sClassName = $aClass->fullName(); } else { $sClassName = ''; } if (!($sFuncName = $aFunction->name())) { $sFuncName = ''; } $this->arrMethods[$sClassName][$sFuncName] = $aFunction; }
public static function createFromToken(FunctionDefine $aFunctionDefine) { if (!($aClassDefine = $aFunctionDefine->belongsClass())) { throw new Exception("传入的 \$aFunctionDefine 参数无效,必须是一个类方法的定义Token"); } try { $aMethodRef = new \ReflectionMethod($aClassDefine->fullName(), $aFunctionDefine->name()); } catch (\Exception $e) { throw new Exception("无法找到 Pointcut %s::%s 的定义", array($aClassDefine->fullName(), $aFunctionDefine->name()), $e); } // 检查参数(不能有非可缺省的参数) if ($aMethodRef->getNumberOfRequiredParameters()) { throw new Exception("Pointcut %s::%s() 的定义无效:要求了非可缺省的参数; 请检查该Pointcut的参数表。", array($aClassDefine->fullName(), $aFunctionDefine->name())); } // 声明为静态方法 if ($aMethodRef->isStatic()) { if (!$aMethodRef->isPublic()) { throw new Exception("Pointcut %s::%s() 声明为 static 类型,static 类型的 Pointcut 必须为 public。", array($aClassDefine->fullName(), $aFunctionDefine->name())); } $arrJointPoints = call_user_func(array($aClassDefine->fullName(), $aFunctionDefine->name())); } else { try { $aClassRef = new \ReflectionClass($aClassDefine->fullName()); } catch (\Exception $e) { throw new Exception("无法找到 Aspect %s 的定义,无法定义Pointcut:%s::%s", array($aClassDefine->fullName(), $aClassDefine->fullName(), $aFunctionDefine->name()), $e); } // 检查该类的构造函数的参数 if ($aConstructor = $aClassRef->getConstructor() and $aConstructor->getNumberOfRequiredParameters()) { throw new Exception("由于 Pointcut %s::%s() 没有被申明为 static ,则所属的Aspect(%s)的构造函数不能要求非可省的参数。将 Pointcut %s::%s() 声明为 static,或者取消Aspect(%s)的构造函数所要求的非可省参数。", array($aClassDefine->fullName(), $aFunctionDefine->name(), $aClassDefine->fullName(), $aClassDefine->fullName(), $aFunctionDefine->name(), $aClassDefine->fullName())); } $aMethodRef->setAccessible(true); $arrJointPoints = $aMethodRef->invokeArgs($aClassRef->newInstanceArgs(), array()); } $aPointcut = new self($aFunctionDefine->name()); $aPointcut->sDefineMethod = $aFunctionDefine->name(); if (is_array($arrJointPoints)) { foreach ($arrJointPoints as $aJointPoint) { if ($aJointPoint instanceof JointPoint) { $aPointcut->jointPoints()->add($aJointPoint); $aJointPoint->setPointcut($aPointcut); } else { throw new Exception("Pointcut %s::%s 的定义中,申明了无效的 JointPoint: %s", array($aClassDefine->fullName(), $aFunctionDefine->name(), var_export($aJointPoint, true))); } } } return $aPointcut; }