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?
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
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With