2013-10-02 111 views
0
function partners($atts) { 
    extract(shortcode_atts(array( 
      'ids' => null, 
      'extra_options' => 'something' <----------------- in wordpress I can read this value using local $extra_options 
    ), $atts)); 
global $extra_options; <----------------- trying to change local var to global 

function print_partners_scripts() { 
    global $extra_options; <----------------- reading above variable 
    echo '<script type="text/javascript">' . "\n"; 
    echo 'jQuery(document).ready(function() {'. "\n"; 
    echo ' $(".partners-slider").bxSlider({ 
     slideWidth: 924, 
     auto: 0, 
     autoStart: 0, 
     moveSlides: 1, 
     minSlides: 3, 
     maxSlides: 8, 
     pager: false, 
     controls: false, 
     slideMargin: 5, 
     ' . $extra_options . ' <----------------- var is empty 
    });' . "\n"; 
    echo '});' . "\n"; 
    echo '</script>' . "\n"; 
} 
    add_action('wp_footer', 'print_partners_scripts'); 

    $ids = explode(',', $ids); 
    $output = '<div class="ps-wrap"><div class="partners-slider">'; 
    foreach($ids as $id) {  
    $img_attr = wp_get_attachment_image_src($id, 'full'); 
    $output .= '<div class="pslide"><img src="' . $img_attr[0] . '" /></div>';  
} 
    $output .= '</div></div>'; 

    return $output; 
} 

嗨,我想读取print_partners_scripts()内的var $ extra_options。该变量在partners()函数中设置。我试图让它全球化,只是在某些地方使用它,但我想我做错了什么;)嵌套函数,变量 - PHP

在此先感谢!

+0

你另一个函数(合作伙伴)中定义的函数(print_partners_scripts)?为什么?!你真的在任何地方打电话给print_partners_scripts()吗?你是否首先打电话给合作伙伴()? – OIS

+1

不赞成使用全局变量。您应该将信息传递给函数或使用会话来存储数据。 –

+3

@JacobS你有一个官方消息来源的索赔? Globals不鼓励但不被弃用。 – OIS

回答

1

首先,PHP不支持您尝试使用它们的嵌套函数。

你可以这样写:

function outer() { function inner() {} } 
outer(); 

但这一切发生的是,当执行outer();,该inner()函数声明为一个正常功能。因此,代码是完全一样的:

function outer() {} 
function inner() {} 
outer(); 

其次,在PHP变量(除非前缀,用类或对象名)总是限制在当前的功能。 global关键字将参考文献导入到当前函数的范围中的全局变量;它不能用于导出已经定义的变量。

通常最好在函数的最开始只使用global关键字来导入该函数所需的所有全局变量。更好的是,不要使用全局变量,因为它们会导致难以理解和调试的“意大利面代码”。

如果声明变量global运行extract,这将工作,但我会强烈建议不要使用任何功能

function foo_with_too_much_magic() 
{ 
    // Import global variable. Very hard to track where this came from. 
    global $some_var; 
    // Let's assume this array comes from somewhere and isn't hard-coded 
    $some_array = array('some_var' => 'some_value'); 
    // Export variables from an array. This is like telling PHP to write different code each time it runs, with different variable names. 
    extract($some_array); 
} 
foo_with_too_much_magic(); 
var_dump($some_var); 

这里是一个以上的版本不气馁的特征:

function foo_with_no_magic() 
{ 
    // Let's assume this array comes from somewhere and isn't hard-coded 
    $some_array = array('some_var' => 'some_value'); 
    // You know which variable you want, so don't need the magic "export" 
    // Note that you don't have to call it $some_var 
    $some_var = $some_array['some_var']; 

    // Now you have the variable, you can manipulate it, pass it to another function, or return it 
    // In fact, you could also return $some_array['some_var'] directly, without the extra assignment 
    return $some_var; 
} 

// This variable name no longer needs to be the same as what was used in the foo_with_no_magic() function 
$some_var = foo_with_no_magic(); 
var_dump($some_var); 
+0

“如果在运行导出之前声明变量全局,这将起作用,但我强烈建议不要使用这两个功能之一。”工作;)感谢您的时间和宝贵的意见! – user2587741

+0

@ user2587741我在回答中加入了解释失败的原因,但请**不要编写这样的代码!我已经添加了一个例子来说明如何编写代码而不依赖'export'和'global'的魔力。 – IMSoP

0

这里是将代码置于一个类格式的方向我会去FYI的一个例子,它可以是有用的了解更多一点的OOP做法PHP(http://php.net/manual/en/language.oop5.php):

#1) Get the data you wish to pass into your function. 
$data = "TEST"; 
get_partners($data); 

#2) Call your function. 
function get_partners($atts) { 
    //Extract using ($att) passed in from your call. 
    //The shortcode_atts function should be accessible by the file containing this function. 
    extract(shortcode_atts(array(
    'ids' => null, 
    'extra_options' => 'something' //in wordpress I can read this value using local $extra_options 
    ), $atts)); 
    //Create a new class element that will build your data for your and allow you to pass in your variable on the fly. 
    $p = new partners(); 
    $p->extra_options= $atts; //Pass the variable here. 
    $p->print_partners_scripts(); 
} 

#3) Define Class here. 
class partners { 
    var $extra_options; 

    public function print_partners_scripts() 
    { 
     $output = '<script type="text/javascript">' . "\n"; 
     $output .= 'jQuery(document).ready(function() {'. "\n"; 
     $output .= ' $(".partners-slider").bxSlider({ 
     slideWidth: 924, 
     auto: 0, 
     autoStart: 0, 
     moveSlides: 1, 
     minSlides: 3, 
     maxSlides: 8, 
     pager: false, 
     controls: false, 
     slideMargin: 5, 
     ' . $this->extra_options . ' 
     });' . "\n"; 
     $output .= '});' . "\n"; 
     $output .= '</script>' . "\n";    
     $output .= $this->additional_data(); 
     echo $output; 
    } 

    protected function additional_data() 
    { 
     add_action('wp_footer', 'print_partners_scripts'); 
     $ids; #Where is this defined? 
     $ids = explode(',', $ids); 
     $output = '<div class="ps-wrap"><div class="partners-slider">'; 

     foreach($ids as $id) 
     { 
      $img_attr = wp_get_attachment_image_src($id, 'full'); 
      $output .= '<div class="pslide"><img src="' . $img_attr[0] . '" /></div>'; 
     } 

     $output .= '</div></div>'; 
     return $output; 
    } 
} 
+1

OOP可能是有益的(虽然它可能在这里被过度杀死),但是这会使用一些非常糟糕的做法:'get_partners'函数应该在类中,可能是一个静态函数;它仍然在不必要地使用'extract'; 'var'应该替换为'public';并且函数名称通常应该是动词,所以'additional_data'应该是'get_additional_data',或者最好是更具描述性的。噢,通过“阶级元素”,我认为你的意思是“实例”。 – IMSoP

+0

在本例中,get_partners函数不在类/实例内部,因为它是创建类/实例的函数。虽然它的某些逻辑确实可以被移入类/实例本身。你是否暗示这个类是在一个函数之外创建的? – AJames

+0

这就是为什么我建议它是* static *函数,所以你可以运行'Partners :: get_partners($ data)'。或者它可能是类的构造函数,所以你可以运行'$ partners = new Partners($ data); $合作伙伴 - > print_partners_scripts();'。机会是,这将在其他函数内部,包含页面上所需的所有函数调用。 – IMSoP