在我看来,如果您通过GET变量包含脚本,则会出现“代码异味”,但是您可以使用带有方法的值类来优雅地执行此操作,这些方法的逻辑返回值对象本身(如果为真)。
关键是要记住,
switch
语句将执行任何其中$switch == $case的代码(松散匹配)。因此,只需创建返回
$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';
}
当然,您可以慷慨地使用类型提示来装饰此代码。如果您这样做,并且未使用支持可空返回类型的PHP版本(即
public function contains(string $substring): ?Haystack
方法签名),那么您的类将不得不详细说明。
示例:
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自动加载标准包含需要的各种脚本。与路由器库结合使用可能是解决实际需求最有用的方式。
strpos()
函数的您的想法是:switch (true) {case strpos($name, 'incident') !== false: /* 任务 */
- Fractaliste