<?php
class User {}
class Contact {}
class MyClass {
private $handler;
public function setHandlerWithoutCheck($function) {
$this->handler = $function;
}
public function setHandlerWithCheck($function) {
try {
$r = new ReflectionFunction($function);
} catch (ReflectionException $e) {
throw new InvalidArgumentException('Invalid callback passed.');
}
if ($r->getNumberOfParameters() !== 2) {
throw new InvalidArgumentException('The callback must have exactly 2 arguments.');
}
static
$d = array('User', 'Contact'); foreach ($r->getParameters() as $i => $p) {
if (!$c = $p->getClass() or
strcasecmp($c->getName(), $d[$i])) { throw new InvalidArgumentException
(sprintf( 'The argument #%d must have type hinting: %s',
$i + 1,
$d[$i]
));
}
}
$this->handler = $function;
}
}
$obj = new MyClass;
$handler = function (User $user, Contact $contact) {};
$max = 100000;
$without = 0.0;
$with = 0.0;
for ($i = 0; $i < $max; ++$i) {
$obj->setHandlerWithoutCheck($handler);
$without += $b - $a;
}
for ($i = 0; $i < $max; ++$i) {
$obj->setHandlerWithCheck($handler);
$with += $b - $a;
}
printf("without check... sum:%f ave:%f\n", $without, $without / $max); printf(" with check... sum:%f ave:%f\n", $with, $with / $max);
PD9waHAKCmNsYXNzIFVzZXIge30KY2xhc3MgQ29udGFjdCB7fQoKY2xhc3MgTXlDbGFzcyB7CgogICAgcHJpdmF0ZSAkaGFuZGxlcjsKCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0SGFuZGxlcldpdGhvdXRDaGVjaygkZnVuY3Rpb24pIHsKICAgICAgICAkdGhpcy0+aGFuZGxlciA9ICRmdW5jdGlvbjsKICAgIH0KICAgIAogICAgcHVibGljIGZ1bmN0aW9uIHNldEhhbmRsZXJXaXRoQ2hlY2soJGZ1bmN0aW9uKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJHIgPSBuZXcgUmVmbGVjdGlvbkZ1bmN0aW9uKCRmdW5jdGlvbik7CiAgICAgICAgfSBjYXRjaCAoUmVmbGVjdGlvbkV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIGNhbGxiYWNrIHBhc3NlZC4nKTsKICAgICAgICB9CiAgICAgICAgaWYgKCRyLT5nZXROdW1iZXJPZlBhcmFtZXRlcnMoKSAhPT0gMikgewogICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUgY2FsbGJhY2sgbXVzdCBoYXZlIGV4YWN0bHkgMiBhcmd1bWVudHMuJyk7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyAkZCA9IGFycmF5KCdVc2VyJywgJ0NvbnRhY3QnKTsKICAgICAgICBmb3JlYWNoICgkci0+Z2V0UGFyYW1ldGVycygpIGFzICRpID0+ICRwKSB7CiAgICAgICAgICAgIGlmICghJGMgPSAkcC0+Z2V0Q2xhc3MoKSBvciBzdHJjYXNlY21wKCRjLT5nZXROYW1lKCksICRkWyRpXSkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAnVGhlIGFyZ3VtZW50ICMlZCBtdXN0IGhhdmUgdHlwZSBoaW50aW5nOiAlcycsCiAgICAgICAgICAgICAgICAgICAgJGkgKyAxLAogICAgICAgICAgICAgICAgICAgICRkWyRpXQogICAgICAgICAgICAgICAgKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHRoaXMtPmhhbmRsZXIgPSAkZnVuY3Rpb247CiAgICB9Cgp9Cgokb2JqID0gbmV3IE15Q2xhc3M7CiRoYW5kbGVyID0gZnVuY3Rpb24gKFVzZXIgJHVzZXIsIENvbnRhY3QgJGNvbnRhY3QpIHt9OwokbWF4ID0gMTAwMDAwOwokd2l0aG91dCA9IDAuMDsKJHdpdGggPSAwLjA7CmZvciAoJGkgPSAwOyAkaSA8ICRtYXg7ICsrJGkpIHsKICAgICRhID0gbWljcm90aW1lKHRydWUpOwogICAgJG9iai0+c2V0SGFuZGxlcldpdGhvdXRDaGVjaygkaGFuZGxlcik7CiAgICAkYiA9IG1pY3JvdGltZSh0cnVlKTsKICAgICR3aXRob3V0ICs9ICRiIC0gJGE7CiAgICB1bnNldCgkYSwgJGIpOwp9CmZvciAoJGkgPSAwOyAkaSA8ICRtYXg7ICsrJGkpIHsKICAgICRhID0gbWljcm90aW1lKHRydWUpOwogICAgJG9iai0+c2V0SGFuZGxlcldpdGhDaGVjaygkaGFuZGxlcik7CiAgICAkYiA9IG1pY3JvdGltZSh0cnVlKTsKICAgICR3aXRoICs9ICRiIC0gJGE7CiAgICB1bnNldCgkYSwgJGIpOwp9CnByaW50Zigid2l0aG91dCBjaGVjay4uLiBzdW06JWYgYXZlOiVmXG4iLCAkd2l0aG91dCwgJHdpdGhvdXQgLyAkbWF4KTsKcHJpbnRmKCIgICB3aXRoIGNoZWNrLi4uIHN1bTolZiBhdmU6JWZcbiIsICR3aXRoLCAkd2l0aCAvICRtYXgpOw==