cel*_*owm 7 php java porting command-pattern runnable
出于学习目的,我正在尝试将此 Java 命令模式示例迁移到 PHP:
https://codereview.stackexchange.com/questions/52110/command-pattern-implementation
正如@simon 所评论的那样,使用方法引用运算符,可以使代码现代化很多:
class MyCommand implements Order {
private final Runnable action;
public MyCommand(Runnable action) {
this.action = action;
}
@Override
public void execute() {
action.run();
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以创建这样的命令:
MyCommand bsc = new MyCommand(stock::buy);
MyCommand ssc = new MyCommand(stock::sell);
Run Code Online (Sandbox Code Playgroud)
我当前的 PHP 实现在这里:https : //3v4l.org/iIHn9
那么在 PHP 中实现MyCommand 类的最佳方法是什么?
正如 Evgeniy 已经提到的,您可以使用call_user_func()。
由于有很多方法可以解决这个问题,因此我已将我的解决方案添加到您的问题中。您还可以通过在类中callable添加__invoke方法来创建对象。也可以返回一个callable函数。我总共添加了 3 个示例。
这是我用MyCommandjava 编写的类的版本,用于所有 3 个示例。
class MyCommand implements Order
{
private $action;
public function __construct(callable $action)
{
$this->action = $action;
}
public function execute()
{
// Option 1) use call_user_function
call_user_func($this->action);
// Option 2) define it as a variable and call it by adding `()`
//$action = $this->action;
//$action();
}
}
Run Code Online (Sandbox Code Playgroud)
示例 1) 可调用函数( https://3v4l.org/FVTEK )
class Stock
{
public function buy(): callable
{
return function () {
echo "You want to buy stocks via callable function" . PHP_EOL;
};
}
public function sell(): callable
{
return function () {
echo "You want to sell stocks via callable function" . PHP_EOL;
};
}
}
$stock = new Stock();
$bsc = new MyCommand($stock->buy());
$ssc = new MyCommand($stock->sell());
$bsc->execute();
$ssc->execute();
Run Code Online (Sandbox Code Playgroud)
示例 2) 可调用类( https://3v4l.org/BrKjv )
class StockBuy
{
public function __invoke()
{
echo "You want to buy stocks via __invoke()" . PHP_EOL;
}
}
class StockSell
{
public function __invoke()
{
echo "You want to sell stocks __invoke()" . PHP_EOL;
}
}
$bsc = new MyCommand(new StockBuy());
$ssc = new MyCommand(new StockSell());
$bsc->execute();
$ssc->execute();
Run Code Online (Sandbox Code Playgroud)
示例 3) 返回可调用的静态成员函数。只是一个更接近java的例子(https://3v4l.org/PKk4B)
class Stock
{
static public function buy(): callable
{
return function () {
echo "You want to buy stocks via callable function" . PHP_EOL;
};
// or as callable object
// return new StockBuy();
}
static public function sell(): callable
{
return function () {
echo "You want to sell stocks via callable function" . PHP_EOL;
};
// or as callable object
// return new StockSell();
}
}
$bsc = new MyCommand(Stock::buy());
$ssc = new MyCommand(Stock::sell());
$bsc->execute();
$ssc->execute();
Run Code Online (Sandbox Code Playgroud)
如果您还有任何疑问,请告诉我。
| 归档时间: |
|
| 查看次数: |
244 次 |
| 最近记录: |