The Sample MySQL Record in a PHP Array
$record = array(
'id' => 12,
'title' => 'Greatest Hits',
'description' => 'The greatest hits from the best band in the world!'
);
Pretend we created the above array based on a record retrieved via a MySQL query.The PHP Class with Dynamic Functions
/* create class */
class Record {
/* record information will be held in here */
private $info;
/* constructor */
function Record($record_array) {
$this->info = $record_array;
}
/* dynamic function server */
function __call($method,$arguments) {
$meth = $this->from_camel_case(substr($method,3,strlen($method)-3));
return array_key_exists($meth,$this->info) ? $this->info[$meth] : false;
}
/* uncamelcaser: via http://www.paulferrett.com/2009/php-camel-case-functions/ */
function from_camel_case($str) {
$str[0] = strtolower($str[0]);
$func = create_function('$c', 'return "_" . strtolower($c[1]);');
return preg_replace_callback('/([A-Z])/', $func, $str);
}
}
The first step is to create a very primitive class with a constructor
which receives the record array and a __call magic method which gets
executed any time a class method is called. When a method is called we
parse the method name to remove "get" and check to see if the
corresponding array key exists. If the key exists, we return its value
-- if the key does not exist, we simple return false.The PHP Example Usage
/* usage */
$Record = new Record(
array(
'id' => 12,
'title' => 'Greatest Hits',
'description' => 'The greatest hits from the best band in the world!'
)
);
/* proof it works! */
echo 'The ID is: '.$Record->getId(); // returns 12
echo 'The Title is: '.$Record->getTitle(); // returns "Greatest Hits"
echo 'The Description is: '.$Record->getDescription(); //returns "The greatest hits from the best band in the world!"
Above we pass the array to the class and are then able to retrieve values via the "get" functions. Awesome!The above example is not the most dynamic or realistic usage of dynamic function creation but this example will get you crawling before walking. Let me know if you have better examples or real uses.