- substr: documentation ( source)
- strrchr: documentation ( source)
- method_exists: documentation ( source)
<?php
abstract class Visitor
{
public final function __call(string $method, array $args)
{
if ($method === 'visit') {
$class = substr(strrchr(static::class, '\\'), 1);
$method .= $class;
die(static::class);
if (method_exists($this, $method)) {
return call_user_func_array([$this, $method], $args);
}
}
throw new Exception('Unknown method ' . $method);
}
}
interface Visitable
{
public function accept(Visitor $v);
}
class FooVisitor extends Visitor
{
public function visitFoo(Foo $foo)
{
print 'visit Foo' . PHP_EOL;
}
}
class Foo implements Visitable
{
public function accept(Visitor $v)
{
$v->visit($this);
}
}
$fv = new FooVisitor();
$f = new Foo();
$f->accept($fv);