2015-12-29 112 views
-1

我提出這個問題,因爲我有一個奇怪的數組轉換爲布爾值,我真的不知道這是什麼問題。奇怪的數組轉換爲布爾

我已經仔細檢查了我的代碼,並且沒有發現任何可以修改我的代碼的問題。

你看到有什麼問題嗎?如果是這樣,你能幫我嗎?

因此,根據要求,我將更詳細地解釋我的問題。

所以,我有這個類,我有一個方法叫load_configuration()在加載一些PHP文件,返回每個值的數組。

這些文件返回的數組存儲在類中的等價屬性中。

裏面的load_configuration()方法,我做了var_dump,我的類屬性fieldssettings,我得到以下結果:

array (size=1) 
    'text' => 
    array (size=3) 
     'type' => string 'text' (length=4) 
     'label' => string 'Hello world! goes here.' (length=23) 
     'default' => string 'Hello world!' (length=12) 

另外,我在方法load_configuration()年底創建一個數組我返回數組。

然後,當我嘗試使用兩種方法屬性或返回值從方法load_configuration()我得到var_dump()

// In case of the returned array 
array (size=2) 
    'fields' => boolean true 
    'settings' => boolean true 

// In case of the class property 
boolean true 

以下,但我看不到的原因。這是一個非常奇怪的修改。

爲了更好地理解看評論的方法load_configuration()get_template_variables()

class SS24_Widget extends \SiteOrigin_Widget { 
    protected $config_folder = 'Config'; 
    protected $form_settings = 'settings'; 
    protected $form_fields = 'fields'; 
    protected $fields = array(); 
    protected $settings = array(); 

    public function __construct($unique_widget_id = '', $widget_name = '') { 

     if (empty($unique_widget_id)) { 
      $unique_widget_id = uniqid('widget-'); 
     } 

     $this->load_configuration(); 

     parent::__construct(
      $unique_widget_id, // The unique id for your widget. 
      $widget_name,  // The name of the widget for display purposes. 
      $this->settings, // The widget settings. 
      array(),   // The $control_options array, which is passed through to WP_Widget. 
      $this->fields,  // The widget fields. 
      $this->get_dir() . '/' // The $base_folder path string. 
     ); 
    } 

    protected function load_configuration() { 

     $config_files = $this->get_dir() . '/' . $this->config_folder . '/*.php'; 

     $fields = array(); 
     $settings = array(); 

     foreach (glob($config_files) as $file) { 
      switch(basename($file, '.php')) { 
       case $this->form_settings: 
        $this->settings = $this->{$this->form_settings} = require_once $file; 
        $settings = $this->settings; 
        break; 
       case $this->form_fields: 
        $this->fields = $this->{$this->form_fields} = require_once $file; 
        $fields = $this->fields; 
        break; 
      } 
     } 

     // This print out the following: 
     // array (size=1) 
     // 'text' => 
     // array (size=3) 
     //  'type' => string 'text' (length=4) 
     //  'label' => string 'Hello world! goes here.' (length=23) 
     //  'default' => string 'Hello world!' (length=12) 
     var_dump($fields); 

     return array(
      'fields' => $fields, 
      'settings' => $this->settings, 
     ); 
    } 

    // ... 

    public function get_template_variables($instance, $args){ 

     $c = $this->load_configuration(); 

     // While the following printint out the following: 
     // array (size=2) 
     // 'fields' => boolean true 
     // 'settings' => boolean true 
     // 
     // boolean true 
     var_dump($c); 
     echo "<br />"; 
     var_dump($this->fields); 

     return $variables; 
    } 
} 

能有人請解釋我什麼可能是不對的代碼?

更新#1 我發現,在我的本地代碼父類有一個受保護的成員屬性命名$fields所以我現在改變變量成fields_settings,但還是被轉換成boolean

+0

是否有可能解釋你爲什麼downvote的原因? –

+1

你的問題是什麼?我的意思是你爲什麼會問這個問題,你期望用這段代碼得到什麼,你會得到什麼?發佈一段代碼並詢問「您對此有何看法」很難回答。爲此,你可以使用PHP解釋器:) – Gavriel

+0

你讀過我的代碼上面的評論嗎?你是否也查看了代碼?如果你仔細閱讀,那麼你會看到什麼是問題和問題。 –

回答

1

require_once非常相似include_once

如果文件已包含在內,則它們都將返回布爾值TRUE

報價PHP documentation

如果從一個文件中的代碼已經被包含了,它會不會再次包含和include_once返回TRUE 。顧名思義,該文件將只包含一次。

require_once的文檔指向include_once。這就是該區塊提到前者的原因。

要解決您的問題,請確保使用require代替。

1

我認爲問題在於你在構造函數中執行load_configuration(),所以require_once語句在這裏返回正確的值。在下一次致電load_configuration()時,require_once語句返回布爾值「true」,表示該文件已包含在內。

使用require而不是require_once。