2010-08-19 195 views
3

我可能會在這裏丟失一些東西,我不確定。谷歌搜索也沒有真正幫助。如何在另一個類中創建一個類的實例

我想要做的就是調用databaseServer類,並在我的userControl類中使用它的方法。這裏是我的lib_class.php文件:

<?php 

include('definitions.php'); 

class databaseServer { 

    var $con; 
    var $db; 
    var $close; 
    var $qry; 
    var $sql; 

    function connect($host,$user,$pw,$db) { 
     $this->con = mysql_connect($host,$user,$pw); 
     if (!$this->con) { 
      die('Could not connect: ' . mysql_error()); 
      } 
     else { 
      echo "Database Connected"; 
      } 
     $this->selectDb($db); 
     } 

    function selectDb($database) { 
     $this->db = mysql_select_db($database,$this->con); 
     if (!$this->db) { 
      echo "Could not Select database"; 
      } 
     else { 
      echo "Database Selected"; 
      } 
     } 

    function disconnect() { 
     $this->close = mysql_close($this->con); 
     if ($this->close) { 
      echo "Disconnected"; 
      } 
     } 

    function query($test) { 
     if (!mysql_query($test)) { 
      die("Error: " . mysql_error()); 
      } 
     } 

} // databaseServer 

class cookie { 

    var $expireTime; 

    function set($name,$value,$expiry) { 
     $this->expireTime = time()+60*60*24*$expiry; 
     setcookie($name,$value,$expireTime); 
     } 

    function delete($name) { 
     setcookie($name,"",time()-3600); 
     } 

    function check($name) { 
     if (isset($_COOKIE["$name"])) 
      echo "Cookie Set"; 
     else 
      echo "Cookie failed"; 
     } 

} //cookie 

class userControl { 

    public function __construct(databaseServer $server) { 
     $this->server = new databaseServer(); 
    } 

