I have a class that handles AJAX requests for my plugin. The class has a __callStatic wrapper for all actions, which subsequently calls non-static methods for each action, like so:

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);


 protected static function someAction() {
  return array( 'someValue' => 3 );

Then I have an array of actions which I initialize using:

foreach ( $ajax_actions as $action ) {
    add_action ( 'wp_ajax_tp_'.$action, array( 'TP_AJAX_wrapper', $action ) );

This works great for PHP 5.3+, but fails miserably on older versions.

Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'TP_AJAX_wrapper::someAction' was given in /path/to/wordpress/wp-includes/plugin.php on line 395

Since it's written in a plugin, used on all sorts of hosts, some of which support PHP 5.3, others which don't, I have to make it a little more flexible. What I can't figure out is a way to emulate __callStatic (introduced in 5.3) for older versions of PHP.

What I'm looking for is a way to emulate the __callStatic wrapper for older versions. I've tried using __call as well, which is supposed to handle static method calls if the first argument is a classname, rather than an object, but I keep getting the same error.


2 Answers 2


There is no __callStatic magic function in PHP < 5.3. As so, it can not be identified as callback.

As WordPress does not validate prior to invoke a callback with filters and hooks, you get the PHP warning because running on PHP < 5.3 it is not a valid callback.

You can change the design of your callbacks to be non-static and make use of the __call magic function which is available with earlier PHP 5 versions if you're looking for a similar feature.

But sticking to PHP 5.3 is not that bad.

  • 1
    Thanks @hakre! This is exactly why I am keen on sticking to PHP 5.3. I love progress and I wish more people would embrace it.
    – TTL
    Dec 23, 2010 at 8:29


PHP reserves all function names starting with __ as magical. It is recommended that you do not use function names with __ in PHP unless you want some documented magic functionality.

I don't know a huge deal about classes, but it might be the name spacing you're using for the function(s) causing a problem.

I could be wrong of course..

  • 1
    Nah, the issue seems to be that @TTL uses magic method (exactly as intended), but that method was only added in PHP 5.3
    – Rarst
    Dec 22, 2010 at 13:43
  • Exactly, thanks @Rarst! __callStatic was added in 5.3
    – TTL
    Dec 22, 2010 at 13:47
  • @TTL - No worries, always happy to share my thoughts... :)
    – t31os
    Dec 22, 2010 at 14:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.