【问题标题】:Should a method ran several times in a PHP class be cached to a class variable instead?是否应该将在 PHP 类中运行多次的方法缓存到类变量中?
【发布时间】:2010-01-17 18:18:16
【问题描述】:

在 PHP 中,我知道很多人会使用一个类来设置和获取会话变量,我现在在很多类中都这样做,但我需要知道我是否做错了。

例如,假设我有一个需要使用它的类

$session->get('user_id')

哪个得到这个值

$_SESSION['user_id']

现在在这个类中,如果我有 15 个方法并且在每个方法中我需要多次访问这个值,目前我在一个类中调用 $session->get('user_id') 20 次,如果需要 20 次,我是否应该将每个班级的 1 次设置为该班级的局部变量,然后访问它?我不确定它是否有任何区别,我的理论是我现在这样做的方式是可以避免 20 个额外的函数调用?

如果我的理论是正确的,那么将这些值存储在类中的最佳方法是什么?像私有或公共或受保护的变量?

谢谢,对于任何混淆,类和对象需要我一段时间来学习。

还要注意 $session->get('user_id') 只是我需要做同样事情的许多不同变量中的一个。





更新

在阅读了 Chacha102 的关于使用 array() 的帖子...这是我尝试过的,这看起来是一个好方法还是仍然可以改进很多?

类文件

<?PHP
class User
{
    // Load user details into an Array
    public function load_user()
    {
        $this->user_id = $this->session->get('user_id');
        //if user ID is already set, then Load the cached urser data
        if(isset($this->user_id) && $this->user_id != ''){
            // set user data to an array
            $this->user['user_id'] = $this->user_id;
            $this->user['user_name'] =  $this->session->get('user_name');
            $this->user['pic_small'] =  $this->session->get('pic_small');
            $this->user['sex'] =  $this->session->get('sex');
            $this->user['user_role'] =  $this->session->get('user_role');
            $this->user['location_lat'] =  $this->session->get('location_lat');
            $this->user['location_long'] =  $this->session->get('location_long');
            $this->user['new_user'] =  $this->session->get('new_user');
            return  $this->user;
        }
    }
}
?>

主页文件

<?PHP   
require 'user.class.php';

$user = new User;

// if a user_id is set into a session variable then we return an array of other user related data
$user->account = $user->load_user();

// would show the user's ID from our array
echo $user->account['user_id'];
?>

【问题讨论】:

    标签: php class object


    【解决方案1】:

    如果你正在做这样的事情:

    if($session->get('user_id')==1)
    {
        $prefs = get_prefs($session->get('user_id'));
        $info = get_info($session->get('user_id'));
    }
    

    然后我会用一个since局部变量替换它

    $id = $session->get('user_id');
    if($id == 1)
    {
        //.....
    }
    

    它增加了一个人的清晰度。一遍又一遍地调用这样一个简单的函数可能没什么大不了的,但我仍然不会这样做。

    我尝试减少在单个方法中调用的函数数量。如果你正在做类似的事情:

    $user_id = $session->get('user_id');
    $name = $session->get('name');
    // ... etc ...
    

    您可能只想获取所有会话变量的数组。

    $user = $session->get_array();
    echo $user['user_id'];
    

    这减少了函数调用,您可以一举获得所有数据。


    只有一点清楚,使用用户数据数组可能比为每个事物创建一个变量($user_name$user_id 等)更容易阅读。

    【讨论】:

    • 我真的很喜欢将多个值作为一个数组获取的想法,所以我只需要构建一个像 get_array() 这样的函数,然后在其中,让它获取我想要的所有值,对吧?谢谢
    • 我已经用一些基于数组的示例代码更新了我的问题,我不确定这是否是怎么做的?它似乎有效,但这是一个好方法吗?
    • 您的会话应该只有一个用户类调用的get_all 函数。单独获取每件东西真的不应该是必要的。它已经在一个数组中 ($_SESSION),所以为什么不直接抓住那个数组呢。
    • 否则,这可能是获得它的下一个最佳方法。它看起来确实有点丑。
    • 谢谢!!我没想到,那会容易很多
    【解决方案2】:

    对于分布在多个方法上的访问,只要您只是使用函数来访问变量,我会说留在函数中。额外的成本是微不足道的,而且对于长期可维护性更好。

    在同一个方法中,您将调用一个函数,填充一个局部变量,正如 Chacha102 所建议的那样。

    即使该函数执行诸如数据库调用之类的资源密集型操作,我还是希望在向您的类添加成员之前为该函数提供一些内部缓存。

    将变量作为成员添加到您的类中在 OOP 方式中实际上没有意义,因为它不是类的逻辑合法成员,而只是一个临时变量。

    【讨论】:

    • SO 如果我理解正确,您建议在 1 个类中多次调用该函数,但在类方法中,只调用一次对吗?因此,如果一个类中有 10 个方法并且每个方法调用该函数 5 次,而不是对该函数的 50 次调用,它会像 10 次调用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多