<?php require_once "closures.php"; $logger = create_function('$product', 'print " logging ({$product->name})\\n";'); $processor = new ProcessSale(); $processor->registerCallback($logger); $processor->sale(new Product("shoes", 6)); print "\n"; $processor->sale(new Product("coffee", 6));
<?php require_once "closures.php"; class Mailer { function doMail($product) { print " mailing ({$product->name})\n"; } } $processor = new ProcessSale(); $processor->registerCallback(array(new Mailer(), "doMail")); $processor->sale(new Product("shoes", 6)); print "\n"; $processor->sale(new Product("coffee", 6));
} $this->callbacks[] = $callback; } function sale($product) { echo $product->name . ': обрабатывается ...'; foreach ($this->callbacks as $callback) { call_user_func($callback, $product); } } } $logger = create_function('$product', 'echo "Записываем " . $product->name;'); $logger2 = function ($product) { echo 'Отписываем ' . $product->name; }; $processor = new ProcessSale(); $processor->registerCallback($logger); $processor->registerCallback($logger2); $processor->sale(new Product('Туфли', 6)); echo '<br />'; $processor->sale(new Product('Кофе', 6)); // Использование внешних переменных как контекст при выполнении анонимной функции $amt = 7; $count = 0; $zamikanie = function ($product) use($amt, &$count) { $count += $product->price; echo 'Сумма ' . $count; if ($count > $amt) { echo $count; } };
$count += $product->price; // добавляет к счетчику суммы товаров, цену товара print "сумма {$count} <br>"; // выводит сумму товара if ($count > $amt) { // если сумма товара выше заданной суммы, то выводим сообщение print "продано товаров на сумму {$count} <br>"; } }; } } $logger = create_function('$product', 'print "Записываем {$product->name} <br>";'); // создаём новую анонимную функцию $logger2 = function ($product) { print "Записываем {$product->name} <br>"; }; // болие удобный способ создание анонимной функции $processor = new ProcessSale(); // создаём новый объект класса ProcessSale $processor->registerCallback($logger); // записываем в массив нашу новую анонимную функцию $logger $processor->registerCallback($logger2); // записываем в массив нашу новую анонимную функцию $logger2 $processor->registerCallback([new Mailer(), "doMail"]); // записываем в массив новый метод из класс Mailer $processor->registerCallback(Totalizer::warnAmount(8)); // записываем в массив новый статичный метод класса Totalizer, который принимает сумму после которой начинает выводить определённое сообщение $processor->sale(new Product("Туфли", 6)); // передаём новый объект класса Product, в метод который который передаёт его всем записанным в массив новым функциям echo "<br>"; $processor->sale(new Product("Кофе", 6));
public $name; public $price; function __construct($name, $price) { $this->name = $name; $this->price = $price; } } class ProcessSale { private $callbacks; function registerCallback($callback) { if (!is_callable($callback)) { throw new Exception("Функци обратного вызова не вызываемая"); } $this->callbacks[] = $callback; } function sale($product) { print "{$product->name}:обрабатывается..."; foreach ($this->callbacks as $callback) { call_user_func($callback, $product); } } } $logger = create_function('$product', 'print "Записываем... ({$product->name})";'); $processor = new ProcessSale(); $processor->registerCallback($logger); $processor->sale(new Product("Туфли", 6)); $processor->sale(new Product("Кофе", 6));
<?php require_once "closures.php"; class Totalizer { static function warnAmount() { return function ($product) { if ($product->price > 5) { print " reached high price: {$product->price}\n"; } }; } } $processor = new ProcessSale(); $processor->registerCallback(Totalizer::warnAmount()); $processor->sale(new Product("shoes", 6)); print "\n"; $processor->sale(new Product("coffee", 6));