0

次のコードがあり、エラーが出力される理由を説明できません。

class User extends mysqli{

    // property declaration
    private $server;
    private $user;
    private $pass;
    private $database;
    private $conn;

    function __construct($server, $user, $pass, $database){

        $mysqli = new mysqli($server, $user, $pass, $database);
        if ($mysqli->connect_errno) {
            echo "Connect failed: ". $mysqli->connect_error;
            exit();
        }

        $this->conn = $mysqli;

        return 0;

    }

    function __destruct(){

        $conn = $this->conn;
        $conn->close();

    }
}

そしてメインコード

include("global_config.php");

require "User.php";

$u = new User($con['server'],$con['user'],$con['pass'],$con['db']);

$u->query("SELECT * FROM users");

このエラーを返します

Warning: mysqli::query() [mysqli.query]: Couldn't fetch User in E:\Xampp\htdocs\testphp\testMysql.php on line 9

通常、PHP の継承、子変数を使用する親関数のように動作する必要があります。

しかし、そうではありません

Google 検索で使用できる可能性のあるキーワードのほとんどを考えて、すでに想像力を使い果たしました。

何か案は?

4

1 に答える 1

4

最初に間違っているのは、Userオブジェクトがmysqliオブジェクトを拡張していて、類似したものがないことです。継承は「ISA」関係です。また、UserオブジェクトでMysqliオブジェクトを使用するには、「HASA」関係が必要です。これは作曲とも呼ばれます。

また、継承を使用している場合は、両方を実際に使用する必要がないため、合成は使用しません。この場合、継承は間違った選択です。

Mysqliを介してUserオブジェクトにデータベースへのアクセスを許可する場合は、Userオブジェクト内にMysqliオブジェクトを含める必要があります。

それを達成するための最良の方法は、2つのオブジェクトを持つことです。1つはMysqliを表し、もう1つはUserを表します。

Userクラスは次のようになります。

class User 
{
    private $user;
    private $pass;
    private $db;

    function __construct($db)
    {
        $this->db = $db;
    }
}

そして、あなたはそれをこのように使うでしょう:

$db = new mysqli($server, $user, $pass, $database);
$user = new User($db);

これで、ユーザーはMysqliオブジェクトにアクセスでき、データベースと対話できます。

さらに進んで、mysqliオブジェクトとmysqli stmtオブジェクトの両方を保持する独自の小さなデータベース抽象化レイヤーを作成できます。そこで、CRUDを実行する関数を使用できます。次に、そのデータベース抽象化レイヤーオブジェクトをUserオブジェクトに渡すと、さらに強力になります。

また、exit()関数は使用せず、returnを使用して関数を停止してください。私はあなたが今何を経験しているのかを正確に知っています:)この記事を読んでください:http: //phpmaster.com/liskov-substitution-principle/ そして例を見て、なぜ構成がこれの継承よりも優れているのかを理解してください。

幸運を!

于 2012-11-07T19:25:55.473 に答える