PHP 在函数外部时从函数内部获取变量


php get variables from inside a function when outside

我以前从未这样做过,所以我想学习如何做到这一点。我正在使用wordpress并创建一个插件。我在文档顶部有一个函数,可以将一些jQuery代码添加到页面的页脚中,其简化版本如下:

function slug_masonry_init() { ?>
<script>
jQuery(function($) {
var container = document.querySelector("#skizzar_masonry_loop");
var msnry = new Masonry( container, {
    columnWidth: <?php echo $masonry_item_width ?>,
    gutter: <?php echo $masonry_item_padding ?>,
    itemSelector: ".skizzar_masonry_entry"
});
});
</script>
<?php }
//add to wp_footer
add_action( 'wp_footer', 'slug_masonry_init' );

您会注意到在<script>中有一些 php 变量:$masonry_item_width$masonry_item_padding

这些变量

是用户定义的,处理这些变量的函数在我的文档下方稍远一点,如下所示:

function skizzar_masonry_shortcode($atts,$content = null) {
    global $skizzar_masonry_item_width, $skizzar_masonry_item_padding;
    $el_class = '';
        extract(shortcode_atts(array(
            "masonry_item_width" => '240',
            "masonry_item_padding" => '5',
            "el_class" => '',
        ),$atts));
        $skizzar_masonry_item_width = $masonry_item_width;
        $skizzar_masonry_item_padding = $masonry_item_padding;
        $output .= '<style>.skizzar_masonry_entry, .skizzar_masonry_entry img {width:'.$masonry_item_width.'px;} .skizzar_masonry_entry.skizzar_ma_double, .skizzar_masonry_entry.skizzar_ma_double img {width:560px; /* + padding */} .skizzar_masonry_entry {margin-bottom:'.$masonry_item_padding.'px; overflow:hidden;}</style>';
        $output .= '<div id="skizzar_masonry_loop" class="'.$el_class.'">';
        $output .= do_shortcode($content);
        $output .= '</div>';
        return $output;
    }

旁注:您在此处看到的两个全局变量:$skizzar_masonry_item_width$skizzar_masonry_item_width在文档的上方(在两个代码片段之间)定义 - 这是用于输入宽度和填充的用户界面,您在此处看到的代码创建了一个短代码。

我不知道该怎么做的是将$masonry_item_paddingmasonry_item_width添加到页面顶部的jQuery脚本中 - 目前它们只是返回空白。

你必须echo变量才能输出

columnWidth: <?php echo $masonry_item_width ?>,
gutter: <?php echo $masonry_item_padding ?>,

至于如何获得你的价值观...WordPress使所有这些独立回调的插件变得如此混乱。通常我会讨厌这样做,但我想不出任何其他方法来做到这一点。我将它们放入一个数组中以减少全局变量。这部分在您的skizzar_masonry_shortcode

$GLOBAL['skizzarvar'] = array(
   'width' => $masonry_item_width, 
   'padding' => $masonry_item_padding
);

然后,您可以在slug_masonry_init中执行此操作

<?php echo $GLOBAL['skizzarvar']['width'] ?>

你所要做的就是:

function slug_masonry_init() 
{ 
    global $masonry_item_width, $masonry_item_padding;
    ...

在此处查看有关global关键字的更多信息:http://php.net/manual/en/language.variables.scope.php