1

このロジックを理解するのに苦労しています:

JavaScript を使用してブラウザの幅を検出し、次のコードを使用してその値をセッション変数として PHP に渡します。

<?php
    session_start()
    if (empty($_SESSION['layoutType'])) {
        echo '<script type="text/javascript"> var session=false; var layoutType;</script>';
    } else {
        echo '<script type="text/javascript"> var session=true; var layoutType=' . $_SESSION['layoutType'] . ';</script>';
    }
    if (!empty($_SESSION['layoutType'])) {
        $layoutType = $_SESSION['layoutType'];
        if ( $layoutType <= 219 ) {
            $layout = 'mobile';
        } else if ($layoutType >= 220 && $layoutType <= 1024 ) {
            $layout = 'tablet';
        } else {
            $layout = 'desktop';
        }
    }
    echo $layout;

これにより、ブラウザの幅に応じて値が正しく表示されますmobile。しかし、同じ変数を使用して上記のコードの下に次のコードを貼り付けようとすると、の値が変更されます。tabletdesktop$layout

    function getFevicons(){
        if ( $layout = 'mobile' ); {
            echo '
            <link rel="apple-touch-icon" href="cdn/images/apple-touch-icon.png">
            <link rel="apple-touch-icon" sizes="72x72" href="cdn/images/apple-touch-icon-72.png">
            <link rel="apple-touch-icon" sizes="114x114" href="cdn/images/apple-touch-icon-114.png">
            ';
        }
        echo $layout;
    }
?>

レイアウトはデスクトップ用ですが、出力は次のようになり、上記のファビコンリンクmobileもエコーします。なんで?

私は何か間違ったことをしていますか?

4

2 に答える 2

1

次のように関数を呼び出します ( getFevicons($layout);):

function getFevicons($layout){
    switch ($layout) {
        case 'mobile':
            echo '<link rel="apple-touch-icon" href="cdn/images/apple-touch-icon.png"><link rel="apple-touch-icon" sizes="72x72" href="cdn/images/apple-touch-icon-72.png"><link rel="apple-touch-icon" sizes="114x114" href="cdn/images/apple-touch-icon-114.png">';
            break;

        case 'desktop':
            echo 'whatever';
            break;

        case 'tablet':
            echo 'whatever';
            break;

        default:
            // This will absolutely do nothing
    }
    echo $layout;
}
于 2012-05-05T21:15:18.957 に答える
1

関数が新しい変数スコープを導入するためです。関数外の変数は、関数内では見えません。それらをパラメータとして渡す必要があります:

function getFevicons($layout){
    ...
    echo $layout;
}

そして、関数を次のように呼び出します。

getFevicons($layout);

キーワードを使用することもできますがglobal、これはコード ベースの保守が難しくなり、依存関係が不明確になるため、一般的に悪い習慣と見なされます。

function getFevicons(){
    global $layout;
    ...
    echo $layout;
}
于 2012-05-05T21:20:25.177 に答える