Warum gibt dieses globale Array NULL von einer Callback-function zurück?

Das hat mich jetzt stundenlang verrückt gemacht … Bitte sagen Sie mir, warum das Array $ ppk_fields in der function ppk_field_callback leer ist? Beachten Sie, dass es die richtigen Werte in der function ppk_default_id zurückgibt, die jedoch keine callbackfunktion ist. Vielen Dank!

ppk.php

class Ppk { public function ini() { add_action( 'admin_menu', array( $this, 'add_ppk_p_menu' ) ); } public function add_ppk_p_menu() { add_submenu_page( 'tools.php', 'PPK PLUGIN', 'PPK PLUGIN', 'manage_options', 'ppk_p', array( $this, 'ppk_build_dashboard' ) ); } public function ppk_build_dashboard() { require_once plugin_dir_path( __FILE__ ) . 'ppk-builder.php'; } } if ( class_exists( 'Ppk' ) ) { $ppk = new Ppk(); $ppk->ini(); } 

ppk-builder.php

 $ppk_sections = [ 'section_1' => [ 'title' => 'Group One' ] ]; $ppk_fields = [ 'field 1' => [ 'title' => 'Fieald One', 'type' => 'text', 'section' => 'section_1', 'default' => 'default' ] ]; register_setting( 'ppk-builder', 'ppk-builder', 'ppk-builder_validate' ); foreach ($ppk_sections as $id => $value) { add_settings_section( $id, $value['title'], 'ppk_section_callback', 'ppk_p'); } foreach ($ppk_fields as $id => $value) { add_settings_field( $id, $value['title'], 'ppk_field_callback', 'ppk_p', $value['section'], $id ); } function ppk_section_callback() {return null;} function ppk_default_id( $id ) { global $ppk_fields; return $ppk_fields[ $id ]['default']; } function ppk_field_callback($id) { global $ppk_fields; $option = get_option('ppk-builder'); $id_field = isset($option[$id]) ? $option[$id] : ppk_default_id($id); switch ($ppk_fields[$id]['type']) { case 'text': echo ''; break; } } settings_fields( 'ppk-builder' ); do_settings_sections( 'ppk_p' ); 

Solutions Collecting From Web of "Warum gibt dieses globale Array NULL von einer Callback-function zurück?"

Das Problem hier ist, dass Sie nie $ppk_fields als globale Variable erstellt haben.

 $ppk_fields = [ 'field 1' => [ 'title' => 'Fieald One', 'type' => 'text', 'section' => 'section_1', 'default' => 'default' ] ]; 

Hier haben wir eine Variable, die normal erstellt wird und normalen Scoping-Regeln folgt. Es ist keine globale Variable und niemand hat angegeben, dass es eine globale Variable ist.

Weiter unten in der Datei haben wir:

 function ppk_field_callback($id) { global $ppk_fields; 

Aber die globale Variable $ppk_fields ist undefiniert, niemand hat sie definiert. Sie müssen die Variable jedes Mal, wenn Sie sie verwenden, als global deklarieren, und dies beinhaltet die Erstellung und die Zerstörung. Keine Ausnahmen.

Also musst du:

  • global $ppk_fields Sie, dass die Variable global ist, wenn Sie sie mit global $ppk_fields

Es falsch machen

Aber es gibt ein noch größeres Problem. Das größte Problem ist, dass Sie überhaupt globale Variablen verwendet haben. Globale Variablen sind eine gute Möglichkeit, das Programm nicht zu strukturieren, Komponententests zu unterbrechen und unnötige Komplexität einzuführen

Beispielsweise wären die globalen Variablen unnötig, wenn Sie den gesamten obigen Code in einer class platziert hätten. Dann wären $this->fields das, was Sie verwenden würden.

Hier ist ein Teilbeispiel:

ppk_settings.php:

 class PPK_Settings { private $sections; private $fields; function __construct() { $this->sections = [ 'section_1' => [ 'title' => 'Group One' ] ]; $this->fields = [ 'field 1' => [ 'title' => 'Fieald One', 'type' => 'text', 'section' => 'section_1', 'default' => 'default' ] ]; } function register() { register_setting( 'ppk-builder', 'ppk-builder', 'ppk-builder_validate' ); foreach ($this->sections as $id => $value) { add_settings_section( $id, $value['title'], array( $this, 'section_callback' ), 'ppk_p'); } foreach ($this->fields as $id => $value) { add_settings_field( $id, $value['title'], array( $this, 'ppk_field_callback' ), 'ppk_p', $value['section'], $id ); } } // etc... other methods go here } 

Verwendung:

 require_once( 'ppk_settings.php' ); $settings = new PPK_Settings(); $settings->register(); 

Sie können stattdessen den OO-Weg gehen und PPK_Field und PPK_Section Objekte haben, so dass Sie Ihre Felder definieren können, dann Schleifen über das Array erstellen Objekte, ohne Probleme oder Probleme zugreifen, und keine Notwendigkeit für Globals oder Member-Variablen