【问题标题】:Turning variables into class'把变量变成类'
【发布时间】:2014-03-02 03:14:54
【问题描述】:

所以我学到了很多关于 PHP 的知识,并且我从基础开始,即使其中一些已被弃用。现在我已经掌握了知识,我正在重写我为使用 PDO 和类所做的一切。现在我从来没有使用过,但我正在慢慢地(慢慢地,慢慢地)理解并理解它。我想问的是,如果我这样做是对的,如果不是,我哪里错了?

我基本上有这个功能:

function user_exists($username) {
    $username = sanitize($username);
    $query = mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username'");
    return (mysql_result($query, 0) == 1) ? true : false;
}

我想把它变成一个类:

class user {
    function exists($username) {
        $username = $username;
        $query = $db->query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username'");
        $results = $query->fetchAll(PDO::FETCH_ASSOC);
    }
}

我是否走在正确的轨道上,我是否应该将该函数(方法)中的变量设为“exists”方法的私有变量?

我打算创建一个“用户”类,其中包含诸如存在、禁止、管理等方法。我认为这是我应该做的?

如果有人回答这个问题,谢谢。

【问题讨论】:

  • $username = $username; 是特别是错误的。首先它没有效果,其次它的命名不好。也许您的意思是$this->name = $name;,其中name 是一个类属性。
  • 如果我错了,请纠正我,但类中的“属性”只是意味着变量对吗?就像“方法”意味着功能?我在我的函数中拥有的是,当用户登录时,它会检查该用户名是否存在,因此它将其解析为要在查询中使用的函数。那你说的对吗?另外,如果你能回答; pdo 查询安全吗?只有insert等容易出现sql注入,应该做好准备吧?

标签: php class pdo


【解决方案1】:
class User {
    public $name;

    private $db;

    function __construct($name) {
        $this->name = $name;

        $this->db = get_me_a_db_connection();
    }

    public function exists() {
        $query = $this->db->query('SELECT COUNT(user_id) FROM users WHERE username = "' . $this->name . '"');
        $results = $query->fetchAll(PDO::FETCH_ASSOC);

        return some_code_that_extracts_the_count_from_$results;
    }
}

但是: 1) $db 不应该是类属性。它至少应该在工厂里。所以你extract it in a factory:

class Factory {
    public static function db() {
        return get_me_a_db_connection();
    }
}

public function exists() {
    $query = Factory::db()->query(...);
    ...
}

这样你就不会用基础设施代码污染你的domain models。

2) 上面的那么多是指您可以实现基础架构代码(数据库连接、查询)和域模型之间的完全解耦。有tons of libraries 正在这样做。我会从Laravel's Eloquent开始。

3) 如果您使用prepared statements,PDO 查询是安全的。我上面链接的所有库都使用准备好的语句。作为菜鸟,我建议您从学习其中一个开始学习。

【讨论】:

  • 谢谢这真的很有帮助,谢谢你的解释。我会看看使用那个库;我以前从未使用过,但它看起来像是带走了很多体积,说一个查询并将其放入模型中?我想我需要阅读更多......但我慢慢明白了。再次感谢。
【解决方案2】:

也许你并没有太偏离轨道,这是一个好的开始。但是您需要了解如何进入面向对象编程的内容。我将从一个简单的类(例如 User )开始,其中包含真实用户的信息,无论该用户对您尝试创建的所有方法所需的信息是什么。

您需要的私有变量始终是各种方法所需的信息。比如用户名,以及您需要了解的任何其他信息。

也许 $results 可能是带有最后返回信息的变量,或者只是像第一个示例一样返回它。

在写下你的课程之前,你需要先思考你真正需要什么。

【讨论】:

  • 所以你是说创建一个类,一切都是静态设置的?所以我的班级会喜欢 $t​​his->username = $username, $this->first_name = $first_name 并且全部解析为方法 user($username, $first_name)?我已经阅读了很多关于 OOP 的内容,只是需要我的大脑进行大量思考才能理解它,因为它与旧样式相比有很大的变化。如果我在会走路之前就尝试跑步,那么我通过反复试验学习得最好。
  • 也许这只是我的编程方式。我通常做所有事情,而不是尝试和错误的方式。有时它更令人满意,而且总是更令人满意,这是最重要的部分,你知道整个事情是如何运作的,它确实有助于解决问题并在你的程序中做出进一步的改变。
  • 这不是 OOP。 OOP 不需要类。在类中编写代码并不能保证您正在执行 OOP。从做出这种区分开始。
猜你喜欢
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
相关资源
最近更新 更多