Web development , php , ajax , symfony, framework, zend
In: web resources
3 Dec 2009As you have probably found out, when I see something interesting I don’t know how to do, my only goal is to figure out how to do it. Thus is the case with PHP classes featuring dynamic methods based on database records (or arrays). I took some time to figure out how it was done.
$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.
/* 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.
/* 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.
Don’t forget to follow me on Twitter and be sure to visit Script & Style for the best Javascript and CSS articles around!
Sponsor the David Walsh Blog and get your brand in front of several thousand users per day!
Create PHP Classes with Dynamic Functions
Related posts:
This blog delivers stylish and dynamic news for designers and web-developers on all subjects of design, ranging from: CSS, Ajax, Javascript, web design, graphics, typography, advertising & much more. Our goal is to help you communicate effectively on the web with an engaging website or functional interface.