【问题标题】:How to pass an array of setting values across multiple classes, efficiently如何有效地跨多个类传递一组设置值
【发布时间】:2021-08-22 19:55:32
【问题描述】:

我有一个设置数组,其中包含不变的配置值,需要在各种类中使用这些值。

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

目前,我正在使用一个静态类,每当我需要一个类中的配置值时,我都会这样做:

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

除了使用全局、依赖注入或单例类之外,还有其他方法吗?我多次调用 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();

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

class Static_Array {
  public array() {
    return [
        "foo"               => "bar", 
        "license_id"        => "12345"
    ];
  }
}

【问题讨论】:

    标签: php class oop dependency-injection singleton


    【解决方案1】:

    如果这些值确实是固定的,您可以让这些类导入一个 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 数组。

    【讨论】:

    • 是的,这些值是固定的。我不知道特质。这似乎是我所追求的,并且是比全局和单例类更好的选择。我是否正确,通过使用 import HasSettings 它不会再次运行 HasSettings,就像在单例的情况下,只是将 HasSettings 的结果传递给另一个类?
    • 我试图在 php 文档中找到导入。我想知道为什么导入而不是使用 HasSettings?
    • 对不起,应该是“使用”。现在修好了!是的,特征基本上只是一种将代码复制/粘贴到类中的方法,因此在导入特征时不会执行任何操作。
    • 第一个特征是一个很棒的新东西,谢谢。它打开了很多思考。我几乎可以完成这项工作,除了我正在为一项初学者任务而苦苦挣扎。 $settings 属性中的数组,我想将数组传递给另一个类的 $settings。传递的数组很长,我想保持 HasSetting 干净和简短,getFoo() 方法是一个动态数组。如何将结果从另一个类传递到私有数组 $settings = outside class?我尝试使用静态类私有数组 $settings = Test::BigArry() 并使用对象。
    • 我会创建一个公共方法来设置 $settings 的内容。您还应该研究 __call() 方法,它可以让您动态调用诸如 getFoo() 之类的方法。
    猜你喜欢
    • 1970-01-01
    • 2018-12-02
    • 2014-06-04
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多