    function createUser($uname,$pword) { 

     $this->server->connect(DB_HOST,DB_USER,DB_PASS,DB_NAME); 
     $result = $this->server->query("SELECT * FROM user_list WHERE uname='" . $this->server->real_escape_string($uname) . "'"); 
     if ($this->result->num_rows() === 0) { 

      if ($this->server->query("INSERT INTO user_list (uname, pword) 
      VALUES ('" . $this->server->real_escape_string($uname) . "','" . $this->server->real_escape_string($pword) . "')") { 
       echo "User Added Successfully!"; 
      } 
      else { 
       echo "Error Adding User!"; 
      } 
     } 

     else { 
      echo "User Already Exists!"; 
     } 

    } // createUser 

} // userControl 

?> 

但是,這是行不通的,我不明白爲什麼。當我從文件中省略userControl類時,我的databaseServer和cookie類正常工作,所以我知道錯誤必須在某個地方。 OOP是我試圖學習的東西,我一直在磕磕絆絆。

databaseServer類中的回聲僅供我測試。我在index.php文件執行類如下:

<?php 

include('definitions.php'); 
include('class_lib.php'); 

$bmazed = new databaseServer(); 

$bmazed->connect(DB_HOST,DB_USER,DB_PASS,DB_NAME); 

$sql = "INSERT INTO blah 
VALUES ('testing 92')"; 

$bmazed->query($sql); 

$bmazed->disconnect(); 

// $control = new userControl(); 

// $uname = "Test1"; 
// $pword = "test1"; 

// $control->createUser($uname,$pword); 

echo "<br />"; 
echo "<br />"; 

?> 

線已註釋掉用於測試目的,所以我不必不斷重新編寫代碼。

我真的不知道問題出在哪裏,我檢查過語法,看起來一切正常。

+0

我試過所有建議的答案,但他們都沒有看到腳本工作。我編輯了原始問題以顯示更多我的代碼。如前所述,代碼純粹是爲了測試目的,所以在那裏有一些奇怪的東西,如看似隨機的回聲。 – 2010-08-19 17:45:32

+0

@Saladin運行'php -l lib_class.php',你會發現它抱怨在你執行'INSERT'的'if'塊中意外的'{'和'else'。那是因爲你在這個if塊上丟失了關閉''''。在開發代碼時,確保你啓用了'error_reporting'和'display_errors'。 – Gordon 2010-08-19 18:22:33

回答

2

初始化$server

class userControl { 

private $server; 

function __construct() { 
    $this->server = new databaseServer(); 
} 

function createUser($uname,$pword) { 
    $this->server->connect(DB_HOST,DB_USER,DB_PASS,DB_NAME); 
    $result = $this->server->query("SELECT * FROM user_list WHERE uname='" . $this->server->real_escape_string($uname) . "'"); 
    if ($this->result->num_rows() === 0) { 

    if ($this->server->query("INSERT INTO user_list (uname, pword) VALUES ('" . $this->server->real_escape_string($uname) . "','" . $this->server->real_escape_string($pword) . "')") { 
    echo "User added Succesfully"; 
    } 
    else { 
    echo "Error Adding User"; 
    } 

    else { 
    echo "User already exists"; 
    } 
} 

} 
+0

除createUser方法外,您應該引用$ this-> server而不是$ server – 2010-08-19 15:55:58

+0

@Mark謝謝,修復! – 2010-08-19 15:59:10

+1

'$ server'需要一個關鍵字。無論是'var'還是一個可見性修飾符。 – Gordon 2010-08-19 16:27:58

6

聲明類時,不能分配依賴運行時信息的類或實例屬性。請參閱chapter on Class Properties in the PHP Manual

更改類閱讀:

class userControl 
{ 
    protected $_server; 

    public function __construct() 
    { 
     $this->_server = new databaseServer(); 
    } 
} 

此外,要訪問類/實例成員,你必須使用$this關鍵字,例如

$this->_server->connect(); 

在一個旁註,而composition是好的,aggregation更好。它可以幫助您的代碼保持可維護性和鬆散耦合,這意味着更換組件會更容易,例如編寫UnitTests時。所以考慮改變構造函數使用Dependency Injection

在構造
+4

或者更好的辦法是使用依賴注入將數據庫服務器放入類public function __construct(DatabaseServer $ server){$ this - > _ server = $ server; }' – ircmaxell 2010-08-19 15:49:44

+0

我不同意你使用下劃線作爲變量前綴,因爲你的例子顯然是PHP5代碼。 – 2010-08-19 15:56:22

+0

@Alan我正在使用[ZF的編碼標準](http://stackoverflow.com/questions/1798916/why-does-the-zend-framework-prepend-an-underscore-here/1799034#1799034),但隨意不同意這個慣例。在旁註中,[PEAR的編碼約定需要私有屬性的下劃線,但不再使用PHP5時的受保護屬性。](http://pear.php.net/manual/en/standards.naming.php) – Gordon 2010-08-19 16:26:48

1

其一,$服務器不會從內部的createUser(),因爲它是在不同的範圍進行訪問。 PHP範圍的工作原理與C風格語言所期望的有所不同。

嘗試將$ server傳遞給createUser(),或者在createUser()中初始化服務器,在這種情況下,您可能應該有一個getServer()函數,以免不必要地初始化它。

第三個選項是迄今爲止最糟糕的,它是在頂部,在函數內部執行「global $ server」。但這是非常糟糕的做法。你被警告了。

最後但並非最不重要的一點,您應該在SQL查詢中查找COUNT(*)而不是*,因爲否則您將選擇所有用戶。 :)

如果您想對PHP的範圍進一步信息,請參見這裏(強烈推薦): http://php.net/manual/en/language.variables.scope.php

希望它能幫助!

0

語法上的問題當然是一個問題。但是,我的代碼更加根本錯誤的是,databaseServer-> query方法沒有返回值。讓它返回一個值解決了問題。

我認爲,有時候不可能看到樹木。 :)

相關問題