2013-10-02 156 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