我无法理解这个逻辑:
我使用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
或tablet
或desktop
。但是,当我尝试使用相同的变量并在上面的代码下方粘贴以下代码时,它会更改$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
,并且还会回显上述favicon链接。为什么呢?
我做错了吗?
答案 0 :(得分: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;
}
答案 1 :(得分:1)
因为您的功能引入了新的variable scope。函数外部的变量在函数内部不可见。你必须pass them as parameters:
function getFevicons($layout){
...
echo $layout;
}
并将您的功能称为:
getFevicons($layout);
您也可以使用global
关键字,但这通常被认为是不好的做法,因为它导致代码库难以维护且依赖关系不明确。
function getFevicons(){
global $layout;
...
echo $layout;
}