Переопределение PHP __construct - PullRequest
2 голосов
/ 19 июля 2011

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

function __construct() {
   parent::__construct();
   $this->check();
   $this->mid = $this->session->userdata('member_id');
}

function check() {
   if($this->mid == ''){
      $this->login();
   }
}

function signup() {
   // registration code
}

Этот конструктор, конечно, запускается перед любой другой функцией в классе. Однако у меня есть функция регистрации, которая требует, чтобы пользователи не входили в систему при доступе к ней. Есть ли способ сделать исключение или переопределить функцию __construct, чтобы не зарегистрированные пользователи могли получить доступ к функции регистрации?

Ответы [ 3 ]

6 голосов
/ 19 июля 2011

Вам необходимо изменить код.Сначала вы определяете класс, который ВСЕГДА делает что-то (проверка пользователей), затем вы хотите использовать этот класс для пользователей, которые этого не имеют (не проверенные пользователи);чтобы избежать полного взлома, вы должны реорганизовать свой код, а не искать патч, который позволит вам обойти ограничение, наложенное на ваш класс.

2 голосов
/ 19 июля 2011

У меня есть простое руководство при разработке классов: в конструкторе нет функциональности (только вещи, которые что-то инициализируют)

Если это абсолютно необходимо в этом случае, установите if, чтобы проверить, вошел ли пользователь в систему,звонок как if(User::logged_in()) { .. }

1 голос
/ 19 июля 2011

__construct автоматически вызывается при создании объекта, его невозможно изменить.Однако, если вы расширите рассматриваемый класс и напишите функцию __construct для этого производного класса, он сначала будет вызван, и вы можете сделать все, что захотите, а затем вызвать родительский конструктор через parent::__construct();, как в вашем примере.Имейте в виду, что делать вещи с объектами без вызова конструктора, как правило, не лучшая идея, поэтому я бы посоветовал реорганизовать код так, чтобы логика вынималась за пределы конструкторов в максимально возможной степени.Тогда также будет проще переписать материал.

...