Должен ли метод, запускаемый несколько раз в классе PHP, быть кэширован вместо переменной класса? - PullRequest
0 голосов
/ 17 января 2010

В PHP я знаю, что многие люди будут использовать класс для SET и GET переменных сеанса, я делаю это сейчас во многих классах, мне нужно знать, если я делаю это неправильно, хотя.

Так, например, давайте представим, что у меня есть класс A, который должен использовать это

$session->get('user_id')

Который получает это значение

$_SESSION['user_id']

Теперь в этом классе, если у меня есть 15 методов, и в каждом методе мне нужно получить доступ к этому значению несколько раз, в настоящее время я вызываю $ session-> get ('user_id') в классе 20 раз, если это необходимо 20 раз Должен ли я установить это 1 раз на класс локальной переменной для этого класса, а затем получить к нему доступ? Я не уверен, имеет ли это какое-то значение или нет, моя теория состоит в том, что способ, которым я делаю это сейчас, - это 20 дополнительных вызовов функций, которых можно было бы избежать?

Если моя теория верна, как лучше всего хранить эти значения внутри класса? Как частная или публичная или защищенная переменная?

Спасибо, извините за любые неудобства, уроки и предметы занимают у меня некоторое время, чтобы выучить.

Также обратите внимание, что $ session-> get ('user_id') - это всего лишь 1 из многих РАЗНЫХ переменных, с которыми мне нужно было бы сделать то же самое.





UPDATE

После прочтения сообщения Chacha102 об использовании массива () ... вот что я попробовал, это выглядит как хороший способ или все еще может быть улучшено?

файл класса

<?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'];
?>

Ответы [ 2 ]

2 голосов
/ 17 января 2010

Для обращений, распределенных по нескольким методам, если вы просто используете функцию для доступа к переменной, я бы сказал, оставайтесь с функцией. Дополнительные расходы незначительны, и это лучше для долгосрочной ремонтопригодности.

Внутри того же метода вы бы сделали один вызов функции, заполнив локальную переменную, как предлагает Chacha102.

Даже если функция выполняет ресурсоемкие операции, такие как вызовы базы данных, я бы предпочел дать ей некоторое внутреннее кэширование перед добавлением члена в ваш класс.

Добавление переменной в качестве члена к вашему классу на самом деле не имеет смысла в ООП, потому что это не логический, законный член класса, а просто временная переменная.

2 голосов
/ 17 января 2010

Если вы делаете что-то вроде этого:

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

тогда я бы заменил его локальной переменной с

$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 и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...