Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OO PHP构造函数不工作?_Php_Oop_Object_Constructor - Fatal编程技术网

OO PHP构造函数不工作?

OO PHP构造函数不工作?,php,oop,object,constructor,Php,Oop,Object,Constructor,我是开发面向对象PHP的新手,并尝试创建登录系统。因此,我制作了一个索引文件和两个类。在我看来,使用var_dump(),输出将包含元素status、username等 但发生的事情是我收到了这个通知: notice: Undefined variable: connector in C:\xampp\htdocs\1-4-LT3\Concept\Authenticator.php on line 15 Fatal error: Call to a member function connec

我是开发面向对象PHP的新手,并尝试创建登录系统。因此,我制作了一个索引文件和两个类。在我看来,使用var_dump(),输出将包含元素status、username等

但发生的事情是我收到了这个通知:

notice: Undefined variable: connector in C:\xampp\htdocs\1-4-LT3\Concept\Authenticator.php on line 15

Fatal error: Call to a member function connect() on a non-object in C:\xampp\htdocs\1-4-LT3\Concept\Authenticator.php on line 15
在我看来,这似乎是建设者没有工作

我做错了什么?为什么$connector变量未定义

哦,我知道这种方式是非常不安全的,但我只是想了解一下OO PHP

index.php文件:

<?php
include 'Connector.php';
include 'Authenticator.php';
$connector = new Connector('localhost', 'root', '', 'hondsrug_db');
$authenticator = new Authenticator($connector);

$authenticator->login('root', 'admin');
var_dump($authenticator);
?>
<?php
class Connector {
    var $mysqli;
    var $host;
    var $username;
    var $password;
    var $database;
    public function Connector($host, $username, $password, $database){
        $this->host = $host;
        $this->username = $username;
        $this->password = $password;
        $this->database = $database;
    }

    public function query($query){
        $result = $mysqli->query($query);
        if($result->num_rows > 0){
            return $result->fetch_assoc;
        } else {
            return null;
        }
    }
    public function connect(){
        $this->mysqli = new mysqli($host, $username, $password, $database);
    }
    public function disconnect(){
        $mysqli->close();
    }

}


?>
<?php
// maakt verbinding met db
// logt in adh van methode
// bepaalt rang, en implementeert hiervoor een getter
class Authenticator {
    var $connector;
    var $status;
    var $username;
    var $rank;
    public function Authenticator($connector){
        $this->connector = $connector;
    }

    public function login($username, $password){
        $connector->connect();
        $result = $connector->query('SELECT password, rank FROM users WHERE username = '.$username);
        if($result != null){
            if($result['password'] == SHA1($password)){
                $this->status = true;
                $this->username = $username;
                $this->rank = $result['rank'];
            } else {
                $this->status = false;
                $this->username = null;
                $this->rank = null;
            }
        } else {
            $status = false;
        }

        $connector->disconnect();
    }

    public function getRank(){
        return $rank;
    }

    public function getStatus(){
        return $status;
    }
}



?>

connector.php文件:

<?php
include 'Connector.php';
include 'Authenticator.php';
$connector = new Connector('localhost', 'root', '', 'hondsrug_db');
$authenticator = new Authenticator($connector);

$authenticator->login('root', 'admin');
var_dump($authenticator);
?>
<?php
class Connector {
    var $mysqli;
    var $host;
    var $username;
    var $password;
    var $database;
    public function Connector($host, $username, $password, $database){
        $this->host = $host;
        $this->username = $username;
        $this->password = $password;
        $this->database = $database;
    }

    public function query($query){
        $result = $mysqli->query($query);
        if($result->num_rows > 0){
            return $result->fetch_assoc;
        } else {
            return null;
        }
    }
    public function connect(){
        $this->mysqli = new mysqli($host, $username, $password, $database);
    }
    public function disconnect(){
        $mysqli->close();
    }

}


?>
<?php
// maakt verbinding met db
// logt in adh van methode
// bepaalt rang, en implementeert hiervoor een getter
class Authenticator {
    var $connector;
    var $status;
    var $username;
    var $rank;
    public function Authenticator($connector){
        $this->connector = $connector;
    }

    public function login($username, $password){
        $connector->connect();
        $result = $connector->query('SELECT password, rank FROM users WHERE username = '.$username);
        if($result != null){
            if($result['password'] == SHA1($password)){
                $this->status = true;
                $this->username = $username;
                $this->rank = $result['rank'];
            } else {
                $this->status = false;
                $this->username = null;
                $this->rank = null;
            }
        } else {
            $status = false;
        }

        $connector->disconnect();
    }

    public function getRank(){
        return $rank;
    }

    public function getStatus(){
        return $status;
    }
}



?>

以及Authenticator.php文件:

<?php
include 'Connector.php';
include 'Authenticator.php';
$connector = new Connector('localhost', 'root', '', 'hondsrug_db');
$authenticator = new Authenticator($connector);

$authenticator->login('root', 'admin');
var_dump($authenticator);
?>
<?php
class Connector {
    var $mysqli;
    var $host;
    var $username;
    var $password;
    var $database;
    public function Connector($host, $username, $password, $database){
        $this->host = $host;
        $this->username = $username;
        $this->password = $password;
        $this->database = $database;
    }

    public function query($query){
        $result = $mysqli->query($query);
        if($result->num_rows > 0){
            return $result->fetch_assoc;
        } else {
            return null;
        }
    }
    public function connect(){
        $this->mysqli = new mysqli($host, $username, $password, $database);
    }
    public function disconnect(){
        $mysqli->close();
    }

}


?>
<?php
// maakt verbinding met db
// logt in adh van methode
// bepaalt rang, en implementeert hiervoor een getter
class Authenticator {
    var $connector;
    var $status;
    var $username;
    var $rank;
    public function Authenticator($connector){
        $this->connector = $connector;
    }

    public function login($username, $password){
        $connector->connect();
        $result = $connector->query('SELECT password, rank FROM users WHERE username = '.$username);
        if($result != null){
            if($result['password'] == SHA1($password)){
                $this->status = true;
                $this->username = $username;
                $this->rank = $result['rank'];
            } else {
                $this->status = false;
                $this->username = null;
                $this->rank = null;
            }
        } else {
            $status = false;
        }

        $connector->disconnect();
    }

    public function getRank(){
        return $rank;
    }

    public function getStatus(){
        return $status;
    }
}



?>

您必须在PHP中明确使用$this。总是很悲伤

public function login($username, $password){
    $this-> connector->connect();

您的登录方法需要使用

$this->connector->connect();
$result = $this->connector->query('SELECT password, rank FROM users WHERE username = '.$username);

不是

问题就在这里

$connector->connect();
您已经在类验证器和构造函数中使用了var$connector

 $this->connector = $connector;
因此,在访问该方法时,您需要执行以下操作

 $this->connector->connect();

现在您使用类名作为函数名,使其成为构造函数,虽然它是向后兼容的,但最好使用magic方法
\u construct
,也可以使用
var
而不是
public、private、protected

,这只是有一天可能会影响您的一个小注意事项。如果您开始使用名称空间,并且名称空间的最后一个元素与方法同名,则此方法将不会被视为构造函数。所以我建议使用_构造。为什么呢?你愿意用这种语言来猜测你的意思吗?