Пример #1
0
<?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));
Пример #2
0
<?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));
Пример #3
0
        }
        $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;
    }
};
Пример #4
0
            $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));
Пример #5
0
    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));
Пример #6
0
<?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));