Вызов из одноэлементного класса функции, которая, в свою очередь, вызывает метод этого класса - PullRequest
0 голосов
/ 12 мая 2010

Я все еще ищу способ правильно его сформулировать (я не являюсь носителем языка ...).

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

Все работает нормально, пока я не вызываю checkUsr() из класса SQL. Когда я это делаю, сценарии просто выходят, и отображается пустая страница - никаких ошибок не возвращается, исключение не выдается ... Что происходит? И как мне обойти эту проблему?

EDIT:

код здесь:

class SQL
{
  public static function singleton()
  {
    static $instance;
    if(!isset($instance))
      $instance = new SQL;
    return $instance;
  }

  public function someOtherFun()
  {
    checkUsr();
  }

  public function tryLoginAuthor( $login, $sha1 )
  {
    // SQL query
  }
}

function checkUsr()
{
    if (!isset($_SESSION['login']) || !isset($_SESSION['sha1']))
        throw new Exception('Not logged in', 1);
    $SQL = SQL::singleton();
    $res = $SQL->tryLoginAuthor($_SESSION['login'], $_SESSION['sha1']);
    if (!isset($res[0]))
      throw new Exception('Not logged in', 1);
}

Итак, проблема возникает, когда я вызываю checkUsr из класса SQL. Однако этого не происходит при вызове из какого-либо другого класса ...

1 Ответ

0 голосов
/ 14 мая 2010

Вы должны включить error_reporting, чтобы увидеть сообщения об ошибках по php, в противном случае вы получите пустую страницу, которую вы описываете. В верхней части вашего файла index.php, включите эти:

ini_set('display_errors', true);
error_reporting(E_ALL | E_STRICT);

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

Вы объявили переменную $ instance как статическую внутри функции, а не внутри класса. Это две совершенно разные вещи. Посмотрите использование статических переменных здесь и посмотрите использование статического свойства класса здесь . Вы нуждаетесь в последнем, поэтому измените свой код на это:

class SQL {
    static $instance;
    public static function singleton()
      {
        if(!isset(self::$instance))
          self::$instance = new SQL;
        return self::$instance;
      }
...

}

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

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