1

ヘッダー ($URL) が呼び出されるまでに、このコードの $URL 変数が常に 'Location: unknown.php' に設定される理由を誰か説明できますか?: 最初の行の宣言/初期化をコメントアウトすると、コードは機能します、しかし、変数が宣言されていないという警告が表示されます(初期化せずに if ブロックの前に $URL を宣言すると、これらの警告も表示されます)。

$URL = 'Location: unknown.php';
if ($spring){
    if (($leaves)&&(!$stem)&&(!$root)&&(!$head)&&(!$whole)){$URL = 'Location: snow-mold.php';}
} else if ($other) {
    if ((!$leaves)&&(!$stem)&&(!$root)&&($head)&&(!$whole)){$URL = 'Location: o01.php';}
    if (($whole) || ($root) ){$URL = 'Location: o02.php';}
    if (($leaves)&&($stem)&&(!$root)&&($head)&&(!$whole)){$URL = 'Location: o03.php';}
    if (($leaves)&&($stem)&&(!$root)&&(!$head)&&(!$whole)){$URL = 'Location: o04.php';}
    if ((!$leaves)&&($stem)&&(!$root)&&($head)&&(!$whole)){$URL = 'Location: o03.php';}
    if (($leaves)&&(!$stem)&&(!$root)&&($head)&&(!$whole)){$URL = 'Location: o05.php';}
    if ((!$leaves)&&($stem)&&(!$root)&&(!$head)&&(!$whole)){$URL = 'Location: o06.php';}
    if (($leaves)&&(!$stem)&&(!$root)&&(!$head)&&(!$whole)){$URL = 'Location: o07.php';}
}
header($URL);

さて、問題を強調するためにコードを単純化しました...

$spring = (isset($_POST['season']) && strcmp($_POST['season'],'spring') == 0);
$URL = 'Location: unknown.php';
if ($spring){
    $URL = 'Location: snow-mold.php';
}
header($URL);

常に unknown.php にリダイレクトします。に変更$URL = 'Location: unknown.php'する$URL;と、Spring が選択されている場合にのみコードが snow-mold.php にリダイレクトされますが、$URL 未定義の警告が表示されます。

4

1 に答える 1

2

さて、一連の構成要素を使用してコードを書き直すことができます。たとえば、そのブランチでif-elsif貧しい人々leavesが7回チェックされることはありません。$other

しかし、私は別のアプローチを提案します: これらすべてのツリー部分を引数として取る (一種の) ハッシュ関数を実装する (または、さらに良いことに、これらの値をキーとして持つ単一の連想配列):

function happy_tree_hash($leaves, $stem, $root, $head, $whole) {
    // assuming each of this can be only TRUE or FALSE,
    // a bit mask should suffice:
    return (bool)$leaves << 4 
        | (bool)$stem << 3 
        | (bool)$root << 2 
        | (bool)$head << 1 
        | (bool)$whole;
}

...次に$url、単純な連想配列から変数に値を割り当てます。

$locations = array(
  5 => 'o02.php',  // whole and root
  16 => 'o07.php', // leaves only 
  ... 
);
...
$key = happy_tree_hash($leaves, $stem, $root, $head, $whole);
if (isset($locations[$key])) {
    $url = $locations[$key];
} else {
    $url = 'unknown.php'; 
}
header("Location: $url");
于 2012-09-17T16:02:32.007 に答える