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; } }; //echo get_class($processor); // возвращает тип класса //print_r(get_declared_classes()); //print_r(get_class_methods('ProcessSale'));
<?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));
$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));