gpt4 book ai didi

php - 访问命名空间公共(public)函数中的私有(private)值

转载 作者:行者123 更新时间:2023-12-04 16:51:32 24 4
gpt4 key购买 nike

我有一个只需要计算一次的值。我不能用 const声明它,因为我需要运行一些函数来进行初始计算。我希望能够以某种 protected 方式存储它并在(命名空间的)全局函数中访问它。这样做的好模式是什么?这是我所拥有的:

选项 1 - 效果很好,但仅适用于常量,所以我不能使用它:

<?php 
namespace my;

const PREFIX = 'example';

/**
* my\get_prefix()
*/
function get_prefix () {
return PREFIX;
}

选项 2 - 命名空间函数访问来自预配置命名空间公共(public)静态类的值:
<?php 
namespace my;

class Hash {
public static $prefix;

public static function configure () {
self::$prefix = call_user_func(function () {
// calculate and return a string
});
}
}

Hash::configure();

/**
* my\get_prefix()
*/
function get_prefix () {
return Hash::$prefix;
}

选项 3 - 与#2 类似,但这里配置是第一次运行 get_prefix被调用,并且每次都被检查为一个字符串:
<?php 
namespace my;

class Hash {
public static $prefix;
}

/**
* my\get_prefix()
*/
function get_prefix () {
if ( is_string(Hash::$prefix) )
return Hash::$prefix;

Hash::$prefix = call_user_func(function () {
// calculate and return a string
});

return Hash::$prefix;
}

选项 4 - 通过使用静态方法/私有(private)变量完全保护,但如果通过 my\get_prefix() 调用,则添加一个额外的函数调用:
<?php 
namespace my;

class Hash {
private static $prefix;

public static function configure () {
if ( isset(self::$prefix) ) return;
self::$prefix = call_user_func(function () {
// calculate and return a string
});
}

public static function get_prefix () {
return self::$prefix;
}
}

Hash::configure();

/**
* my\get_prefix()
*/
function get_prefix () {
return Hash::get_prefix();
}

最佳答案

乍一看,这看起来很适合延迟加载。

namespace My;

class Hash
{
protected static $prefix;

public static function getPrefix()
{
if (null === self::$prefix) {
self::$prefix = calculate_and_return_a_string();
}
return self::$prefix;
}
}

$prefix = My\Hash::getPrefix();

有几点需要注意。首先,我改变了 My\Hash::$prefix 的可见性来自 privateprotected .一般来说,除非有很好的理由使用 private ,我更喜欢坚持 protected变量。

其次,您可能要重新评估 My\Hash 之间的关系。类和 calculate_and_return_a_string()函数(您使用了 call_user_func )。也许找到一种方法来注入(inject)计算值,这将使类与函数解耦并删除额外的依赖项。

最后,重新评估是否需要将它放在自己的类中可能是值得的。如果您仅使用它来存储和注册单个变量,则最好使用注册表或类似的东西。当然,我看不到整个上下文,所以只有你知道这是否适用。

关于php - 访问命名空间公共(public)函数中的私有(private)值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12684429/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com