我正在创建一个wordpress插件。我正在写的所有函数都被“挂钩”到某些wordpress事件中。这意味着我很难创建需要在多个函数中使用的变量。
例如:
有两个函数挂在某处:
Display_if_facebook_connected() {
if (Check_facebook_connected()) { return 'Yes, connected!' }
return '';
}
Display_if_facebook_connected() {
if (!Check_facebook_connected()) { return 'No, not connected!' }
return '';
}
他们都有很重要的功能:
Check_facebook_connected() { // some heavy facebook connect stuff, return bool }
我基本上试图避免重功能运行两次,因为它会有相同的结果。
在这种情况下,执行$_COOKIE['check_facebook_connected'] = true;
然后在Display_if_facebook_connected()
中读取该变量是否安全?
安全我的意思是用户无法查看或更改值。由于实际上没有设置cookie ,我认为/希望它在php代码的最后消失。
如果有更好的方法或更好的var,我不会感到惊讶,但是由于我对php的理解有限,我想不出任何。
更新 关于会话:我不需要将值保留在多个页面上,只需要一页加载。由于Wordpress不使用会话,我认为没有理由改变它。
我试验了一下,问题仍然存在:
以下所有代码都在我的wordpress插件的主文件中。我理解它的方式,插件文件在每个请求都被“包含”,所以每次刷新我的testpost时都会运行所有代码。
首先我创建变量:
$myplugin_connected = false;
然后我将我的功能挂钩在正确的位置:
add_shortcode( 'myplugin_notconnected', 'myplugin_notconnected_func' );
这基本上将myplugin_notconnected_func()
函数挂钩到[myplugin_notconnected]短代码中。 (短代码是wordpress帖子中的文字,[] -brackets之间有一些ID。无论何时出现,Wordpress都会加载与短代码相关的代码。)
这是myplugin_notconnected_func()
:
function myplugin_notconnected_func( $atts, $content = null ) {
echo '<p>connected: ' . var_export($myplugin_connected, true) . '</p>';
return '$contents';
}
这是结果:
已连接:NULL
这就是我尝试使用$ _COOKIE变量的原因,因为至少它们会在整个php实例上持续存在。我为缺乏连贯性而道歉,我正在学习,我非常感谢你的帮助!
答案 0 :(得分:3)
Display_if_facebook_connected() {
$result = Check_facebook_connected();
if (!$result) { return 'No, unconnected!' } else { return 'Yes, connected!' }
}
$connected = Display_if_facebook_connected();
答案 1 :(得分:1)
session_start();
Check_facebook_connected()
{
if(isset($_SESSION["is_facebook_connected"])) return ($_SESSION["is_facebook_connected"] === true);
// if we get here we haven't checked the facebook connection status, so do it
...
}
答案 2 :(得分:1)
参考问题的更新部分:
定义
$myplugin_connected = false;
并在后续
中获得NULL
var_export($myplugin_connected, true)
可能意味着,您要么在全局范围之外定义$myplugin_connected
(例如在函数而不是main中),或者在全局范围内定义了,但在unset($myplugin_connected)
之前的某个地方有一些var_export
。在这两种情况下,var_export
的返回值都是NULL
。
在你的情况下,我相信前者更可能。你可以使用:
$GLOBALS['myplugin_connected'] = false;
和
var_export($GLOBALS['myplugin_connected'], true)
在您的短代码处理程序中可以使用连接状态(之前已经通过“重”功能确定过一次)。
回答你的原始问题:
在这种情况下,这样做是否安全 $ _COOKIE ['check_facebook_connected'] = true;然后阅读 Display_if_facebook_connected()?
中的变量
嗯,$_COOKIE
是服务器端superglobal,所以是的,只要您从未在响应中实际发送/设置该cookie,用户就不会看到,也无法更改它。
就个人而言,使用$_COOKIE
来保存仅对单页加载有效的状态,对我来说感觉完全没错。
我建议至少$GLOBALS
使用$_COOKIE
- 或者甚至可以更好地使用static
变量而不是超级全局 - 例如像这样的东西:
function isConnected() {
static $bConnected = null;
if ($bConnected === null)
$bConnected = Check_facebook_connected();
return $bConnected;
}
但这总是在旁观者的眼中^^