问题
初探AOP FOR PHP
解决方法
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。其实这个技术在很久前就出现了。我google的时候已经是06年就出现的技术。
用我的理解是,在不破坏原有方法或者类的时候将函数的进行横向切面。然后加进自己的方法处理。比如说,我们经常有一些方法执行之前要进行权限判断。处理之后要进行日志写入等等操作。一般的操作方式是在方法的头部和底部写处理过程。这就破坏了OOP的单一功能的原则。因为当有100甚至1000个方法要许进行同样处理的时候,难免会出现一些不必要的错误。这就是AOP的实际运用。。。
我们写一个函数输出一些信息的时候,在处理前,不希望没有权限看到这些信息的人来看。处理之后可能会写入一些常用缓存信息。通常的写法是这样 class OneTest{
public function getInfo(){
//检查一下权限
ACL::checkRole();
//做获取信息的动作过程;
.....
//写入缓存
Cache::writeCache();
}
}
复制代码如果有1000个这样需要做同样操作的方法怎么办呢。。一处修改处处修改。难维护的情况就出现了。而用AOP的办法去处理这个问题,就只需要这样 class OneTest{
public function getInfo(){
//做获取信息的动作过程;
.....
}
}
复制代码这样两个破坏封装的就拿出来在其他地方统一定义了。。。。。大体就是这么一个意思。当然理解错误,误人子弟纯属巧合。
详细介绍大家可以google。。一些资料还没整理。。。。。这还是忙里偷闲的时候整出来的。
下面是几个关于php的链接。有兴趣的可以看一下
AOP FOR PHP探讨
[url=http://blog.csdn.net/xiaoxiaohai123/archive/2008/06/30/2598377.aspx]链接标记http://blog.csdn.net/xiaoxiaohai123/archive/2008/06/30/2598377.aspx[/url]
PHP准AOP实现
[url=http://hi.baidu.com/thinkinginlamp/blog/item/864a0ef46d93b86eddc474f3.html]链接标记http://hi.baidu.com/thinkinginlamp/blog/item/864a0ef46d93b86eddc474f3.html[/url]
然后自己简单实现了一下
/**
* TSAspect{
* AOP for php
* @package
* @version $id$
* @copyright 2009-2011 SamPeng
* @author SamPeng
* @license PHP Version 5.2 {@link [url=http://www.sampeng.cn]www.sampeng.cn[/url]}
*/
class TSAspect{
/**
* instance
* 方法所属对象引用
* @var mixed
* @access private
*/
private $instance;
/**
* method
* 方法名
* @var mixed
* @access private
*/
private $method;
/**
* aspect
* 切面保存数组
* @var array
* @access private
*/
private $aspect = array();
/**
* __construct
* 构造函数查找出所有Aspect的实现方法
* @param mixed $instance
* @param mixed $method
* @param mixed $arg
* @access public
* @return void
*/
public function __construct( $instance,$method,$arg = null ){
$this->aspect = self::findFunction();
$this->instance = $instance;
$this->method = $method;
}
public function callAspect(){
$before_arg = $this->beforeFunction();
$callBack = array( $this->instance,$this->method);
$return = call_user_func_array( $callBack,$arg );
$this->afterFunction();
}
/**
* beforeFunction
* 方法之前执行的方法集合
* @static
* @access public
* @return void
*/
protected function beforeFunction(){
$result = $this->getFunction("before");
return $result;
}
/**
* afterFunction
* 方法之后执行的方法集合
* @static
* @access public
* @return void
*/
protected function afterFunction(){
$result = $this->getFunction( "after" );
}
/**
* findFunction
* 查找所有的Aspect的方法集合.
* @static
* @access private
* @return void
*/
private static function findFunction(){
$aspect = array();
foreach ( get_declared_classes() as $class ){
$reflectionClass = new ReflectionClass( $class );
if ( $reflectionClass->implementsInterface( 'InterfaceAspect' ) )
$aspect[] = $reflectionClass;
}
return $aspect;
}
/**
* getFunction
* 调用插入的方法
* @param mixed $aspect
* @static
* @access private
* @return void
*/
private function getFunction($aspect){
$result = array();
$array = $this->aspect;
foreach ( $array as $plugin ){
if ( $plugin->hasMethod($aspect ) ){
$reflectionMethod = $plugin->getMethod( $aspect );
if ( $reflectionMethod->isStatic() ){
$items = $reflectionMethod->invoke( null );
}else{
$pluginInstance = $plugin->newInstance();
$items = $reflectionMethod->invoke( $pluginInstance );
}
//处理经过处理的集合
if ( is_array( $items ) ){
$result = array_merge( $result,$items );
}
}
}
return $result;
}
}
interface InterfaceAspect{
public static function getName();
}
class testAspect implements InterfaceAspect{
public static function getName(){
return "这是一个测试AOP";
}
public static function before(){
echo "方法执行之前";
}
public static function after(){
echo "方法执行后
";
}
}
class test{
public function samTest($arg){
echo "这是一个测试方法";
}
}
$test = new test();
$aspect = new TSAspect($test,'samTest');
$aspect->callAspect();
复制代码输出:
方法执行之前
这是一个测试方法
方法执行之后
网友建意:
不懂,,,对开发思想有用不?
网友建意:
思想?这其实也是一种设计模式。。。。将破坏函数单一功能的部分耦合出来。。具体实现有很多办法。。当然PHP的是准AOP。。因为他不能像java那样的编译语言在编译时的时候插入横切面处理过程。
网友建意:
新的事物总是被人华丽的无视。。。
网友建意:
去年就知道面向切面编程了,,,用不上,,,,呵呵,,,
网友建意:
刚刚接触面向函数式编程,Haskell 、Erlang
网友建意:
PHP实现AOP要比Java简单的多..因为有runkit
网友建意:
自己连OOP还没大懂呢。技术啊。追不上。

PHP类型提示提升代码质量和可读性。1)标量类型提示:自PHP7.0起,允许在函数参数中指定基本数据类型,如int、float等。2)返回类型提示:确保函数返回值类型的一致性。3)联合类型提示:自PHP8.0起,允许在函数参数或返回值中指定多个类型。4)可空类型提示:允许包含null值,处理可能返回空值的函数。

