2014-02-19 5 views
0

я пытаюсь установить класс внутри класса, в статическом методекласс, как «установить» внутри класса :: Статическая переменная

class db extends PDO 
    { 
     private static $error; 
     private static $sql; 
     private static $bind; 
     private static $errorCallbackFunction; 
     private static $errorMsgFormat; 
     private static $pdo; 

     public function __construct($dsn = "mysql:host=localhost;dbname=main;", 
             $user="root", $passwd="") 
     { 
      $options = array(
       PDO::ATTR_PERSISTENT => true, 
       PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 
       PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" 
      ); 

      try { 
       self::$pdo = new PDO($dsn, $user, $passwd, $options); 
      } catch (PDOException $e) { 
       self::$error = $e->getMessage(); 
      } 
     } 

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

public static function run($sql, $bind="") 
{ 
    self::$sql = trim($sql); 
    self::$bind = self::cleanup($bind); 
    self::$error = ""; 

    try { 
     $pdostmt = self::$pdo->prepare(self::$sql); 

есть ошибка с сообщением об ошибке

вызов функции-члена подготовить() на NO n-объект

Возможно ли установить класс внутри статической переменной? спасибо за помощь.

+0

http://stackoverflow.com/a/20102549/285587 –

+0

как функция функции run(), она должна принимать * массив * как связывание. и там ** должно быть NO cleanup() вообще, а не мельком увидеть это, что бы вы ни говорили с этой функцией. ** Если у вас есть, значит, вы не понимаете, что такое PDO –

ответ

-1

Эта ошибка означает, что self::$pdo не является объектом. Это все статические переменные и методы, но вы полагаетесь на конструктор , чтобы установить экземпляр PDO, поэтому, если кто-то звонит db::run()до, вызывающий new db(...), класс будет работать неправильно. Если вы хотите продолжить статический статический класс, вам нужно где-то выполнить настройку, выполненную в конструкторе, перед вызовом ::run.

Я хотел бы предложить вам попробовать использовать класс как экземпляр, однако, например, так:

class DB { 
    private $error; 
    private $sql; 
    private $bind; 
    private $errorCallbackFunction; 
    private $errorMsgFormat; 
    private $pdo; 

    public function __construct($dsn = "mysql:host=localhost;dbname=main;", $user="root", $passwd=""){ 
     $options = array(
      PDO::ATTR_PERSISTENT => true, 
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 
      PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" 
     ); 

     try { 
      $this->pdo = new PDO($dsn, $user, $passwd, $options); 
     } catch (PDOException $e) { 
      $this->error = $e->getMessage(); 
     } 
    } 

    public function run($sql, $bind = ''){ 
     $this->sql = trim($sql); 
     $this->bind = self::cleanup($bind); 
     $this->error = ""; 

     try { 
      if(!isset($this->pdo)){ 
       throw new \RuntimeException('No PDO instance'); 
      } 
      $pdostmt = $this->pdo->prepare(self::$sql); 
     ... 
    } 
} 

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

Кроме того, в вашем примере вы расширяете базовый класс PDO. Расширение внутренних классов PHP обычно является опасной практикой, и учитывая, что вы создаете то, что выглядит как обертка , а не расширение класса PDO, для этого не существует никакой причины.

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