如何有效地跨多个 类 传递一组设置值
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 数组
我有一个配置值的设置数组,这些值不会更改,需要在各种 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
.