0

このコードは同じものを出力します。私の質問は、これを行う正しい方法は何ですか。最初のアプローチですか、それとも 2 番目のアプローチですか。または何か良い方法はありますか?あるクラスが他のクラスよりも優れているとは思いません。

<?php
    class Client{
        var $id;
        var $email;

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

        public function get_email($db){
            $sql = $db -> prepare(" SELECT email FROM users  WHERE id = ? ");

            $sql -> bind_param('i', $this->id);
            $sql->execute();

            $sql->bind_result($email);

            if ($sql -> fetch()) {
                return $this->email=$email;
            }
            else
            return false;
        }
    }

    class Client_{
        public function get_email($db, $id){
            $sql = $db -> prepare(" SELECT email FROM users  WHERE id = ?");

            $sql -> bind_param('i', $id);
            $sql->execute();

            $sql->bind_result($email);

            if ($sql -> fetch()) {
                return $email;
            }
            else
            return false;
        }
    }
    ?>

index.php

<?php
$Client = new Client(1);
$a = $Client -> get_email($db);

print_r($a);

$Client_ = new Client_();
$b = $Client_ -> get_email($db, 1);

print_r($b);
?>
4

3 に答える 3

1

2 番目のアプローチでは、将来の使用のために保存するものがないため、クラスをインスタンス化することは意味がありません。したがって、さまざまなデータが別の場所に保存されている場合は、「静的クラス」を使用することをお勧めします。

class Client_{
    static public function get_email($db, $id){
        $sql = $db -> prepare(" SELECT email FROM users  WHERE id = ?");

        $sql -> bind_param('i', $id);
        $sql->execute();

        $sql->bind_result($email);

        if ($sql -> fetch()) {
            return $email;
        }
        else
        return false;
    }
}

// And use it static way without instantiating first:
Client_::get_email( $arg1, $arg2 );

この2つのどちらかを決定する必要がある場合は、最初の1つを選択します。

これらのクラスのいずれかをどのように使用するかはわかりませんが、それでも私にとっては、外部から保存$dbして供給し、ローカル にする方が理にかなっています。$id$email

class Client{
    var $db;

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

    public function get_email($id){
        $sql = $this->db -> prepare(" SELECT email FROM users  WHERE id = ? ");

        $sql -> bind_param('i', $id);
        $sql->execute();

        $sql->bind_result($email);

        if ($sql -> fetch()) {
            return $email;
        }
        else
        return false;
    }
}

また、次の行を変更しました: return $this->email=$email;、おそらく間違っているかもしれませんが、意味がないと思います。

于 2012-04-23T02:05:54.253 に答える
0

varphpでクラス変数を定義するのに使うのはやめてください。もう 4.x ではありません。今どこにpublic、 、privateおよびがありprotectedます。

つまり、インスタンスにClientは接続と識別子の両方が必要です。

class Client
{
    protected $connection;
    protected $id;
    protected $email = null;

    public function __construct($connection, $id)
    {
        $this->connection = $connection;
        $this->id = $id
    }

    public function getEmail()
    {
        if ( $this->email === null )
        {
            $query = 'SELECT email FROM users WHERE id = ?';
            $statement = $this->connection->prepare( $query );
            $statement->bind_param('i', $this->id);
            if ( $statement->execute() )
            {
                 $statement->bind_result($this->email);
            }
        }
        return $this->email;
    }

} 

PS i は実際には、接続 API には MySQLi ではなく PDO を好みます。他の理由がない場合は、エラー処理の柔軟性が高いという理由だけです。

于 2012-04-25T07:06:16.867 に答える
0

クラス名はクラスがデータベーステーブルのモデルであることを示しているため、このシナリオでは最初の方がより「正しい」と言えます。つまり、テーブルへのほとんどまたはすべての変更は、クラスを介して抽象化する必要があります。多くの場合、モデル クラスのインスタンス化はデータベース テーブルの 1 つの行を表すため、id がクラスのメンバーであることは理にかなっています。

また、コンストラクターを介してデータベース接続をモデルに渡すか、何らかの方法でグローバルに使用できるようにします。

^ ちょうど私の 2 セント

于 2012-04-23T02:02:38.940 に答える