<?php
class Kitchen
{
private $yummy = 'cake';
}
class MapperX
{
public function map(Kitchen $kitchen, array $data)
{
$mapper = $this;
$map = function (Kitchen $kitchen, array $data) use ($mapper) {
$mapper->setYummy($kitchen, $data);
};
$map = Closure::bind($map, null, $kitchen);
$map($kitchen, $data);
}
public function setYummy(Kitchen $kitchen, array $data)
{
$kitchen->yummy = $data['yummy'];
}
}
class Mapper
{
public function setYummy(Kitchen $kitchen, array $data)
{
return function (Kitchen $kitchen) {
$kitchen->yummy = $data['yummy'];
};
}
}
$kitchen = new Kitchen;
$mapper = new Mapper;
$clj = $mapper->setYummy($kitchen, ['yummy' => 'cookie']);
$clj->bindTo($kitchen);
$clj();
var_dump($kitchen);
/*
$sweetsThief = function (Kitchen $kitchen) {
return $kitchen->yummy;
};
$sweetsCop = function (Kitchen $kitchen, $yummy) {
$kitchen->yummy = $yummy;
};
$kitchen = new Kitchen();
$sweetsThief = Closure::bind($sweetsThief, null, $kitchen);
$sweetsCop = Closure::bind($sweetsCop, null, $kitchen);
var_dump($sweetsThief($kitchen));
$sweetsCop($kitchen, 'lie');
var_dump($sweetsThief($kitchen));
*/
preferences:
46.21 ms | 402 KiB | 5 Q