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 FooBar;
class This
{
public function __invoke()
{
$this->execute();
}
public function execute()
{
/* ... */
}
}
class That extends This
{
public function execute()
{
/* ... */
}
}
$namespaces = array("FooBarThis","FooBarThat");
foreach ($namespaces as $fullQualifiedNamespace) {
/** @var callable $fullQualifiedNamespace */
$fullQualifiedNamespace();
}
这种行为也可以通过实现一个特定的接口来实现. 我更喜欢责任模式链,这是大多数开发人员可以理解的,并不像PHP的__invoke拦截器那么神奇.在工厂中,您可以定义您的链,并且您可以定义链条或链接对象的其他依赖关系. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
