<?php
class Container {
public $liquid;
function __construct($liquid) {
$this->liquid = $liquid;
}
function look_inside() {
return "{$this->liquid} in container";
}
static function create_with($cls, $liquid) {
return new $cls($liquid);
}
}
class Bottle extends Container {
function look_inside() {
return "bottle full of {$this->liquid}";
}
}
class Glass extends Container {
function look_inside() {
return "A glass of {$this->liquid}";
}
}
foreach(['Glass', 'Bottle'] as $c) {
echo Container::create_with($c, 'beer')->look_inside() . PHP_EOL;
}
PD9waHAKCmNsYXNzIENvbnRhaW5lciB7CiAgICBwdWJsaWMgJGxpcXVpZDsKCiAgICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbGlxdWlkKSB7CiAgICAgICAgJHRoaXMtPmxpcXVpZCA9ICRsaXF1aWQ7CiAgICB9CgogICAgZnVuY3Rpb24gbG9va19pbnNpZGUoKSB7CiAgICAgICAgcmV0dXJuICJ7JHRoaXMtPmxpcXVpZH0gaW4gY29udGFpbmVyIjsKICAgIH0KCiAgICBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlX3dpdGgoJGNscywgJGxpcXVpZCkgewogICAgICAgIHJldHVybiBuZXcgJGNscygkbGlxdWlkKTsKICAgIH0KfQoKY2xhc3MgQm90dGxlIGV4dGVuZHMgQ29udGFpbmVyIHsKICAgIGZ1bmN0aW9uIGxvb2tfaW5zaWRlKCkgewogICAgICAgIHJldHVybiAiYm90dGxlIGZ1bGwgb2YgeyR0aGlzLT5saXF1aWR9IjsKICAgIH0KfQoKY2xhc3MgR2xhc3MgZXh0ZW5kcyBDb250YWluZXIgewogICAgZnVuY3Rpb24gbG9va19pbnNpZGUoKSB7CiAgICAgICAgcmV0dXJuICJBIGdsYXNzIG9mIHskdGhpcy0+bGlxdWlkfSI7CiAgICB9Cn0KCmZvcmVhY2goWydHbGFzcycsICdCb3R0bGUnXSBhcyAkYykgewogICAgZWNobyBDb250YWluZXI6OmNyZWF0ZV93aXRoKCRjLCAnYmVlcicpLT5sb29rX2luc2lkZSgpIC4gUEhQX0VPTDsKfQo=