在我看来,如果您通过 GET 变量包含脚本,这是一种代码异味,但是您可以使用带有方法的值类优雅地做到这一点,其逻辑如果为真,则返回值对象本身。
这个想法是要记住,switch
语句将执行 $switch == $case (松散匹配)的任何代码。因此,只需创建 return$this
或什么都没有的方法。
例子:
class Haystack {
public $value;
public function __construct($value)
{
$this->value = $value;
}
public function contains($needle):
{
if (strpos($this->value, $needle) !== false)
return $this;
}
}
$kw = new Haystack($_GET['kw']);
switch ($kw) {
case $kw->contains('berlingo'):
require_once 'berlingo.php';
case $kw->contains('c4'):
require_once 'c4.php';
}
当然,你可以慷慨地用 typehints 装饰这段代码。如果您这样做,并且没有使用支持可空返回类型(即 的方法签名public function contains(string $substring): ?Haystack
)的 PHP 版本,那么您的类将不得不详细说明以反映这一点。
例子:
final class Haystack {
private $value;
private $isMain;
public function __construct(string $value, bool $isMain = true)
{
$this->value = $value;
$this->isMain = $isMain;
}
final public function contains($needle): Haystack
{
if (strpos($this->value, $needle) !== false)
return $this;
return new Haystack($needle, false);
}
}
这样,如果您的显式匹配逻辑在方法内失败,如果由于某种原因new Haystack($_GET['kw']) == new Haystack($needle);
为真,非匹配属性“$isMain”将确保它们不被评估为相等。
再一次,我会重新审视你为什么要首先针对这种特殊情况这样做;传统上,Composer是一个依赖管理工具,可用于通过 PSR 自动加载标准包含您需要的各种脚本。与路由器库结合使用可能对满足您的实际需求最有用。