php回调函数用this报错
A. PHP 5.3 回调函数里面怎么使用this
$a = new myclass();
$a->fun();
在这里,你知道是用 $a-> 来调用方法,可以理解吧。。
class myclass {
function fun() {
echo 'myfun';
}
function fun1() {
//$a->fun(); 理论上是这专样,但是,你怎么知属道是 $a 呢?不知道
$this->fun(); // this 是自己的意思。因为不知道你实例化之后的变量名。
}
}
B. PHP中的回调函数是怎么实现的
第一种, 常规的php全局函数
function test($echo)
{
echo $echo, "\n";
}
$param = array("www.zeroplace.cn");
call_user_func_array(test, $param);
call_user_func_array("test", $param);
输出:
www.zeroplace.cn www.zeroplace.cn
两种调用方式都可以成功调用, 说明call_user_func_array调用常规php局函数时的第一个参数可以为函数本身,也可以为表示函数名的字符串。
第二种, 类的静态方法
class TestC
{
static function test($echo)
{
echo $echo, "\n";
}
}
$param = array("www.zeroplace.cn");
call_user_func_array(array(TestC, "test"), $param);
call_user_func_array(array("TestC", "test"), $param);
输出:
www.zeroplace.cn www.zeroplace.cn
这时传第一个参数的时候传了一个数据。数组的第一个元素可以为类本身,也可以为类名的一个字符串。第二个元素则是一个表示方法名的字符串。
第三种,对象的方法
class TestC
{
protected $_a = "hello word";
function test($echo)
{
$this->_a = $echo;
}
function show()
{
echo $this->_a, "\n";
}
}
$param = array("www.zeroplace.cn");
$obj = new TestC();
call_user_func_array(array($obj, "test"), $param);
$obj->show();
$obj->test("WEB应用开发");
$obj->show();
输出:
www.zeroplace.cn WEB应用开发
这里是调用一个对象的方法。从test方法中设置对象的_a成员,然后通过show方法将它显示出来,以验证call_user_func_array调用方法时可以正确等到$this指针。这里输出的结果表明已经上面的方法是奏效的。其实回调对象的方法还有一种更加简单的方法,直接$obj->{$method}()就可以调用,只要{$method}是存在的。
C. PHP回调函数的几种用法
具体代码如下:
<?php
$ch = curl_init();
$timeout = 5;
curl_setopt ($ch, CURLOPT_URL, '');
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
echo $file_contents;
?>
PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。
它可以比CGI或者回Perl更快速地执行动态网页。答用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,
执行效率比完全生成HTML标记的CGI要高许多;
PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。
D. 关于php回调函数的问题。下面是看到的一个例子。没看懂回调函数到底有什么作用。
可以根据你的函数需要去确定你需要调用的函数回的名称。答
<?php
$a=array('hello','world');
foreach($aas$value){
call_user_func_array($value,$params);
}
?>
E. PHP 5.3 回调函数里面怎么使用this
$a = new myclass();
$a->fun();
在这里,你知道是用 $a-> 来调用方法,可以理解吧。。
class myclass {
function fun() {
echo 'myfun';
}
function fun1() {
//$a->fun(); 理论上是这样,但是,你怎么专知道是 $a 呢?不知道
$this->fun(); // this 是自属己的意思。因为不知道你实例化之后的变量名。
}
}
更多问题,欢迎去php中文网问答社区,大神在线帮你解答。希望对你有帮助
F. 关于PHP中函数的回调函数
有影响的。这个函数的回调函数的作用不是比较值的大小,而是在比较值相同之后,比较key是否相等
比如compare如果这样写:
function compare($a, $b) {
return 0;
}
表示认为无论什么键都相等,返回的结果是
Array
(
[b] => brown
[0] => yellow
[2] => red
)
-----
function compare($a, $b) {
return 1;
}
认为无论什么样的键都不相等,返回的结果是空数组array();
---------------------------
这个就涉及他内部的算法了因为涉及混合数组的算法太复杂,用一个简单的例子举例:
<?php
$arr1 = array('a'=>1, 'b'=>2, 'c'=>3);
$arr2 = array('a'=>1, 'B'=>2, 'C'=>3);
$arr3 = array('a'=>1, 'b'=>2, 'c'=>3);
$arr4 = array('A'=>1, 'b'=>2, 'C'=>3);
function compare($a, $b) {
if($a === $b) {
return 0;
} else
return 1;
}
print_r(array_intersect_uassoc($arr1,$arr2, 'compare'));
print_r(array_intersect_uassoc($arr3,$arr4, 'compare'));
?>
会发现,第一次比较会返回 a=>1 第二次比较会是空
这个特殊的现象跟他内部算法有关,这个函数会做三件事:
对$arr1调用回调函数从小到大冒泡排序
对$arr2也排序
然后比较$arr1的第一个键和$arr2的第一个键,如果相等,比较值,如果不等,比较$arr1的第一个键和$arr2的第二个键,一直到循环结束。
对$arr1和$arr2最开始比较的是 a, a 调用compare(a,a) 返回是0, 所以认为两个键值相等。
对$arr3和$arr4,调用 compare(a,A) 不等, 调用compare(a, b)不等,调用compare(a, C)不等, 就退出循环了, 所以返回空
你问的这个问题也是这个原因
写成
function compare($a, $b) {
if($a > $b)
return 1;
else if($a < $b)
return -1;
else return 0;
}
就会发现yellow了
G. PHP回调函数到底是个啥
当做一个变量去理解比较容易,比如$a=function(){echo "aaa";};$aa();或者function a(){};将函数名作为一内个变量去赋值;容$b="a"; $b();一个是匿名函数作为变量去调用,另一个是函数名作为变量去调用,这就是回调函数常用的方式,简单来说,就这把这样调用函数的方式叫做回调函数,个人经验分享而已,O(∩_∩)O哈哈~
H. php回调函数如何传入第二个参数
我帮你查询了SaeFetchurl的文档,其内部实现应该无法满足你的需求。
但可以使用变通的方法:使用类专方法作为回调函数属,在构造类时传递$pid参数
<?php
classCtx{
publicfunction__construct($pid){
$this->pid=$pid;
}
publicfunctiondemo($content){
//...dosomethingwith$this->pidand$content
}
}
$furl=newSaeFetchurl();
$pid=5780859;
$furl->fetch($url,$opt,array(newCtx($pid),'demo'));
I. php 框架 怎么使用回调函数
前言
最近在开发一个PHP系统,为了提高系统的扩展性,我想在系统中加入类似Javascript的事件处理机制,例如:我想在一篇新闻被添加以后,我想记录一下日志,用类似Javascript的代码,应该是这样写的:
function fnCallBack( $news )
{
//将$news的信息记录到日志中
writeLog( $news->getTitle().' has been added successfully!');
}
$newsEventManager->addEventListener( 'add' , fnCallBack );
其中,fnCallBack函数是回调函数,addEventListener表示监听newsEventManager的add事件。当一篇news被add以后,系统就会调用fnCallBack函数,从而完成writeLog的动作。
但是,PHP中的函数传递方法和Javascript有很大的不同。在Javascript中,函数也是对象,它可以很方便的当作参数传递,但是PHP不行。
$newsEventManager->addEventListener( 'add' , fnCallBack );
上面这行代码中的fnCallBack,看上去好像是那个函数的句柄,但实质上它是一个字符串,并不是我们所要的函数。
为了实现我们的事件模型,有必要研究一下PHP的回调函数的实现方法。
全局函数的回调
这里的全局函数的意思,是直接使用function定义的函数,它不包含在任何对象或类之中。请看下面的例子
示例代码
function fnCallBack( $msg1 , $msg2 )
{
echo 'msg1:'.$msg1;
echo "<br />\n";
echo 'msg2:'.$msg2;
}
$fnName = "fnCallBack";
$params = array( 'hello' , 'world' );
call_user_func_array( $fnName , $params );
代码说明:
这里使用了PHP内置的函数call_user_func_array来进行调用。call_user_func_array有两个参数,第1个参数是一个字符串,表示要调用的函数名,第2个参数是一个数组,表示参数列表,按照顺序依次会传递给要调用的函数。
效果如下:
类的静态方法的回调
如果我们要回调的方法,是一个类的静态方法,那怎么办呢?我们依然可以利用PHP内置的call_user_func_array方法来进行调用,请看示例:
示例代码:
class MyClass
{
public static function fnCallBack( $msg1 , $msg2 )
{
echo 'msg1:'.$msg1;
echo "<br />\n";
echo 'msg2:'.$msg2;
}
}
$className = 'MyClass';
$fnName = "fnCallBack";
$params = array( 'hello' , 'world' );
call_user_func_array( array( $className , $fnName ) , $params );
代码说明:
这段代码和第1种方法的代码很相似,我们将类名(MyClass)也作为call_user_func_array的第1个参数传递进去,就可以实现类的静态方法的回调了。注意,这时call_user_func_array的第1个参数是一个数组了,数组的第1个元素是类名,第二个元素是要调用的函数名
运行结果:
(其实和第1种方法的结果是一样的 ^_^ )
继续研究
如果我用这种方法调用一个类的非静态方法(也就是把static去掉),会出现什么结果呢?请看下面代码
class MyClass
{
public function fnCallBack( $msg1 , $msg2 )
{
echo 'msg1:'.$msg1;
echo "<br />\n";
echo 'msg2:'.$msg2;
}
}
$className = 'MyClass';
$fnName = "fnCallBack";
$params = array( 'hello' , 'world' );
call_user_func_array( array( $className , $fnName ) , $params );
运行结果
和前面的结果还是一样的。。。
现在我为这个类添加一点属性,并在方法中引用
class MyClass
{
private $name = 'abc';
public function fnCallBack( $msg1 , $msg2 )
{
echo 'object name:'.$this->name;
echo "<br />\n";
echo 'msg1:'.$msg1;
echo "<br />\n";
echo 'msg2:'.$msg2;
}
}
$className = 'MyClass';
$fnName = "fnCallBack";
$params = array( 'hello' , 'world' );
call_user_func_array( array( $className , $fnName ) , $params );
运行结果
出现解析错误,提示$this没有在对象环境下出现,说明这个方法不能用类来调用,而是要用对象来调用。那我们就修改一下代码,创建一个对象:
class MyClass
{
public function fnCallBack( $msg1 , $msg2 )
{
echo 'msg1:'.$msg1;
echo "<br />\n";
echo 'msg2:'.$msg2;
}
}
$myobj = new MyClass();
$className = 'myobj';
$fnName = "fnCallBack";
$params = array( 'hello' , 'world' );
call_user_func_array( array( $className , $fnName ) , $params );
运行结果:
提示call_user_func_array的第1个参数非法,也就是说,调用失败。看来我们不能用call_user_func_array方法来回调一个对象的方法了,那么如何实现对象方法的回调的?
对象的方法的回调
我先用最原始的字符串形式的调用方法尝试了一下,如下所示:
class MyClass
{
private $name = 'abc';
public function fnCallBack( $msg1 = 'default msg1' , $msg2 = 'default msg2' )
{
echo 'object name:'.$this->name;
echo "<br />\n";
echo 'msg1:'.$msg1;
echo "<br />\n";
echo 'msg2:'.$msg2;
}
}
$myobj = new MyClass();
$fnName = "fnCallBack";
$params = array( 'hello' , 'world' );
$myobj->$fnName();
成功了,输出结果
调用是成功了,不过如何把参数params传给这个方法呢,如果把params直接传进去,那么它会作为1个参数,怎么把params拆开来传进去呢?
查了下PHP手册,找到了create_function函数,这个方法可以用字符串来创建一个匿名函数,好,有思路了,可以创建一个匿名的函数,在这个匿名函数中,调用我们的回调函数,并把参数传进去。
我先手动创建一个匿名函数anonymous,在这个函数中,用前面试出来的方法调用回调函数,如下所示:
class MyClass
{
private $name = 'abc';
public function fnCallBack( $msg1 = 'default msg1' , $msg2 = 'default msg2' )
{
echo 'object name:'.$this->name;
echo "<br />\n";
echo 'msg1:'.$msg1;
echo "<br />\n";
echo 'msg2:'.$msg2;
}
}
$myobj = new MyClass();
$fnName = "fnCallBack";
$params = array( 'hello' , 'world' );
function anonymous()
{
global $myobj;
global $fnName;
global $params;
$myobj->$fnName( $params[0] , $params[1] );
}
anonymous();
成功了,可以看到,对象的属性name也输出来了
然后,我用create_function来创建这个匿名函数,同时,代码中的params[0],params[1]应该是动态生成的,代码如下:
$strParams = '';
$strCode = 'global $myobj;global $fnName;global $params;$myobj->$fnName(';
for ( $i = 0 ; $i < count( $params ) ; $i ++ )
{
$strParams .= ( '$params['.$i.']' );
if ( $i != count( $params )-1 )
{
$strParams .= ',';
}
}
$strCode = $strCode.$strParams.");";
$anonymous = create_function( '' , $strCode);
$anonymous();
这段代码可以定义一个匿名函数,并保存在$anonymous变量中,最后调用这个$anonymous,实现了方法的回调,如图
PHP事件模型(观察者模式)的实现思路
至此,PHP中的3种常见的函数类型(全局函数,类静态函数,对象的方法)都可以回调了,可以实现文章一开始说的事件模型了 :)
事件模型模仿Firefox的Javascript实现,有3个方法,分别是
addEventListener:注册一个事件上的响应回调函数
removeEventListener:删除一个事件上的响应回调函数
fire:触发一个事件,也就是循环调用所有响应这个事件的回调函数
不过,由于第2、第3种方法需要传递上下文(也就是类名和对象名),所以addEventListener和removeEventListener应该有3个参数,我是这样设计的:
function addEventListener( $evtName , $handler , $scope = null )
第1个参数表示事件名,字符串类型
第2个参数表示回调函数名,字符串类型
第3个参数$scope是上下文环境,一共有3种类型,null表示传入的handler函数是一个全局函数,字符串类型表示传入的handler函数是scope类的静态函数,对象类型表示传入的scope是一个对象,handler函数是对象的一个方法。
function fire( $evtName , $params = null )
这个方法内,会读取出所有响应evtName的handler,然后判断它对应的scope,如果是null,则用本文第1种方法回调,如果是字符串,则用本文第2种方法回调,如果是对象,则用本文第3种方法回调。这样,一个PHP的事件模型就可以实现了,而且可以将回调函数放在某个对象中。
J. php中的回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作内为参数传递给另一个函数容,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
php提供了两个内置函数call_user_func()和call_user_func_array()提供对回调函数的支持。这两个函数的区别是call_user_func_array是以数组的形式接收回调函数的参数的,看它的原型就知道了:mixed call_user_func_array ( callable $callback,array$param_arr ),它只有两个参数。而call_user_func($callback,参数1,参数2,…)的参数个数根据回调函数的参数来确定的。