Как присвоить данные из метода переменной, для использования во всем классе?

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

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

class Member {
	protected $db;
	public $db_table;
	public $user_id;
	public $user_info;
	public function __construct($db) {
        $this->db = $db;
        $this->db_table = 'Invites';
        $this->user_id = $_SESSION['user'];
        $this->user_info = $this->getUserInfo();

    }
	/**
	*
	* Get full user information
	*
	* @return array
	*/
	public function getUserInfo()
	{
		$sql = "SELECT * FROM users WHERE id='$this->user_id'";
	    if (!$result = $this->db->query($sql)) {
		    echo "Ошибка: " . $this->db->error . "\n";
		    exit;
		}
		$data=array();
		while($row = $result->fetch_assoc()){
		    $data[] = $row;
		}
		return $data;
	}
	/**
	*
	* User Name
	*
	* @return string
	*/
	public function getUserName()
	{
		$userinfo = array_shift($this->user_info);
		return $userinfo['username'];
	}
	/**
	*
	* User email
	*
	* @return string
	*/
	public function getEmail()
	{
		$userinfo = array_shift($this->user_info);
		return $userinfo['email'];
	}
	/**
	*
	* User Login
	*
	* @return string
	*/
	public function getLogin()
	{
		$userinfo = array_shift($this->user_info);
		return $userinfo['login'];
	}
	/**
	*
	* Invite days
	*
	* @return string
	*/
	public function getInviteDays()
	{
		$userinfo = array_shift($this->user_info);
		$invite = $userinfo['invite'];
		$sql = "SELECT * FROM `Invites` WHERE number='$invite'";
	    if (!$result = $this->db->query($sql)) {
		    echo "Ошибка: " . $this->db->error . "\n";
		    exit;
		}
		$timedate=array();
		while($row = $result->fetch_assoc()){
		    $timedate[] = $row;
		}

		return $userinfo['login'];
	}
	/**
	*
	* Check admin
	*
	* @return boolean
	*/
    public function is_admin()
    {
		$sql = "SELECT * FROM users WHERE id='$this->user_id' && member_group = 'Admin'";
	    if (!$result = $this->db->query($sql)) {
		    echo "Ошибка: " . $mysqli->error . "\n";
		    exit;
		}
		if ($result->num_rows === 0) {
  			return false;
  		} else {
  			return true;
  		}
    }


Что я делаю: в конструкторе я переменной присваиваю метод, который описывается ниже. Но у меня на странице работает только ПЕРВАЯ вызванная функция, например getLogin, там нормально выводится логин, но вот все остальные функции тогда возвращают пустые значения. Наверняка я что-то делаю не верно. Как это дело можно исправить?
  • Вопрос задан
  • 126 просмотров
Решения вопроса 1
@Fantyk
web developer
class Member {
  private $user_info;

  public function getUserInfo()
  {
        if ($this->user_info === null) {
           $this->loadUserInfo();
        }
        return $this->user_info;
  }

  public function getUserName()
  {
    $userinfo = $this->getUserInfo();
    return $userinfo['username'];
  }

  private function loadUserInfo()
   {
      $sql = "SELECT * FROM users WHERE id='$this->user_id'";
        if (!$result = $this->db->query($sql)) {
           echo "Ошибка: " . $this->db->error . "\n";
           exit;
      }
      $data=array();
      while($row = $result->fetch_assoc()){
          $data[] = $row;
      }
      $this->user_info =$data;
   }
}

Но это только если вам чуть-чуть поправить. Код полный треш, список ошибок сравним с листингом кода.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
proudmore
@proudmore
Вообще, вам крайне рекомендуется ознакомиться с двумя паттернами доступа к данным в БД:
active record и data mapper.
И вот эту статейку в частности
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы