代码之家  ›  专栏  ›  技术社区  ›  Saladin Akara

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

  •  3
  • Saladin Akara  · 技术社区  · 15 年前

    我不确定这里可能漏了什么。谷歌搜索也没有真正的帮助。

    我想做的是调用databaseServer类并在userControl类中使用它的方法。这是我的图书馆_类.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类工作正常,所以我知道错误一定在该类的某个地方。哎呀,我一直在努力学习,但我一直在磕磕绊绊。

    <?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 回复  |  直到 15 年前
        1
  •  3
  •   Ed Mazur    15 年前

    初始化 $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
  •  6
  •   Gordon Haim Evgi    15 年前

    声明类时,不能指定依赖于运行时信息的类或实例属性。看到了吗 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 .

        3
  •  1
  •   Teekin    15 年前

    例如,$server将无法从createUser()中访问,因为它位于不同的作用域中。PHP作用域的工作原理与C风格语言的工作原理稍有不同。

    第三个选项是迄今为止最糟糕的,即在函数内部的顶部执行“global$server”。但这是非常糟糕的做法。你已经被警告了。

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

    如果您想进一步了解PHP的作用域,请参阅此处(强烈建议): http://php.net/manual/en/language.variables.scope.php

    希望有帮助!

        4
  •  0
  •   Saladin Akara    15 年前

    句法上的东西当然是个问题。但我的代码更根本的错误是databaseServer->query方法不返回值。使其返回一个值修复了问题。

    推荐文章