2014-01-10 2 views
0

Когда я работал в процедурном программировании на PHP, у меня была бы страница входа, где будет создан и сохранен сеанс пользователя. Затем на каждой странице я просто отображал имя пользователя и получал необходимую мне информацию.Как мне создать и использовать класс пользователя?

Но я беспомощен, как бы вы это достигли в программировании объектов?

Таким образом, процедурный (login.php):

if ($_POST['password'] != '' && $_POST['username'] != '') { 
    // check if password&username combination exists in database etc. 

    $_SESSION['user_id'] = $user_id; 
    $_SESSION['username'] = $username; 

} 

Я предполагаю, что это будет сделано, как это в объектно-ориентированном программировании:

// include user class 

if ($_POST['password'] != '' && $_POST['username'] != '') { 
    // check if password&username combination exists in database etc. 

$user = new User(); 
$user->id = $userId; 
$user->username = $username; 

Но вот проблема: Где я могу создать сеанс? И этот объект не будет существовать вне этой страницы «login.php», так как я его создаю. Как я могу сделать эту информацию доступной повсюду?

И как вы получите информацию из базы данных, используя специальный класс (скажем, PDO), не помещая запросы в пользовательский класс?

Большое спасибо, я просто не могу понять структуру

+0

Кроме ответы на приведенные ниже, если это будет частью более крупного веб-сайта с большим количеством различных файлов, я бы предположил, что вы запускаете каждое исполнение сценария путем автоматического добавления «основного файла», который позволяет настроить все, что вам нужно, например, инициировать пользовательский класс (так что вам не нужно переписывать код на каждой странице). Используйте флаг php auto_prepend_file, если вам разрешено использовать директивы apache, в противном случае используйте require/include в верхней части каждой страницы. – Felthragar

ответ

0

Попробуйте это вы почти там

// include user class 
session_start(); 

if ($_POST['password'] != '' && $_POST['username'] != '') { 
    // check if password&username combination exists in database etc. 

$user = new User(); 
$user->id = $userId; 
$user->username = $username; 

$_SESSION['user_obj'] = serialize($user); 

Затем, когда вы хотите получить доступ к его снова в другой странице:

// include user class 
session_start(); 

$user = new User(); 
if (isset($_SESSION['user_obj']) { 
    $user = unserialize($_SESSION['user_obj']; 
} 
1

Вы бы сделали что-то в строю:

class User{ 

private $id; 
private $username; 

    function __construct($userId, $username) { 
     $this->$id = $userId; 
     $this->$username = $username; 
    } 

} 

if ($_POST['password'] != '' && $_POST['username'] != '') { 
    // check if password&username combination exists in database etc. 
    //...... 
    //Store your session 
    $_SESSION['user_id'] = $user_id; 
    $_SESSION['username'] = $username; 
    //Create user instance 
    $user = new User($user_id, $username); 
} 

Вы также можете поместить свой уровень доступа к данным в пользовательский конструктор, так что вам просто нужно беспокоиться о сохранении сеанса id.

User.php:

class User{ 

private $id; 
private $username, $first_name, $last_name; 

    function __construct($userId) { 
     $this->$id = $userId; 
     //get user data from db using $id 
     $this->$username = $row['username']; 
     $this->$first_name = $row['first_name']; 
     $this->$last_name = $row['last_name']; 
    } 

} 

login.php:

function get_userId($username, $password) 
// check if password&username combination exists in database etc. 
//then return Id 
//...... 
return $userId 
} 

Затем с помощью функции вроде следующего:

if ($_POST['password'] != '' && $_POST['username'] != '') { 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
    $user_id = get_userId($username, $password); 
    $_SESSION['user_id'] = $user_id; 
} 

, то вы бы создать экземпляр пользователя с помощью id:

session_start(); 
$user_id = $_SESSION['user_id']; 
$user = new User($user_id); 
0

Сначала вы должны использовать официальный documentation

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

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

class User { 
    private $id = null; 
    private $username = null; 
    private $isLoggedIn = false; 
    public function __construct() { 
     if (isset($_SESSION['userData']) && !empty($_SESSION['userData'])) { 
      // I want to think that you have more complex check for user session 
      $this->id = $_SESSION['userData']['userId']; 
      $this->username = $_SESSION['userData']['username']; 
      $this->isLoggedIn = true; 
     } 
    } 

    public function auth() { 
     $_SESSION['userData'] = array() 
     $result = false; 
     // Here can be an password check 
     if ($this->id && $this->username) { 
      $_SESSION['userData']['userId'] = $this->id; 
      $_SESSION['userData']['username'] = $this->username ; 
      $this->isLoggedIn = true; 
      $result = true; 
     } 
     return $result; 
    } 
    public function isLoggedIn() { 
     return $this->isLoggedIn; 
    } 

    public function userId($id = null) { 
     if ($id != null) { 
      $this->id = $id; 
     } 
     return $this->id; 
    } 

    public function userName($name = null) { 
     if ($name != null) { 
      $this->name = $name; 
     } 
     return $this->name; 
    } 

} 

А использование для этого класса будет коротким и легким

// include user class 
session_start(); 
$user = new User(); 
if ($user->isLoggedIn()) { 
    // user is Logged In 
} elseif ($_POST['password'] != '' && $_POST['username'] != '') { 
    // check if password&username combination exists in database etc. 

    $user->userId($userId); 
    $user->userName($username); 
    $user->auth(); 
} else { 
    echo 'Auth failed'; 
    die(); 
} 
echo 'Hello, ' . $user->userName(); 
Смежные вопросы