<?php
namespace AppBase {
interface ILoader {
function bar();
}
class App {
protected $loader;
public function __construct(ILoader $loader)
{
$this->loader = $loader;
}
public function foo() {
$this->loader->bar();
}
}
class Loader implements ILoader {
function bar() {
echo 'Bark!';
}
}
}
namespace AppExample {
class App extends \AppBase\App {}
class Loader extends \AppBase\Loader {
function bar() {
echo 'Huyark!';
}
}
}
namespace {
$loader1 = new \AppBase\Loader();
$app = new \AppExample\App($loader1);
$app->foo();
$loader2 = new \AppExample\Loader();
$app = new \AppExample\App($loader2);
$app->foo();
}
PD9waHAKCm5hbWVzcGFjZSBBcHBCYXNlIHsKCQoJaW50ZXJmYWNlIElMb2FkZXIgewoJCWZ1bmN0aW9uIGJhcigpOwoJfQoKCWNsYXNzIEFwcCB7CgkgICAgcHJvdGVjdGVkICRsb2FkZXI7CgkKCSAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSUxvYWRlciAkbG9hZGVyKQoJICAgIHsKCSAgICAgICAgJHRoaXMtPmxvYWRlciA9ICRsb2FkZXI7CgkgICAgfQoJICAgIAoJICAgIHB1YmxpYyBmdW5jdGlvbiBmb28oKSB7CgkgICAgCSR0aGlzLT5sb2FkZXItPmJhcigpOwoJICAgIH0KCX0KCQoJY2xhc3MgTG9hZGVyIGltcGxlbWVudHMgSUxvYWRlciB7CgkJZnVuY3Rpb24gYmFyKCkgewoJCQllY2hvICdCYXJrISc7CgkJfQoJfQp9CgpuYW1lc3BhY2UgQXBwRXhhbXBsZSB7CgoJY2xhc3MgQXBwIGV4dGVuZHMgXEFwcEJhc2VcQXBwIHt9CgkKCWNsYXNzIExvYWRlciBleHRlbmRzIFxBcHBCYXNlXExvYWRlciB7CgkJZnVuY3Rpb24gYmFyKCkgewoJCQllY2hvICdIdXlhcmshJzsKCQl9Cgl9Cgp9CgpuYW1lc3BhY2UgewoJJGxvYWRlcjEgPSBuZXcgXEFwcEJhc2VcTG9hZGVyKCk7CgkkYXBwID0gbmV3IFxBcHBFeGFtcGxlXEFwcCgkbG9hZGVyMSk7CgkkYXBwLT5mb28oKTsKCQoJJGxvYWRlcjIgPSBuZXcgXEFwcEV4YW1wbGVcTG9hZGVyKCk7CgkkYXBwID0gbmV3IFxBcHBFeGFtcGxlXEFwcCgkbG9hZGVyMik7CgkkYXBwLT5mb28oKTsKfQ==