`
bardo
  • 浏览: 378364 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
D1407912-ab64-3e76-ae37-b31aa4afa398
浅述PHP设计模式
浏览量:11807
9d6df9f7-91da-3787-a37c-0e826525dd5d
Zend Framewor...
浏览量:10116
85b628bd-a2ed-3de2-a4b1-0d34985ae8b6
PHP的IDE(集成开发环...
浏览量:9504
社区版块
存档分类
最新评论

在PHP5.2中不用Runkit 给类动态添加新方法

    博客分类:
  • PHP
PHP 
阅读更多

js中的对象可以动态添加方法. 在PHP5.2中可用Runkit 给类添加方法. 而到php5.3,增加了闭包的语法. 可以直接动态添加方法.

由于Runkit 是在PECL中的,一般无法直接使用.所以,在在PHP5.2中,也就受到了限制. 所以,人们说PHP5.2仍不是动态结构语言.

而js中的对象可以动态添加方法,这对于精简代码,减少继承与扩展,对人总有吸引力.

是否真的不能动态添加呢.其实是可以的,只不能人们没有找到实现的方法.

现在我们就讲解一下,如何动态添加:

<?php

class ActiveStruct { 
	
  var $lambda=array();  //定义保存动态方法的数组
  
  //定义动态添加方法的方法
  function addFunction($name,$code) { 
  	$func=create_function('',$code); 
    $this->lambda[$name] = $func; 
  } 
  
  //为动态添加的方法增加调用接口
  function __call($name,$args){
  	if (array_key_exists($name,$this->lambda)){
	  	$func = $this->lambda[$name]; 
	    return $func($args); 
  	}
  } 
} 

//创建对象
$objAcst = new ActiveStruct(); 
//添加新方法
$objAcst->addFunction('newFunc', '$vars = func_get_args(); return ($vars[0][0].$vars[0][1]);'); 
//对新方法进行测试
$testResult=$objAcst->newFunc('Hello,',' Php! '); 
echo($testResult);

?>

 

需要注意的是, 使用这一方式,动态添加的方法,我们不能显式声明变量的个数.而在动态添加的方法内部.要获取传入的参数,只能通过:

$vars = func_get_args();

无论多少个变量,传入的参数均是在$vars[0]中

所以,要了解传入多少个参数,那就需要用 count($vars[0]);

对参数的使用则是:

$vars[0][0], $vars[0][1], 依次类推.

 

另外的不足,则是,因为是用create_function实现的,所以,代码要写成字串.

其次则是 __call函数使用,会影响效率.

 

尽管如此,却为你能够在虚拟主机的空间,使方法能动态添加成为可能! 所以, 需要时,还是可以用的.

 

当然,如果你有更好的改进办法, 也请你告诉我!

 

0
0
分享到:
评论

相关推荐

    PHP的AOP扩展Runkit.zip

    在用runkit提供的动态添加方法的函数添 加方法时,也忠实方法原来的命名,带着大写字母就直接添进去了,结果,再调用被钩的方法的时候,报错,死活也找不着原来的那个方法了,原因应该就 是,php在解析执行类、方法...

    phpunit-mockfunction:PHPUnit扩展,它使用runkit来模拟PHP函数(用户定义的和系统的)或静态方法,并使用模拟对象样式的调用匹配器,参数约束和所有魔术

    有关工作版本,请参见 为了能够模拟系统功能(不是用户定义的功能),您需要在PHP配置中打开runkit.internal_override 。安装如果您使用作曲家,则安装MockFunction很容易: "require-dev": { "tcz/phpunit-...

    react-runkit:RunKit嵌入组件

    将RunKit嵌入库添加到您的页面: &lt; head &gt; ... &lt; script src =' https://embed.runkit.com ' &gt; &lt;/ script &gt; ... &lt;/ head &gt; 用法 const React = require ( 'react' ) const Embed = ...

    runkit:实时更改您的代码!

    &gt; ./configure$ &gt; make$ &gt; make install 然后您需要将 runkit.so 添加到您的 php.ini 配置文件并重新启动 apache 或 php-fpm ####安装 oncesk/runkit lib 安装可以使用 git clone,composer 很快就可以了$ &gt; git ...

    PHP5 完整官方 中文教程

    runkit — runkit Functions SAM — SAM - Simple Asynchronous Messaging Satellite — Satellite CORBA client extension [deprecated] SCA — SCA Functions SDO — SDO Functions SDO DAS XML — SDO XML Data ...

    PHP5中文参考手册

    runkit — runkit Functions SAM — SAM - Simple Asynchronous Messaging Satellite — Satellite CORBA client extension [deprecated] SCA — SCA Functions SDO — SDO Functions SDO DAS XML — SDO XML Data ...

    ember-runkit:Man RunKit组件

    ember-runkit 用于RunKit嵌入的Ember组件。 安装 $ ember install ember-runkit 将RunKit嵌入库添加到您的app/index.html : {{ content-for " head " }} ... &lt; script src = " ...

    PHP手册2007整合中文版

    PHP,即“PHP: Hypertext Preprocessor”,是一种被广泛使用的开放源代码多用途脚本语言,尤其适用于 web 开发并可以嵌入到 HTML 中去。其语法利用了 C,Java 和 Perl,非常容易学习。该语言的主要目标是让 web 开发...

    soft-mocks:PHP模拟引擎,允许即时重新定义函数和用户方法(提供与runkit和uopz扩展类似的功能)

    它通过在文件包含过程中即时重写代码来工作,而不是使用诸如runkit或uopz之类的扩展名。 安装 您可以通过安装SoftMocks: composer require --dev badoo/soft-mocks 用法 使SoftMocks与众不同(并限制其使用)的是...

    PHP官方手册中文版

    runkit Functions CXL. SAM - Simple Asynchronous Messaging CXLI. Satellite CORBA client extension [deprecated] CXLII. SCA Functions CXLIII. SDO Functions CXLIV. SDO XML Data Access Service ...

    php帮助文档,php。chm,php必备的中文手册

    runkit Functions CXXVIII. Satellite CORBA client extension [deprecated] CXXIX. SDO Functions CXXX. SDO XML Data Access Service Functions CXXXI. SDO Relational Data Access Service Functions CXXXII. ...

    php手册.chm,php手册

    runkit Functions CXXV. SDO Functions CXXVI. SDO Relational Data Access Service Functions CXXVII. SDO XML Data Access Service Functions CXXVIII. Secure Shell2 Functions CXXIX. Semaphore, Shared Memory...

    php手册PHP5研究室编无乱码版本chm

    runkit Functions CXXV. SDO Functions CXXVI. SDO Relational Data Access Service Functions CXXVII. SDO XML Data Access Service Functions CXXVIII. Secure Shell2 Functions CXXIX. Semaphore, Shared ...

    框架:开始! AOP PHP-用于新水平软件开发的现代面向方面的框架

    走! 面向方面PHP框架 走! AOP是纯PHP的一种现代的,... 拦截静态方法和最终类中方法的执行。 拦截特征中方法的执行。 拦截对象的公共/受保护属性的访问。 钩子用于静态类初始化(在类加载到PHP内存中之后)。 用

    PHP函数参考手册大全

    runkit Functions CXXV. SDO Functions CXXVI. SDO Relational Data Access Service Functions CXXVII. SDO XML Data Access Service Functions CXXVIII. Secure Shell2 Functions CXXIX. Semaphore, Shared Memory...

    中文版PHP使用手册

    runkit Functions CXXV. SDO Functions CXXVI. SDO Relational Data Access Service Functions CXXVII. SDO XML Data Access Service Functions CXXVIII. Secure Shell2 Functions CXXIX. Semaphore, Shared Memory...

    PHP5 开发手册 简体中文手册

    runkit Functions CXXVII. Satellite CORBA client extension [deprecated] CXXVIII. SDO Functions CXXIX. SDO XML Data Access Service Functions CXXX. SDO Relational Data Access Service Functions CXXXI. ...

    经典收藏最全php5.0查询手册

    runkit Functions CXXV. SDO Functions CXXVI. SDO Relational Data Access Service Functions CXXVII. SDO XML Data Access Service Functions CXXVIII. Secure Shell2 Functions CXXIX. Semaphore, Shared Memory...

    PHP手册(带评论版-2008-03-14).part2.rar

    runkit Functions CXXV. SDO Functions CXXVI. SDO Relational Data Access Service Functions CXXVII. SDO XML Data Access Service Functions CXXVIII. Secure Shell2 Functions CXXIX. Semaphore, Shared Memory...

    PHP手册(带评论版-2008-03-14).part1.rar

    runkit Functions CXXV. SDO Functions CXXVI. SDO Relational Data Access Service Functions CXXVII. SDO XML Data Access Service Functions CXXVIII. Secure Shell2 Functions CXXIX. Semaphore, Shared Memory...

Global site tag (gtag.js) - Google Analytics