NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #2809 most downloaded on Packagist
An aspect oriented framework
Last release 1 months ago
03 Sep 2026
Release timing varies
gaps range from 2 weeks to 9 months
Some releases are documented
notes for 27 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
14 years old
92 releases · first in 2013
Write weaved class files atomically so concurrent processes never require a half-written file (regression of #137 since 2.15.0).
Proxy codegen: the implements-list regex no longer swallows a same-line class body brace, and multi-line implements lists no longer lose every interfa
AopCode::GENERATION bump. (#264)One column per quarter.
CompilationFailedException) for class declarations that put the body brace on the same line as the implements list, or split the implements list over multiple lines (which dropped every interface after the first). Generated proxies are invalidated via an AopCode::GENERATION bump, so stale cached proxies regenerate once after upgrade. (#264)Proxy dispatch is now a direct parent::method(...) first-class callable (no double dispatch through the proxy); intercepted-call overhead roughly halv
parent::method(...) first-class callable (no double dispatch through the proxy); intercepted-call overhead roughly halved. Generated proxies are invalidated via AopCode::GENERATION — existing script dirs regenerate once after upgrade (stale files are ignored, not loaded). (#260)newInstance path: cache weaved class names, instantiate with new $class(...$args) instead of reflection, and match attributes without instantiating them during bind. (#259)is_a, aligned with #255). Methods annotated with a subclass attribute may get a different interceptor order than before (they were previously bound only in the default phase). (#259)// comment listing bound interceptor short class names (self-documenting generated code; no runtime cost). (#262)Compiler::compile() now (re)emits the weaved class file even when the class is already declared in the process but the file is missing, so a compile pipeline that cleans and recompiles produces complete output for runtime loaders that resolve weaved classes by name. (#261)getThis(). Such nested calls are now intercepted normally (previously interception state was corrupted). (#260)$1-style sequences (preg_replace backreference bug in AopCode::insert()). (#260)getAnnotations()/getAnnotation(), so a broken attribute constructor on an unrelated method cannot fatal bind(). (#259)Weaver serialization excludes the in-process weaved-class cache so a restored Weaver in another process reloads class files instead of assuming FQNs are already defined. (#259)AopCode::INTERCEPT_STATEMENT public const, _intercept(), _isAspect; AopCode::resolveInterceptTrait() is now private. (#260)getAnnotation() now matches child classes by default using ReflectionAttribute::IS_INSTANCEOF ( #254 , #255 )
Backward-compatible deprecation stubs provided in src-deprecated/
$aspect->bind() + newInstance() insteadsrc-deprecated/@readonly annotations with native readonly keyword (#249)
AopPostfixClassName, Compiler, AnnotatedMatcher, ReflectiveMethodInvocation, InterceptTraitStateExisting code using AspectPecl or PeclDispatcher will receive a clear LogicException with migration instructions instead of "Class not found" errors.
Full Changelog: 2.18.0...2.19.0
$aspect->bind() + newInstance() insteadsrc-deprecated/@readonly annotations with native readonly keyword (#249)Supports AOP targeting PHP 8.2 readonly classes by @koriym in #238
Full Changelog: 2.17.2...2.18.0
Rolled back to the state of v2.17.1 to address a breaking change introduced in v2.17.2.
This release is deprecated for breaking BC. Reverted in 2.17.3.
This release is deprecated for breaking BC. Reverted in 2.17.3.
## What's Changed
* Add support for readonly class in PHP 8.2 by @ngmy in #236
Full Changelog: 2.17.1...2.17.2
This release is deprecated for breaking BC. Reverted in 2.17.3.
remove extra <?php by @hanahiroAze in #228
Full Changelog: 2.17.0...2.17.1
<?php (#228)Enable PHP 8.4 compat by @koriym in #220
Full Changelog: 2.16.2...2.16.3
Bug with annotated with matcher
Fix an issue where the same class would not compile in multiple contexts
New `Aspect` class - Simplifies API and improves PECL extension integration
Aspect class - Simplifies API and improves PECL extension integrationweave() methodAspect class instead of Pointcut, Bind, and WeavernewInstance method is now part of Aspect class, not WeaverBefore (2.0.0 to 2.15.x):
$pointcut = new Pointcut(
(new Matcher())->any(),
(new Matcher())->annotatedWith(NotOnWeekends::class),
[new WeekendBlocker()]
);
$bind = (new Bind)->bind(RealBillingService::class, [$pointcut]);
$billing = (new Weaver($bind, $tmpDir))->newInstance(RealBillingService::class, []);
After (2.16.0+):
$aspect = new Aspect();
$aspect->bind(
(new Matcher())->any(),
(new Matcher())->annotatedWith(NotOnWeekends::class),
[new WeekendBlocker()]
);
$billing = $aspect->newInstance(RealBillingService::class);
Support enum in attribute arguments
Fixed to not make mixed nullable
mixed nullable (#211)Update license copyright year(s)
Ignore anonymous class compilation
Update license copyright year(s)
Create attribute_reader.php for performance boost
Improve compile performance (#192, #195)
### Added - PHP 8.2-alpha support
### Added - Support PHP 7.2
Fix wrong compiled method of parent
@NaokiTsuchiya made their first contribution in #181
Template annotation into ReflectionMethod::getAnnotation
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Add Service Locator for annotation/attribute reader
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Compare
Compare
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →