如何使用 runnable 将 java 命令模式迁移到 PHP 7.4?

cel*_*owm 7 php java porting command-pattern runnable

出于学习目的,我正在尝试将此 Java 命令模式示例迁移到 PHP:

https://codereview.stackexchange.com/questions/52110/command-pattern-implementation

UML图

正如@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 类的最佳方法是什么?

Chr*_*uge 4

正如 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)

如果您还有任何疑问,请告诉我。