Reputation: 927
I'd like to iterate over an array and dynamically create functions based on each item. My pseudocode:
$array = array('one', 'two', 'three');
foreach ($array as $item) {
public function $item() {
return 'Test'.$item;
}
}
How should I go about doing this?
Upvotes: 25
Views: 25802
Reputation: 786
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);
}
The above example will output:
Test: one
Test: two
Test: three
Upvotes: 4
Reputation: 227260
Instead of "creating" functions, you can use the magic method __call()
, so that when you call a "non-existent" function, you can handle it and do the right action.
Something like this:
class MyClass{
private $array = array('one', 'two', 'three');
function __call($func, $params){
if(in_array($func, $this->array)){
return 'Test'.$func;
}
}
}
Then you can call:
$a = new MyClass;
$a->one(); // Testone
$a->four(); // null
DEMO: http://ideone.com/73mSh
EDIT: If you are using PHP 5.3+, you actually can do what you are trying to do in your question!
class MyClass{
private $array = array('one', 'two', 'three');
function __construct(){
foreach ($this->array as $item) {
$this->$item = function() use($item){
return 'Test'.$item;
};
}
}
}
This does work, except that you can't call $a->one()
directly, you need to save it as a variable.
$a = new MyClass;
$x = $a->one;
$x() // Testone
DEMO: http://codepad.viper-7.com/ayGsTu
Upvotes: 34