Php 如何高效地跨多个类传递设置值数组

Php 如何高效地跨多个类传递设置值数组,php,class,oop,dependency-injection,singleton,Php,Class,Oop,Dependency Injection,Singleton,我有一个不改变的配置值设置数组,需要在不同的类中使用这些值 $settings = ['foo' => 'bar', 'license_id' => '12345']; 目前,我使用的是一个静态类,每当我在类中需要一个配置值时,我都会这样做: $this->global_config = MyClass::get_global_config_array(); if ( $this->global_config['license_id'] ) do this . . .

我有一个不改变的配置值设置数组,需要在不同的类中使用这些值

$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();
我的后续问题是如何将另一个具有设置数组的类的结果分配给trait Global_settings中的$static属性

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

如果这些值确实是固定的,您可以让类导入一个包含设置的类,并合并您需要的任何公共功能

trait HasSettings
{
私有数组$settings=[“foo”=>“bar”,“license_id”=>“12345”];
私有函数hasLicense():bool
{
return!空($this->settings[“license_id”]);
}
私有函数getFoo():字符串
{
返回$this->settings[“foo”]??“”;
}
}
类渲染设置页面
{
使用HasSettings;
公共函数构造()
{
//做事
}
公共功能检查许可证()
{
如果($this->hasLicense()){
//做事
}
}
}
类呈现\配置文件\页面
{
使用HasSettings;
公共函数构造()
{
//做事
}
公共功能用户信息()
{
//永远不要从类方法回音
返回“first name:”。$this->getFoo();
}
}

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

访问数组。是的,这些值是固定的。我不知道这个特点。这似乎是我所追求的,是一个比全球和单身班更好的选择。我说的对吗?通过使用import HasSettings,它不会再次运行HasSettings,就像在单例中一样,只是将HasSettings的结果传递给另一个类?我试图在php文档中找到import。我想知道为什么导入过度使用HasSettings?对不起,应该是“使用”。现在修好了!是的,trait基本上只是一种将代码复制/粘贴到类中的方法,因此在导入trait时不会执行任何操作。它开启了许多思考。我几乎有这个工作,除了,我正在努力与一个初学者的任务。在$settings属性中的数组中,我想将该数组从另一个类传递给$settings。传递的数组很长,我希望hasseting保持干净和简短,getFoo()方法是一个动态数组。如何将另一个类的结果传递到私有数组$settings=类外?我尝试使用静态类private array$settings=Test::BigArry()并使用一个对象。我将创建一个公共方法来设置$settings的内容。您还应该研究uu call()方法,它允许您动态调用getFoo()之类的方法。