- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在使用多个函数的情况下,我正在寻找更舒适/更简短的 Switch()
语句版本。
我给你举个例子:想象一个类中有 100-200 个函数,你想通过在该类中将值设置为 id
来只调用其中一个函数。
在我的特殊情况下,我有以下 PHP 文件结构:
<?php
class _main
{
function request($id)
{
switch($id)
{
case 0:
$this->writeA();
break;
case 1:
$this->writeB();
break;
///...
// then we have 100-200 functions like this in switch.
}
}
function writeA()
{
echo('a');
}
function writeB()
{
echo('b');
}
}
$id = 1;
$x = new _main();
$x->request($id);
?>
对于你们中的某些人来说,这可能看起来很奇怪,但我不希望有那么多行包含 case
和 break
的代码。对我来说,它们只是让代码更难阅读。
(顺便说一下,写 100 遍对我来说也不会让它变得有趣)。
结论
什么是最好的、快速的、舒适的方法?
我可以将函数存储到数组然后调用它们吗?
它会影响性能吗? Swicth()
会更快吗?
谢谢你:)
编辑
也许有不同的思维/编码方式,而不仅仅是数组/开关。
最佳答案
我不能说我会推荐这个但是如果你真的想要在一个类中有那么多方法和一个单一的函数来路由调用......
<?php
class MyClass
{
public $id;
public function callFunction()
{
$funcName = 'execute' . $this->id;
return $this->$funcName();
}
private function execute1()
{
echo 'execute1() Called.';
}
private function execute2()
{
echo 'execute2() Called.';
}
}
$c = new MyClass();
$c->id = 1;
$c->callFunction();
输出:
execute1() Called.
我觉得很可能还有另一种方法可以利用 Interfaces
和 Abstract
类来获取更多信息,但是如果不包含上述信息,可能就足够了要求。
编辑:遗憾的是,我现在没有时间想出一个详细的解决方案,而且我确实没有足够的信息可以使用,但也许利用接口(interface)是你最好的解决方案为您的要求。下面是一个非常的简单示例。
<?php
interface WritableInterface
{
public function write($data);
}
class VersionOneWriter implements WritableInterface
{
public function write($data)
{
return $data . '<br/>';
}
}
class VersionTwoWriter implements WritableInterface
{
public function write($data)
{
return $data . $data . '<br/>';
}
}
class MyMainClass
{
public function request(WritableInterface $writer, $data)
{
return $writer->write($data);
}
}
$c = new MyMainClass();
$w1 = new VersionOneWriter();
$w2 = new VersionTwoWriter();
echo $c->request($w1, 'DataString');
echo $c->request($w2, 'DataString');
本质上,当您调用请求函数时,您传递了一个实现了 WritableInterface
的 Writer
类。任何实现该接口(interface)的东西都必须有一个 write()
方法。
现在,当您使用方法传递数据时,由于您还传递了一个可以处理数据的编写器,因此您可以在 中安全地调用
方法,结果将取决于您通过的类。->write($data)
request()
如果您需要另一种编写方法,您可以添加创建另一个实现您的接口(interface)
的类
希望这是有道理的,因为我必须消失一会儿所以有点漫无目的。如果您有任何问题,我会在有空时尝试回来查看。
--
编辑2:本例中的 define()
需要 PHP7+,因为我正在定义一个数组,但在 PHP7 之前,您可以只使用标准数组。 $classMap = ['FirstClass', 'SecondClass'];
interface MyInterface {}
class FirstClass implements MyInterface {}
class SecondClass implements MyInterface {}
$requestParam = 1;
define('CLASS_MAP', array(
'FirstClass',
'SecondClass',
));
$classMap = CLASS_MAP[$requestParam]; // SecondClass
$class = new $classMap;
var_dump($class); // Dumps out: object(SecondClass)#1 (0) {}
关于PHP:速记开关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44434039/
哪个更好?使用像这样的速记: padding:5px 10px 15px 20px; 或者像这样使用手写体: padding-top:5px; padding-right:10px; padding-
我目前在编辑 manuscript.tex 文件时遇到问题。到目前为止,我一直使用文本简写 $$;然而,出现了一些问题,它要求我将所有 $...$ 替换为 \(\)。 我认为带有替换操作的“sed”应
我想要一个简单的 if 速记来检查一个数组是否有一个特定的键,如果有则取消设置它。 $test = array("hi" => "123"); isset($test["hi"]) ? unset($
我在 F# 中映射记录列表并获取命名值: type Person = { FirstName: string; LastName: string } let people = [ { Firs
因此,我有一对类型类,我将经常一起使用它们,并且我想避免每次都指定它们。基本上,而不是把 :: (Ord a, Fractional a, Ord b, Fractional b, ... Ord z
有没有更优雅的写法? : var AllOperation = $('#menu > li.operation'); var Operation1= AllOperation[0]; $(Operat
基本上我想这样做: x ? console.log("true") : x=55 && console.log("changed!!") 如果x为false,它会将值更改为55和console.log
而不是在方法的开头声明一个列表,添加到它然后返回它 - 我确信有一些可以写在循环中的速记返回语句,例如,保存额外的代码(声明等),但我忘记了。有人知道我的意思吗? 最佳答案 使用 yield : pu
我发现自己经常写这样的东西而且看起来太罗嗦了: obj = my_dict.get('obj') if obj: var = obj 有更好的方法吗?也许在一行中? 最佳答案 get 函数接受
多年来我一直在使用 PHP 进行编程,我一直想知道是否有一种方法可以“预连接”一个字符串。示例: $path = '/lib/modules/something.php'; $server = $_S
在将值附加到数组时,是否有 JavaScript(甚至在 coffeescript 中).push() 的简写?很像 php 的 $array[] = 'added to array';。 最佳答案
我读了this tutorial关于在 CSS 选择器中使用正则表达式并试图推断:是否有 CSS 速记来执行以下操作?我想选择所有类为“foo”的 div,这些类有一个附加类“a”、“b”、“c”或“
如何将 rotateX(50deg) rotateY(20deg) rotateZ(15deg) 组合成简写 rotate3d()? 最佳答案 rotateX(50deg) 等价于rotate3d(1
如何将 rotateX(50deg) rotateY(20deg) rotateZ(15deg) 组合成简写 rotate3d()? 最佳答案 rotateX(50deg) 等价于rotate3d(1
我有一个像这样的简单对象(或数组)... stdClass Object ( [people] => Array ( [0] => stdClass Object ( [nam
我有一个变量,如果该变量是一个对象,我想在该对象上调用一个方法,如果不是,我什么也不想做。 我想知道是否有任何理由不应该这样做。 var foo = null; /////////////////
我想知道是否有任何简写方式可以在 JavaScript 中创建一个 promise,或者有什么方法可以将 .then 添加到普通函数中。示例: dbl = a => a | 0 ? a * 2 : !
是否有以下 JavaScript bool 三元表达式的简写语法: var foo = (expression) ? true : false 最佳答案 当然,您只想将表达式转换为 bool 值: v
这个问题在这里已经有了答案: One-liner to take some properties from object in ES 6 (13 个答案) How to get a subset o
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭8 年前。 Improve
我是一名优秀的程序员,十分优秀!