如何在另一个类中创建类的实例

时间:2010-08-19 15:45:10

标签: php oop class

我可能会在这里遗漏一些东西,我不确定。谷歌搜索也没有真正帮助。

我想要做的是调用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 />";

?>

为了测试目的,已经注释掉了行,所以我不必继续重写代码。

我真的不知道问题出在哪里,我检查了语法,一切似乎都很好。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

在构造函数中初始化$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";
   }
 }

}

答案 2 :(得分:1)

例如,$ create服务器不能从createUser()中访问,因为它位于不同的范围内。 PHP范围的工作方式与C风格语言的工作方式略有不同。

尝试将$ server传递给createUser(),或者在createUser()中初始化服务器,在这种情况下你应该有一个getServer()函数,这样你就不会不必要地初始化它。

第三个选项是迄今为止最糟糕的选择,它在函数内部的顶部进行“全局$ server”。但这是非常糟糕的做法。你被警告了。

最后但并非最不重要的一点是,您应该在SQL查询中查找COUNT(*)而不是*,否则您将选择所有用户。 :)

如果您想了解有关PHP范围的更多信息,请参阅此处(强烈推荐): http://php.net/manual/en/language.variables.scope.php

希望它有所帮助!

答案 3 :(得分:0)

语法上的东西肯定是个问题。但是我的代码更根本的错误是databaseServer-&gt;查询方法没有返回值。让它返回一个值来解决问题。

我想,有时候,不可能看到树木。 :)