0

此代码将输出相同的内容。我的问题是,这样做的正确方法是什么。第一种方法还是第二种方法?或者有什么更好的方法吗?我看不出一个班级比另一个班级有任何优势。

<?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;
        }
    }
    ?>

索引.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

在第二种方法中,实例化类是没有意义的,因为没有任何东西要存储以备将来使用。因此,如果不同的数据存储在其他地方,最好使用“静态类”:

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 );

如果我要在这两者之间做出决定,我会选择第一个。

我不知道你将如何使用这些类中的任何一个,但对我来说,从外部存储$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

我想说第一个在这种情况下更“正确”,因为类名表明该类是数据库表的模型,这意味着对表的大部分或所有更改都应该通过该类进行抽象。通常模型类的实例化将代表数据库表的一行,因此 id 是类的成员是有意义的。

我还将通过构造函数将数据库连接传递给模型,或者以某种方式使其全局可用。

^ 只是我的 2 美分

于 2012-04-23T02:02:38.940 回答
0

请停止使用var在 php.ini 中定义类变量。它不再是 4.x。现在哪里有public和。privateprotected

也就是说,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我实际上更喜欢PDO而不是MySQLi作为连接API。如果不是其他原因,那只是因为它在错误处理方面具有更大的灵活性。

于 2012-04-25T07:06:16.867 回答