PHP中使用clone关键字创建对象副本,并通过\_\_clone魔法方法定制克隆行为。1.使用clone关键字进行浅拷贝,克隆对象的属性但不克隆对象属性内的对象。2.通过\_\_clone方法可以深拷贝嵌套对象,避免浅拷贝问题。3.注意避免克隆中的循环引用和性能问题,优化克隆操作以提高效率。

PHP适用于Web开发和内容管理系统,Python适合数据科学、机器学习和自动化脚本。1.PHP在构建快速、可扩展的网站和应用程序方面表现出色,常用于WordPress等CMS。2.Python在数据科学和机器学习领域表现卓越,拥有丰富的库如NumPy和TensorFlow。

HTTP缓存头的关键玩家包括Cache-Control、ETag和Last-Modified。1.Cache-Control用于控制缓存策略,示例:Cache-Control:max-age=3600,public。2.ETag通过唯一标识符验证资源变化,示例:ETag:"686897696a7c876b7e"。3.Last-Modified指示资源最后修改时间,示例:Last-Modified:Wed,21Oct201507:28:00GMT。

在PHP中,应使用password_hash和password_verify函数实现安全的密码哈希处理,不应使用MD5或SHA1。1)password_hash生成包含盐值的哈希,增强安全性。2)password_verify验证密码,通过比较哈希值确保安全。3)MD5和SHA1易受攻击且缺乏盐值,不适合现代密码安全。

PHP是一种服务器端脚本语言,用于动态网页开发和服务器端应用程序。1.PHP是一种解释型语言,无需编译,适合快速开发。2.PHP代码嵌入HTML中,易于网页开发。3.PHP处理服务器端逻辑,生成HTML输出,支持用户交互和数据处理。4.PHP可与数据库交互,处理表单提交,执行服务器端任务。

PHP在过去几十年中塑造了网络,并将继续在Web开发中扮演重要角色。1)PHP起源于1994年,因其易用性和与MySQL的无缝集成成为开发者首选。2)其核心功能包括生成动态内容和与数据库的集成,使得网站能够实时更新和个性化展示。3)PHP的广泛应用和生态系统推动了其长期影响,但也面临版本更新和安全性挑战。4)近年来的性能改进,如PHP7的发布,使其能与现代语言竞争。5)未来,PHP需应对容器化、微服务等新挑战,但其灵活性和活跃社区使其具备适应能力。

PHP的核心优势包括易于学习、强大的web开发支持、丰富的库和框架、高性能和可扩展性、跨平台兼容性以及成本效益高。1)易于学习和使用,适合初学者;2)与web服务器集成好,支持多种数据库;3)拥有如Laravel等强大框架;4)通过优化可实现高性能;5)支持多种操作系统;6)开源,降低开发成本。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

SublimeText3汉化版
中文版,非常好用

SublimeText3 Linux新版
SublimeText3 Linux最新版

禅工作室 13.0.1
功能强大的PHP集成开发环境