如何有效地跨多个 类 传递一组设置值

How to pass an array of setting values across multiple classes, efficiently

我有一个配置值的设置数组,这些值不会更改,需要在各种 classes 中使用这些值。

$settings = ['foo' => 'bar', 'license_id' => '12345'];

目前,我使用的是静态 class,每当我需要 class 中的配置值时,我都会这样做:

$this->global_config = MyClass::get_global_config_array();
if ( $this->global_config['license_id'] ) do this . . .

除了使用全局、依赖注入或单例之外,还有其他方法吗class?我多次调用 MyClass::get_global_config_array() 并正在寻找一种更高效的方法。

仅供参考:我是 OOP 的新手,但不是程序化的。

class Settings() {
  public static function global_config_array() {
    $settings = ['foo' => 'bar', 'license_id' => '12345'];
    return $settings;
  }  
}

class Render_Setup_Page() {
  public function __construct() {
    $this->global_settings = Settings::global_config_array();
  }
  public function check_license() {
    if ( $this->global_settings['license_id'] ) do this . . .
  }
}

class Render_Profile_page() {
  public function __construct() {
    $this->global_settings = Settings::global_config_array();
  }
  public function user_info() {
    ret 'first name: ' . $this->global_settings['foo'] );
  }
}

更新:

向此请求添加更多内容。我正在构建一个 WordPress 插件,其插件设置分为三种类型:静态、动态和主题定制器。

我将这三个合并到一个全局设置数组中,并将该数组传递给几个函数。将它们放在一个数组中可以消除大量的数据调用。特别是在主题模板中。

根据@miken32 关于使用 trait 的建议,我想出了以下示例:

trait Global_Settings { 
    private array $static = [
        "foo"               => "bar", 
        "license_id"        => "12345"
    ];
    
    private array $dynamic = [
        'plugin_build'      => '73686572726965206',
        'plugin_version'    => '1.0.0',
        'plugin_prefix'     => 'xyx',
    ];
    
    private array $customizer = [
        'plugin_123'        => 'hello',
        'plugin_456'        => 'there',
    ];
    
    private function get_static_settings() {        
        return $this->static;
    }

    private function get_dynamic_settings() {
        return $this->dynamic;
    }

    private function get_customizer_settings() {
        return $this->customizer;
    }
    
    private function global_settings() {
        return array_merge(
            $this->static,
            $this->dynamic,
            $this->customizer,
        );
    }
}

class Do_Something {    
    use Global_Settings;

    public function render_something() {        
        error_log( print_r($this->get_dynamic_settings(), TRUE) );
        error_log( print_r($this->get_static_settings(), TRUE) );
        error_log( print_r($this->get_customizer_settings(), TRUE) );
        error_log( print_r($this->global_settings(), TRUE) );
             
        // Get a specific settings array.
        $output = 'Your' . $this->get_dynamic_settings['foo'] . ' license is: ' . $this->get_dynamic_settings['license_id'];

        // Or get all of them at once.
        extract( $this->global_settings );
        $output = $plugin_123 . ' your' . $foo . ' license is: ' . $license_id . ' for version ' . $plugin_version;

        return $output; 
    }    
}

$obj = new Do_Something();
$obj->render_something();

我的后续问题是如何将具有设置数组的另一个 class 的结果分配给特征 Global_Settings?

中的 $static 属性
class Static_Array {
  public array() {
    return [
        "foo"               => "bar", 
        "license_id"        => "12345"
    ];
  }
}

如果这些值确实是固定的,您可以让 类 导入一个 trait 来保存设置并包含您需要的任何常用功能。

trait HasSettings
{
    private array $settings = ["foo" => "bar", "license_id" => "12345"];

    private function hasLicense(): bool
    {
        return !empty($this->settings["license_id"]);
    }

    private function getFoo(): string
    {
        return $this->settings["foo"] ?? "";
    }
}

class Render_Setup_Page
{
    use HasSettings;

    public function __construct()
    {
        // do stuff
    }

    public function check_license()
    {
        if ( $this->hasLicense()) {
            // do stuff
        }
    }
}

class Render_Profile_page
{
    use HasSettings;

    public function __construct()
    {
        // do stuff
    }

    public function user_info()
    {
        // don't ever echo from a class method
        return 'first name: ' . $this->getFoo();
    }
}

提供访问这些值的方法是个好主意,但您也可以通过 $this->settings.

访问 private 数组