<?php
class car {
//method to get class method
public function get_method($method_name) {
$class = new ReflectionClass
(get_class($this)); $method = $class->getMethod($method_name);
$method->setAccessible(true);
return $method;
}
public function exec_method
($method_name, $arg_args=array()) {
//execute the pre() function before the specified method
$this->pre();
//execute the specified method
$this->get_method($method_name)->invokeArgs($this, $arg_args);
}
public function pre() {
echo 'pre';
echo '<br />';
}
}
class toyota extends car {
private function drive() {
echo 'drive';
echo '<br />';
}
private function brake() {
echo 'brake';
echo '<br />';
}
}
$toyota = new toyota();
$toyota->exec_method('drive');
$toyota->exec_method('brake');
?>
PD9waHAKCgljbGFzcyBjYXIgewoJCQoJCS8vbWV0aG9kIHRvIGdldCBjbGFzcyBtZXRob2QKCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X21ldGhvZCgkbWV0aG9kX25hbWUpIHsKCQkJJGNsYXNzID0gbmV3IFJlZmxlY3Rpb25DbGFzcyhnZXRfY2xhc3MoJHRoaXMpKTsKCQkJJG1ldGhvZCA9ICRjbGFzcy0+Z2V0TWV0aG9kKCRtZXRob2RfbmFtZSk7CgkJCSRtZXRob2QtPnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCXJldHVybiAkbWV0aG9kOwoJCX0KCQkKCQlwdWJsaWMgZnVuY3Rpb24gZXhlY19tZXRob2QoJG1ldGhvZF9uYW1lLCAkYXJnX2FyZ3M9YXJyYXkoKSkgewoJCQkKCQkJLy9leGVjdXRlIHRoZSBwcmUoKSBmdW5jdGlvbiBiZWZvcmUgdGhlIHNwZWNpZmllZCBtZXRob2QKCQkJJHRoaXMtPnByZSgpOwoJCQkKCQkJLy9leGVjdXRlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCgkJCSR0aGlzLT5nZXRfbWV0aG9kKCRtZXRob2RfbmFtZSktPmludm9rZUFyZ3MoJHRoaXMsICRhcmdfYXJncyk7CgkJfQoJCQoJCXB1YmxpYyBmdW5jdGlvbiBwcmUoKSB7CgkJCWVjaG8gJ3ByZSc7CgkJCWVjaG8gJzxiciAvPic7CgkJfQoJfQoJCgljbGFzcyB0b3lvdGEgZXh0ZW5kcyBjYXIgewoJCXByaXZhdGUgZnVuY3Rpb24gZHJpdmUoKSB7CgkJCWVjaG8gJ2RyaXZlJzsKCQkJZWNobyAnPGJyIC8+JzsKCQl9CgkJCgkJcHJpdmF0ZSBmdW5jdGlvbiBicmFrZSgpIHsKCQkJZWNobyAnYnJha2UnOwoJCQllY2hvICc8YnIgLz4nOwoJCX0KCX0KCQoJJHRveW90YSA9IG5ldyB0b3lvdGEoKTsKCSR0b3lvdGEtPmV4ZWNfbWV0aG9kKCdkcml2ZScpOwoJJHRveW90YS0+ZXhlY19tZXRob2QoJ2JyYWtlJyk7Cj8+