传递给ADD_ACTION的__CALLSTATIC方法处理程序导致PHP<5.3中出现错误

时间:2010-12-22 作者:TTL

我有一个类来处理插件的AJAX请求。该类为所有操作都有一个\\uu callStatic包装器,它随后为每个操作调用非静态方法,如下所示:

class TP_AJAX_wrapper {

 public static function __callStatic( $name, $args = null ) {
  check_ajax_referer( \'tp_ajax_nonce\' );

  $out = array();

  try {
   $res = call_user_func( array( __CLASS__, $name ) );
  } catch(Exception $e) {
   $out[\'error\'] = $e->getMessage();
  }

  $out[\'responseStatus\'] = $res ? \'ok\' : \'null\';
  $out[\'response\'] = $res;

  echo json_encode($out);

  die();
 }

 protected static function someAction() {
  return array( \'someValue\' => 3 );
 }
}
然后,我有一系列操作,我使用以下方法初始化这些操作:

foreach ( $ajax_actions as $action ) {
    add_action ( \'wp_ajax_tp_\'.$action, array( \'TP_AJAX_wrapper\', $action ) );
}
这对PHP 5.3+非常有用,但在旧版本上失败得很惨。

Warning: call\\u user\\u func\\u array()[函数.call user func array]:第一个参数应该是有效的回调,“TP\\u AJAX\\u wrapper::someAction”在中给出/path/to/wordpress/wp-includes/plugin.php 在线395

由于它是用插件编写的,可以在各种主机上使用,其中一些支持PHP 5.3,另一些不支持,因此我必须让它更灵活一些。我搞不清楚的是,有一种方法可以为旧版本的PHP模拟\\uu callStatic(在5.3中引入)。

我要寻找的是一种为旧版本模拟\\uu callStatic包装器的方法。我也尝试过使用\\uu调用,如果第一个参数是类名而不是对象,则应该使用该调用来处理静态方法调用,但我一直遇到相同的错误。

哈尔普?

2 个回复
SO网友:hakre

没有__callStatic PHP中的魔术函数<;5.3. 因此,不能将其标识为回调。

由于WordPress在使用过滤器和挂钩调用回调之前不会进行验证,因此您会收到PHP警告,因为它是在PHP上运行的<;5.3它不是有效的回调。

您可以将回调的设计更改为非静态的,并使用__call 神奇的函数available 如果您正在寻找类似的功能,请使用早期的PHP 5版本。

但坚持使用PHP 5.3并没有那么糟糕。

SO网友:t31os

http://php.net/manual/en/keyword.class.php

Caution
PHP将所有以\\uuuu开头的函数名保留为神奇。建议您不要在PHP中将函数名与\\uuuu一起使用,除非您需要一些文档化的魔术功能。

我对类知之甚少,但可能是函数使用的名称间距导致了问题。

我当然可能错了。。

结束

相关推荐

Admin-ajax.php将状态代码附加到AJAX响应

我正在编写一个插件,通过表单提交使用Ajax(jQuery with form plugin),php函数返回JSON响应。add_action( \'wp_ajax_bubbly-upload\', \'bubbly_upload_submit\' ); function bubbly_upload_submit() { // generate the response $response = json_encode( array( \'success\