从单例类调用到函数,该函数又调用该类的方法

时间:2010-05-12 14:16:37

标签: php singleton

我仍在寻找一种方法来恰当地表达它(我不是母语人士......)。

所以我有这个实现单例模式的类SQL(出于显而易见的原因)我还有这个函数checkUsr(),它使用SQL之一来查询数据库方法

只要我不在checkUsr()课程内拨打SQL,一切正常。当我这样做时,脚本只是退出并显示一个空白页面 - 没有返回错误,没有抛出异常......发生了什么?我该如何解决这个问题?

编辑:

这里的一些代码:

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);
}

因此,当我从SQL类中调用checkUsr时,会出现问题。但是,当从其他一些班级调用时,它不会发生......

1 个答案:

答案 0 :(得分:0)

您必须打开error_reporting,才能通过php查看错误消息,否则您将获得您描述的空白页面。 在index.php文件的顶部,包含以下内容:

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

不要忘记在生产机器中将其关闭,这仅用于开发。

您已将变量$ instance声明为函数内的静态,而不是内部类。这是两件完全不同的事情。请参阅静态变量here的用法,并查看静态类属性here的用法。您需要后者,因此请将代码更改为:

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

}

实现SQL类或任何类型的数据库访问作为单例是一个非常糟糕的主意,从长远来看,它会让你非常努力。如果事实证明你 需要支持另一个数据库,比如你需要从论坛中提取信息,这个数据库与你的网站不同,你会遇到严重的问题。