call_user_func

【PHP源码】PHP 函数调用

≡放荡痞女 提交于 2020-04-07 20:46:29
想法 我以前对于 C 语言的印象是有很强的确定性,而 PHP 在执行的时候会被翻译为 C 语言执行,所以一直很好奇 PHP 怎么调用底层函数。 换句话说就是已知函数名字的情况下如何调用 C 语言中对应名字的函数? 解决这个问题前,首先根据过往的经验做出假设,然后再去验证。 之前在写《用 C 语言实现面向对象》的时候,就意识到使用 void 指针实现很多功能,包括指向任意的函数。接着在写《PHP 数组底层实现》的时候,了解了 HashTable 的实现,即在 C 语言层面通过字符串 key 找到任意类型值。 现在把两者结合起来,是否就能解决以上问题了?比如说把函数名作为 HashTable 的 key,函数指针作为 HashTable 的 value,这样就可以通过函数名获取函数指针来调用函数了。 接下来通过查看 PHP 的源码来看这个假设与真实情况有多少差距。 总体分为三个步骤: 从 PHP 层进入 C 语言层 找到字符串函数名与函数的关系 函数的调用 注:这篇博客的源码对应的版本是 PHP 7.4.4 。 https://github.com/php/php-src/tree/php-7.4.4 从 PHP 层进入 C 语言层 首先要找到 C 语言层调用函数的地方。怎么找? 经常使用 PHP 的同学看到前面的问题描述很容易联想到 PHP

搭建自己的PHP框架心得(二)

被刻印的时光 ゝ 提交于 2020-01-11 01:49:58
/*--> */ /*--> */ 续言 对于本次更新,我想说: 本框架由本人挑时间完善,而我还不是PHP大神级的人物,所以框架漏洞难免,求大神们指出。 本框架的知识点应用都会写在博客里,大家有什么异议的可以一起讨论,也希望看博客的也能学习到它们。 本次更新,更新了函数规范上的一些问题,如将函数尽量的独立化,每一个函数尽量只单独做好一件事情,尽量减少函数依赖。还对框架的整体优化了一下,添加了SQ全局类,用以处理全局函数,变量。 再次贴出GITHUB地址: Sqier框架GITHUB地址 回调函数 替换了很low的类名拼装实例化,然后拼装方法名的用法,使用PHP的回调函数方式: 原代码: $controller_name = 'Controller\\' . self::$c_name; $action_name = self::$a_name . 'Action'; $controller = new $controller_name(); $controller->$action_name(); 修改后代码 $controller_name = 'Controller\\' . self::$c_name; $controller = new $controller_name(); call_user_func([ $controller, self::$a_name .

Laravel 5.8 RCE 分析

我是研究僧i 提交于 2019-12-19 00:29:33
原帖地址 : https://xz.aliyun.com/t/6059 Laravel 代码审计 环境搭建 composer create-project --prefer-dist laravel/laravel laravel58 安装 Laravel 5.8 并生成 laravel58 项目 进入项目文件夹,使用 php artisan serve 启动 web 服务 在 laravel58/routes/web.php 文件添加路由 Route::get("/","\App\Http\Controllers\DemoController@demo"); 在 laravel58/app/Http/Controllers/ 下添加 DemoController.php 控制器 <?php namespace App\Http\Controllers; class DemoController extends Controller { public function demo() { if(isset($_GET['c'])){ $code = $_GET['c']; unserialize($code); } else{ highlight_file(__FILE__); } return "Welcome to laravel5.8"; } } 漏洞分析 ph 牛的

php中call_user_func()与call_user_func_array()区别

Deadly 提交于 2019-12-01 13:03:23
call_user_func:把一个参数作为回调函数调用 用法说明: call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] ) : mixed 参数说明: 第一个参数$callback作为回调函数,其它参数都是回调函数的参数。 $parameter:传入回调$callback函数的参数,这里的参数注意不能引用传递。 下面简单例子分别说明了在不同情况下使用call_user_func: //先引用,后执行 function _call($call){ echo $call++.'<br/>'; echo $call++.'<br/>'; return $call; } $rs = call_user_func('_call',1); var_dump($rs); //结果 //1 //2 //int(3) 先执行,后引用 $arg = 1; call_user_func(function ($call){ echo ++$call.'<br/>'; echo ++$call.'<br/>'; },$arg); //结果为2,3 回调函数不传值,通过func_get_arg和func_get_args获取参数 $argOne = 1; $argTwo = 2;10 call_user_func