dttwois6098
2012-02-08 01:50
浏览 57
已采纳

是否可以在类范围中定义匿名函数?

I'd like to assign anonymous functions to arrays in PHP inside of a class, but I keep stumbling over syntax errors.

class Stuff {
  private $_preference_defaults = array(
    'cookie'    => true,
    'session'   => true,
    'database'  => true,
    'filter'    => function($input) { return true; },
    'sanitizer' => function($input) { return $input; },
  );
};

Will throw an unexpected T_FUNCTION syntax error, and it doesn't matter whether or not the array is static. I got desperate and tried the "old" way of doing it:

class Stuff {
  private $_preference_defaults = array(
    'cookie'    => true,
    'session'   => true,
    'database'  => true,
    'filter'    => create_function('$input', 'return true;'),
    'sanitizer' => create_function('$input', 'return $input;'),
  );
};

And this led to an unexpected '(', expecting ')' syntax error. However, if I define the functions ahead of time, it does work:

class Stuff {
  function _preference_default_filter($input) {
    return true;
  }
  function _preference_default_sanitizer($input) {
    return true;
  }
  private $_preference_defaults = array(
    'cookie'    => true,
    'session'   => true,
    'database'  => true,
    'filter'    => _preference_default_filter,
    'sanitizer' => _preference_default_sanitizer,
  );
};

And then I'm able to call those functions within a class method:

function do_stuff($foo) {
  return $this->{$this->_preference_defaults['filter']}($foo);
}

Not only is this syntactically sour, in my head it wreaks of poor style and I can imagine this sort of trickery causing headaches in the future.

  1. Am I not able to create an anonymous function at class (static) scope? (I'm thinking maybe because a valid Closure object cannot be created in that context?)
  2. Is there a more... PHP... means to the same end? That is to say, is there a "better" way of assigning trivial default callbacks to array values in class scope? The final snippet I provided gets the job done for sure, but I'd prefer a solution that won't leave me asking the optometrist for a stronger prescription.
  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

3条回答 默认 最新

相关推荐 更多相似问题