6

データベース クラスに PDO 接続があり、最近、これを他のクラスの拡張機能として使用しています。つまりclass Users extends Database、Users クラスに関数を持たなくても常にデータベース接続を維持できます。

しかし、誰かがこれを悪い習慣として行うべきではないと指摘しましたが、なぜこの悪い習慣なのですか? また、拡張せずにユーザー クラスのデータベース クラスに接続するにはどうすればよいでしょうか。

現在、関数内にデータベースへの呼び出しがあります。viewall()これを関数に入れようとし__construct()ましたが、パラメーターを持つことを主張しました

以下のコードを試してみましたが、次のようなエラー メッセージが表示されます。

Fatal error: Call to undefined method Database::prepare() in E:\xampp\htdocs\attendance\class.Register.php on line 13

データベースを呼び出す方法についてのアイデアはありますか?

これは私のコードです:

class.Connect.php

<?php

// Database connection PDO

class Database {

    public function __construct() {
        // Connection information
        $host   = 'localhost';
        $dbname = 'attendance';
        $user   = 'root';
        $pass   = '';

        // Attempt DB connection
        try
        {
            $this->pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            //echo 'Successfully connected to the database!';
        }
        catch(PDOException $e)
        {
            echo $e->getMessage();
        }

    }

     public function __destruct()
    {
        // Disconnect from DB
        $this->pdo = null;
        //echo 'Successfully disconnected from the database!';
    }


}

?>

class.Register.php

<?php

require 'class.Connect.php';

class Register {

    public function viewall() {
        $pdo = new Database();

        $stmt = $pdo->prepare('SELECT * FROM users');
        $stmt->execute();

    $stmt->fetch();

    }
}

$run = new Register();
$run->viewall();

?>
4

3 に答える 3

10

簡単な経験則: クラスがextends別の場合、そのクラスその親クラスです (わずかに変更または拡張されているだけです)。親クラスの代わりにこの子クラスを渡すことができます。例:

class Foo { }

class Bar extends Foo { }

function baz(Foo $foo) { }

baz(new Bar);

これは機能し、abaz()を期待しますが、 aも受け入れFooます。BarBar Foo

さてあなた? いいえ。ユーザーはデータベースではありません。ユーザーはデータベースを使用します。もしあったとしても、compositionを使うべきです:Users Database

class User {

    protected $database;

    public function __construct(Database $database) {
        $this->database = $database;
    }

}

クラスは、その責任が何であるかであるべきです。ユーザー管理クラスの役割は、ユーザー データを管理することです。その一部にはデータベースとの対話が含まれる場合がありますが、それはユーザー管理クラスがデータベースであることを意味しません。の場合、それは、クラスが実行できるすべてのこと (およびそれ以上) を実行できることを意味します。つまり、クラスの代わりにどこでもクラスを使用でき、意味がありません。責任を分離してください。User extends DatabaseDatabaseUserDatabase

現在、それが正しい構造であるかどうかはまだ議論の余地がありますが、正しい方向に進んでいます。しかし、実際には1 人の userUserを表すクラスが必要になる場合があります。次に、オブジェクトの取得とデータベースへの格納に関係するor or or what があります。このクラスは、それを行うためにaを使用します。これにより、責任が明確に分離されます。クラスはユーザー データを表し、クラスはデータベースと対話し、中間で 2 つの間でネゴシエートします。UserManagerUserORMUserStorageUserDatabaseUserDatabaseUserORM/Manager/whatever

于 2013-09-17T15:04:35.437 に答える
0

クラスを拡張することは良い習慣ですか?

ええ、そうです、あなたがそれを正しく、正しい理由で行うのであれば。

オブジェクト指向プログラミングにおける継承 (クラス拡張) の概念は、現実世界にそれらのオブジェクトがある場合と同じように機能します。

