簡介
AOP是一個現代的面向方面的框架,使用簡單的PHP,具有豐富的功能,適用於新級別的軟體開發。該框架允許在傳統的物件導向的PHP程式碼中解決橫切問題,為您的程式碼提供高效和透明的勾點系統。
特征
為PHP提供動態勾點系統,無需更改原始原始碼。
不需要任何PECL擴充套件(php-aop,runkit,uopz)和DI容器即可工作。
物件導向的方面、連線點和切入點設計。
攔截類中任何公共或受保護方法的執行。
攔截靜態方法和final類中方法的執行。
攔截traits中方法的執行。
攔截對物件的公共/受保護內容的存取。
用於靜態類初始化的勾點(在類載入到PHP記憶體之後)。
用於物件初始化的勾點(截取
new
關鍵字)。
攔截系統PHP函式的呼叫。
能夠透過
Around
型別的通知更改任何方法/函式的返回值。
於在原始碼中定義切入點的豐富切入點語法。
使用Xcad進行AOP的本機偵錯。具有編織方面的程式碼是完全可讀的和原生的。您可以在原始類或方面中放置斷點,它將工作(對於偵錯模式)!
可以與任何現有的PHP框架和庫整合(有或沒有額外的配置)。
高度最佳化的生產用途:支持操作碼緩存,延遲載入建議和方面,連線點緩存,沒有執行時檢查切入點,沒有執行時註釋解析,沒有
evals
和
__call
方法,沒有慢速代理和
call_user_func_array()
。快速引導過程(2- 20毫秒)和通知呼叫。
什麽是AOP?
AOP(物件導向編程)是一種處理橫切關註點的方法,這些關註點是以「模組化」的方式設計和實作的(也就是說,有適當的封裝,沒有重復等),然後以簡潔和健壯的方式整合到所有相關的執行點中,例如透過聲明性或編程性手段。
在AOP術語中,執行點被稱為連線點。這些點的集合稱為切入點,在連線點之前、之後或「周圍」執行的新行為稱為通知。你可以在Introduction部份閱讀更多關於AOP的內容。
安裝
AOP框架可以與composer一起安裝。安裝非常簡單
Step 1 使用composer下載庫
請composer下載最新版本的Go!AOP框架及其依賴項,執行以下命令:
composer require goaop/framework
Composer會將框架安裝到計畫的 vendor/goaop/framework 目錄中。
Step 2 建立應用程式方面內核
這個框架的目的是為您的應用程式提供簡單的AOP整合。你必須首先為你的應用程式建立 AspectKernel 類。這個類將在一個地方管理應用程式的所有方面。
該框架提供了基礎類別,使建立自己的內核變得更容易。要建立應用程式內核,請擴充套件抽象類
Go\Core\AspectKernel
<?php
// app/ApplicationAspectKernel.php
useGo\Core\AspectKernel;
useGo\Core\AspectContainer;
/**
* Application Aspect Kernel
*/
classApplicationAspectKernelextendsAspectKernel
{
/**
* Configure an AspectContainer with advisors, aspects and pointcuts
*
* @param AspectContainer $container
*
* @return void
*/
protectedfunctionconfigureAop(AspectContainer $container)
{
}
}
Step 3 在前端控制器中配置aspect內核
要配置方面內核,請呼叫內核例項的
init()
方法。
// front-controller, for Symfony2 application it's web/app_dev.php
include __DIR__ . '/vendor/autoload.php'; // use composer
// Initialize an application aspect container
$applicationAspectKernel = ApplicationAspectKernel::getInstance();
$applicationAspectKernel->init([
'debug' => true, // use 'false' for production mode
'appDir' => __DIR__ . '/..', // Application root directory
'cacheDir' => __DIR__ . '/path/to/cache/for/aop', // Cache directory
// Include paths restricts the directories where aspects should be applied, or empty for all source files
'includePaths' => [
__DIR__ . '/../src/'
]
]);
Step 4 建立一個方面
方面是AOP哲學的關鍵元素。走!AOP框架只使用簡單的PHP類來聲明方面,這使得物件導向的所有特性都可以用於方面類。作為一個例子,讓我們截取所有的方法並顯示它們的名稱:
// Aspect/MonitorAspect.php
namespace Aspect;
use Go\Aop\Aspect;
use Go\Aop\Intercept\FieldAccess;
use Go\Aop\Intercept\MethodInvocation;
use Go\Lang\Annotation\After;
use Go\Lang\Annotation\Before;
use Go\Lang\Annotation\Around;
use Go\Lang\Annotation\Pointcut;
/**
* Monitor aspect
*/
class MonitorAspect implements Aspect
{
/**
* Method that will be called before real method
*
* @param MethodInvocation $invocation Invocation
* @Before("execution(public Example->*(*))")
*/
public function beforeMethodExecution(MethodInvocation $invocation)
{
echo'Calling Before Interceptor for: ',
$invocation,
' with arguments: ',
json_encode($invocation->getArguments()),
"<br>\n";
}
}
很簡單,不是嗎?我們在這裏聲明,我們希望在執行Example類中的所有動態公共方法之前安裝一個勾點。這是在註釋#0的幫助下完成的#勾點可以是任何型別,你稍後會看到它們。但是我們不改變類Example中的任何程式碼!我能感受到你的驚訝。
Step 5 在方面內核中註冊方面
要註冊
aspect
,只需在內核的
configureAop()
方法中添加它的例項:
// app/ApplicationAspectKernel.php
use Aspect\MonitorAspect;
//...
protected function configureAop(AspectContainer $container)
{
$container->registerAspect(new MonitorAspect());
}
//...
Step 6 可選配置
預設情況下,Go!AOP使用
Doctrine\Common\Cache\FilesystemCache
來緩存註釋。但是,如果您需要使用任何其他緩存引擎進行註釋,您可以透過應用程式方面內核的
annotationCache
配置選項配置緩存驅動程式。唯一的要求是緩存驅動程式實作
Doctrine\Common\Cache\Cache
介面。
這在部署到唯讀檔案系統時非常有用。在這種情況下,你可以使用,例如:
Doctrine\Common\Cache\ArrayCache
或一些基於記憶體的緩存驅動程式。