微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 功能阵列的替代方法?

我正在编程一个应用程序(PHP),它需要很长一段类似但不同的功能,这些功能正在被一组键所调用
$functions = [
    "do this" => function() {
        // does this
    },"do that" => function() {
        // does that
    }
] 
etc.

我已经选择将类似的函数放在一个数组中,因为它们不够相似 – 用一个充满条件语句的大函数获得相同的结果不会起作用.而且我只需要通过键来调用它们,例如:

$program = ["do this","do that","do this"];
foreach ($program as $k => $v) {
    $functions[$v]();
}

这是这个函数数组结构引起了许多问题,例如我在另外一个数组函数中很难从一个数组函数调用.这不行:

"do that" => function() {
    $functions["do this"]();
}

也不是:

"do that" => function() {
    global $functions;
    $functions["do this"]();
}

或这个:

"do that" => function($functions) {
    $functions["do this"]();
}

$functions["do that"]($functions);

我想我可以有一个巨大的功能一个长的switch语句:

function similar_functions($key) {
    switch ($key) {
        case "do this":
            // does this
        break;
        case "do that":
            // does that
        break;
    }
}

但这不是很好的做法.或者也许是

那么我的替代品是什么?我应该用开关结构去吗?还是还有另一个更好的解决方案?

关闭PHP中的性能和记忆力是昂贵的.程序编码激发了一大块泥土,意大利面条码等反模式.开关结构很难测试,这违反了 OCP.

您应该以SOLID的方式选择OOP,以避免冗余,提高可扩展性和维护性.这是提供一组可重用的功能的最佳做法.
您还可以在层和模块中分离代码,以降低复杂性并提高可互换性.

在您的情况下,您的类可以实现__invoke将其称为可调用,并且您的键可以是这些类的完整的命名空间,因此您可以将其称为函数.
从现在开始,您还可以使用继承,多态或设计模式,如复合,装饰等来重用其他功能添加功能.

这里有一个简单的例子..

<?PHP
use Foo\Bar;

class This
{
    public function __invoke()
    {
        $this->execute();
    }

    public function execute()
    {
        /* ... */
    }
 }

class That extends This
{
    public function execute()
    {
        /* ... */
    }
 }

$namespaces = array("\Foo\Bar\This","\Foo\Bar\That"); 
foreach ($namespaces as $fullQualifiednamespace) {
    /** @var callable $fullQualifiednamespace */
    $fullQualifiednamespace(); 
}

这种行为也可以通过实现一个特定的接口来实现.
在迭代中,您可以检查接口来调用定义的合同.或者您构建一个Process Class,您可以在其中添加实现此接口的对象. Process类可以执行所有附加对象(Chain of Responsibility).

我更喜欢责任模式链,这是大多数开发人员可以理解的,并不像PHP的__invoke拦截器那么神奇.在工厂中,您可以定义您的链,并且您可以定义链条或链接对象的其他依赖关系.

原文地址:https://www.jb51.cc/php/140078.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