Я хотел бы перебирать массив и динамически создавать функции на основе каждого элемента. Мой псевдокод:
$array = array('one', 'two', 'three'); foreach ($array as $item) { public function $item() { return 'Test'.$item; } }
Как мне это сделать?
Вместо «создания» функций вы можете использовать магический метод __call()
, так что, когда вы вызываете «несуществующую» функцию, вы можете справиться с ней и выполнить правильное действие.
Что-то вроде этого:
class MyClass{ private $array = array('one', 'two', 'three'); function __call($func, $params){ if(in_array($func, $this->array)){ return 'Test'.$func; } } }
Затем вы можете позвонить:
$a = new MyClass; $a->one(); // Testone $a->four(); // null
ДЕМО: http://ideone.com/73mSh
EDIT : Если вы используете PHP 5.3+, вы действительно можете делать то, что вы пытаетесь сделать в своем вопросе!
class MyClass{ private $array = array('one', 'two', 'three'); function __construct(){ foreach ($this->array as $item) { $this->$item = function() use($item){ return 'Test'.$item; }; } } }
Это работает, за исключением того, что вы не можете напрямую вызвать $a->one()
, вам нужно сохранить его как переменную .
$a = new MyClass; $x = $a->one; $x() // Testone
class MethodTest { private $_methods = array(); public function __call($name, $arguments) { if (array_key_exists($name, $this->_methods)) { $this->_methods[$name]($arguments); } else { $this->_methods[$name] = $arguments[0]; } } } $obj = new MethodTest; $array = array('one', 'two', 'three'); foreach ($array as $item) { // Dynamic creation $obj->$item((function ($a){ echo "Test: ".$a[0]."\n"; })); // Calling $obj->$item($item); }
Вышеприведенный пример выводит:
Test: one Test: two Test: three
Не уверен в использовании в вашем случае, вы можете использовать create_function для создания анонимных функций.