2011-07-18 34 views
-2

我有這樣的代碼(兩班)

class url 
{ 
     private $profile_id; 
     private $short; 
     public $notice; 
     private $forbidden; 
     function url() { 
       $this->forbidden = array('index.php', 'index.html', 'styles.css', 'style.css'); 
       if ($_POST['profile_id']){ 
//      global $db; 
         $exists = db::fetch_one(db::query("SELECT count(1) FROM ".TABLE." WHERE profile_id = ".intval($_POST['profile_id']).";")); 
         $exists_username = db::fetch_one(db::query("SELECT count(1) FROM ".TABLE." WHERE url_short = '".db::mres($_POST['url_short'])."'")); 
       } 
     } 
} 

class db 
{ 
     function db(){ 
       mysql_connect("localhost", "root", "h1gh§c1a0"); 
       mysql_select_db("gplus") or die(mysql_error()); 
       mysql_set_charset("utf8") or die(mysql_error()); 
     } 

     function query($query){ 
//    print_r($this); 
       $result = mysql_query(self::protect($query)) or _log("Query failed: ".$query); 
       //$this isn't working 
       //$result = mysql_query($this->protect($query)) or _log("Query failed: ".$query); 
       return $result; 

     } 

     function fetch($result){ 
       $result = mysql_fetch_assoc($result); 
       return $result; 
     } 

     function fetch_one($result){ 
       $result = mysql_fetch_row($result); 
       return $result['0']; 
     } 


     function mres($text) { 
       return mysql_real_escape_string($result); 
     } 

     function protect($text) { 

       if (preg_match("/UNION/i", $text)) { 
         _log("Hack attempt: ".$text); 
         die(); 
       } 
//    die($text); 
       return $text; 
     } 
} 

$db = new db(); 
$url = new url(); 

我的問題是,這條線

$result = mysql_query(self::protect($query)) or _log("Query failed: ".$query); 

的作品,但是當我改變self::$this->它拋出錯誤

Fatal error: Call to undefined method url::protect() in /data/my/db.php on line 71 

這怎麼可能?我認爲$this->function();在當前類中調用方法。我究竟做錯了什麼?

+0

'$ this'指向對象的當前實例。你使用'db'作爲靜態類,因此沒有實例。使用'self'很好。你爲什麼堅持使用'$ this'? – kba

+0

我正在創建瀏覽器遊戲,我從來沒有使用靜態類。但我喜歡 - > $ this->;) – genesis

回答

2

url構造函數,你調用db::query靜態,因此,protect()將被稱爲靜態以及,因此,$this將不可用。

您可以保持它的所有靜態或者你可以注入的db一個實例爲url

$db = new db(); 
$url = new url($db); 
+0

所以我需要全局化$ db並通過$ db-> query()來調用它。 ? – genesis

+0

不一定 - 在這種情況下沒有理由不使用db作爲靜態類。 – weltraumpirat

+0

@webbiedave:注入和全球化有區別嗎? – genesis

1

使用db::query(),你是在一個靜態的方式訪問數據庫(你調用一個類的方法,而不是實例方法)。因此,沒有什麼可以通過$ this訪問,因爲$ this返回指向類實例的指針,而self是對類本身的引用。

如果您使用$db->query()$this->protect()也可以使用。

+0

我聽說我不應該在函數中全局化變量。這是真的還是另一種方式? – genesis

+0

您始終可以將$ db聲明爲類url的實例變量,或者將其作爲參數傳遞。但正如我上面所說 - 爲什麼你堅持讓db成爲一個類實例?它不包含任何變量,並且您不可能擁有多個數據庫。在這種情況下使用靜態類是完全正確的。 – weltraumpirat

+0

我總是使用(d)實例,而不是我所做的。你能跟我一起去討論室嗎? – genesis