現実の世界では、世界の車を使用する場合、慣例により、通常はすべての車を意味し、ホイール、エンジン、ステアリング、スロットル、ブレーキなどの共通の属性を考慮しますが、これらの属性を持つ車もいくつかあります。また、いくつかの追加機能もあります。たとえば、消防車の車には、取り付けられたはしご、水を投げるためのチューブなど、いくつかの追加の属性もあります。同じことが、一部のオブジェクトの「動作」について考えることができます。たとえば、車は動くことができます。つまり、移動するために道路上で車輪が回転することを意味します (Car move メソッドでモデル化)。また、消防車には、はしごを上下に移動できるなど、拡張された動作がある場合があります。これは、FireTruckCar クラスのメソッド moveLadder() によってモデル化できます。

これらの概念を PHP クラス (OOP) で表現したい場合は、次のようにします。

class Car {

    protected $wheels;
    protected $engine;
    //Rest attributes of Car.

    public function __construct($wheels, $engine) {
        $this->wheels = $wheels;
        $this->engine = $engine;
        //Initialize more attributes.
    }
    function move(){
        $this->wheels->rotate();
    }
    //.....

}

class FireTruckCar extends car{

    //Additional Attributes.
    //The attributes of Car class belong to this 
    //one too and are accessible as private.
    protected $ladder;
    protected $tubes;


    public function __construct($wheels, $engine, $ladder, $tubes) {
        //Call the parent constructor, to initialize parent attributes
        parent::__construct($wheels, $engine);
        $this->ladder = $ladder;
        $this->tubes = $tubes;
    }
    function moveLadder($direction){
        $this->ladder->move($direction);
    }
    //...

}

もちろん、継承や一般的な OOP には、メソッドのオーバーロード/オーバーライド、抽象クラス化など、多くの追加の概念がありますが、要点が見落とされるため、ここではそれらについて説明しません。ただし、原則についてよく学びます。

于 2013-09-17T15:32:21.030 に答える
-1

アプリケーションのどこにでも接続できるように、データベースに接続する方法はいくつかあります。良い習慣として、データベース操作を処理できる別のクラスを使用して簡単に行うことができ、そのクラスからのデータベース操作を必要とするすべてのクラスを拡張します。

まず、データベース クラスを少し変更し、以下のようにデータベース接続の引数を渡します。

<?php

// Database connection PDO

class Database {

    public function __construct($host, $dbname, $user, $pass) {
        // Connection information


        // Attempt DB connection
        try
        {
            $this->pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            //echo 'Successfully connected to the database!';
        }
        catch(PDOException $e)
        {
            echo $e->getMessage();
        }

    }

     public function __destruct()
    {
        // Disconnect from DB
        $this->pdo = null;
        //echo 'Successfully disconnected from the database!';
    }


}

?>

次に、別のクラスを作成して、以下のように ObjectModel と呼びます

 class ObjectModel
    {

     protected $db

    public function __construct()
     {

       $this->db = new Database($host, $dbname, $user, $pass) //ofcourse you can get the db connections details and database name from a config file

   }

 // you can have more db operations functions like insert, update, delete etc

 } 

SO ObjectModel クラスは、すべての CRUD およびその他のデータベース操作を処理し、クエリも実行します。$db オブジェクトを使用する場合は、ObjectModel クラスで直接使用できます。また、以下のように OBjectModel の子クラスでも使用できます。

class Users extends ObjectModel
{

    public function getUsers()
    {
         //$this->db->  whatever operation you want to do you can do it using this db           object
     }
}

ObjectModel には $db というデータベース クラスのオブジェクトがあることを思い出してください。したがって、データベース クラスが PDO を使用している場合、ObjectModel の $db オブジェクトには、PDO を使用するすべての操作が含まれます。

私は自分のクラスにそのような ObjectModel クラスを使用していて、コードを何度も書く時間を大幅に節約できるので、これがあなたにも役立つことを願っています:)。

ハッピーコーディング;)

于 2013-09-17T15:23:23.517 に答える