2012-06-14 7 views
1

У меня есть класс page для моей веб-страницы. Когда это вызывается, он создает новый user. Это позволяет мне проверить, есть ли пользователь, вошедший в этом метод конструкт из page класса:.Доступ к классу, созданному в другом классе

public function __construct() { 
    // check user is logged in 
    require 'classes/user.class.php'; 
    $user = new user(); 
    if(!$user->isLoggedIn()) { 
     // user is not logged in 
     // load login page 
    } 
    else { 
     // user is logged in 
     // load requested page 
    } 
} 

Вся проверка пользователя вещь работает просто отлично, но теперь я хочу, чтобы получить доступ к user объект, была создана во время строительства page. Является ли это возможностью с тем, как я это делаю, и если да, то как мне получить доступ к объекту user?

+1

Доступ к нему где? Вне класса 'page'? Пожалуйста, будьте более конкретными. –

+0

Насколько я знаю, PHP не поддерживает классы вложенности. – Tomalak

+0

опубликуйте свой пользовательский класс. – Vamsi

ответ

4

Чтобы быть честным, это довольно спорный дизайн. Лучше бы создать пользовательский объект вне контекста страницы, затем «инъекционный» это, где это необходимо:

# page.php 
class Page { 
    # private $_user; # maybe ... probably not needed. 
    public function __construct(User $user) { 
     if ($user->isLoggedIn()) { /* etc */ } 
     # if this will be needed in other functions, save a copy of the 
     # obj reference to as an object attribute: 
     $this->_user = $user; 
    } 
} 

# user.php 
class User { 
    public function isLoggedIn() { /* etc */ } 
} 

# request_controller.php 
$user = new User(); 
$page = new Page($user); 

В основном, избежать инициирования классов внутри методов объекта. Это приводит к не поддерживаемому и не проверяемому коду. Особенно, когда вам нужно «издеваться» над экземплярами с макетными сервисами. Я бы порекомендовал вам переосмыслить дизайн, тот, который у вас есть, будет только пахнет временем.

+0

+1 Тем более, что страница не имеет очевидных отношений с владением :) –

+0

Это на самом деле разумное предложение. Этот код следует за важными принципами проектирования ООП, такими как DI, SRP и делает ваш код менее зависимым и связанным. +1 –

+0

Благодарим вас за советы. Единственная причина, по которой я это делал, - это то, что я пытался поставить код, связанный с созданием страницы, в класс 'page', и проверка этого пользователя является частью этого процесса. Я пересмотрю свой дизайн на основе вашего предложения. – user1187347

1

я могу поставить user как переменную экземпляра, а затем получить доступ к нему с помощью ключевого слова $this->

пример:

class Page { 
    public $user; // private if you want to access it only within Page 

    public function __contruct() { 
     $this->user = new user(); 
     // rest of your code 
    } 
} 
+0

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

+0

Это работает для меня. – user1187347

+0

Если вы можете помиловать мое невежество/беззаботность, пожалуйста, можете ли вы объяснить, является ли это приемлемым подходом к использованию? – user1187347

0

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

+0

Сессия используется для хранения информации между двумя или более коммуникационными устройствами или между компьютером и пользователем. Это не постоянное хранилище данных объекта или объекта, а защита его использования так неправильно. Существуют базы данных, кеш памяти и т. Д., Которые используются для сохранения объектов. Пожалуйста, избегайте хранения объекта в сеансе, чтобы иметь возможность _access его в любом месте. –

1
<?php 
require_once 'classes/user.class.php'; 
class page { 
    private $myUser; 

    public function __construct() { 
     // check user is logged in 

     $this->myUser = new user(); 
     if(!$this->myUser->isLoggedIn()) { 
      // user is not logged in 
      // load login page 
     } 
     else { 
      // user is logged in 
      // load requested page 
     }  
    } 

    public function getUser() { 
     return $this->myUser; 
    } 
} 

$p = new page(); 

$user = $p->getUser(); 
?> 

Необходимо сделать трюк для вас.

Смежные вопросы