【问题标题】:PHP Class variables between instances实例之间的 PHP 类变量
【发布时间】:2016-11-17 11:43:07
【问题描述】:

最近我开始尝试做更多基于 OOP 的编程,因为我知道它比过程式编程要好得多,但我有一个可能很简单的问题。如果我想实现一个“任务”类,其中每个任务都有一个标题、描述、完成的程度以及提交者。我有以下代码来创建类:

class Tasks
{
    public $title;
    public $description;
    public $completionPercent;
    public $contact;

    public function __construct($title, $description, $completionPercent, $contact)
    {
        $this->title = $title;
        $this->description = $description;
        $this->completionPercent = $completionPercent;
        $this->contact = $contact;
    } 

    public function getTitle()
    {
        return $this->title;
    }

    public function getDescription()
    {
        return $this->description;
    }

    public function getCompletionPercent()
    {
        return $this->completionPercent;
    }

    public function getContact()
    {
        return $this->contact;
    }

    public function setTitle($title)
    {
        $this->title = $title;
    }

    public function setDescription($description)
    {
        $this->description = $description;
    }

    public function setCompletionPercent($completionPercent)
    {
        $this->completionPercent = $completionPercent;
    }

    public function setContact($contact)
    {
        $this->contact =$contact;
    }

}

我的问题是,如果我创建一个任务,然后像关闭浏览器一样稍后访问它,然后在几天后更新它时返回它,我该如何存储它并重新访问它。我了解数据库并经常在我用来学习的当前站点中使用它们,但是当我假设您可以跳过课程并使用数据库时,我看不出将课程中的信息存储在数据库中是合乎逻辑的。我读到您可以将 XML/json 序列化或存储在一个文件中并以这种方式访问​​该类,但是如果您可以将一个文件读入一个数组并以这种方式使用它,我还是不明白为什么需要该类。我知道 OOP 很重要,但我仍在努力将其归结为可以开始定期使用类的地方,以便我可以熟悉它们并作为程序员取得进步。我确信网上有很多关于他的资料,但我一直在寻找关于将类变量存储在会话变量中的东西,这并不是我想要的。如果有什么我可以澄清的,请告诉我,我知道当我第一次上课时,我会做类似$task1 = new Task(...); 的事情,但是在关闭浏览器并重新登录后,我仍然无法访问$task1,对吗?我不能只做$task1->getTitle(); 那么我该如何重新初始化课程呢?

【问题讨论】:

  • 您的问题根本不具体,我不太明白您需要什么,无论如何我建议您阅读一下,也许您应该看看 ORM stackoverflow.com/questions/1279613/… 然后 doctrine-project.org 或任何其他实现你可以自己谷歌
  • 顺便说一句,你的 getter 和 setter 没用。 1) 你的属性是public,所以可以绕过setter。 2) 您的设置者不 do 任何事情,因此在直接属性访问上没有添加任何内容。 – 只需保留您的属性 public 并摆脱 getter/setter。

标签: php database oop object


【解决方案1】:

你是对的,你需要将这些信息存储在某个地方,而正确的地方是 db。所以,问题是:如果你可以直接将它保存在数据库中,为什么你需要使用和创建类“任务”。因为您想基于“类和对象”构建应用程序,所以不要使用过程编程,如您所说。因此,您需要使用对象并为所有内容创建类,才能拥有完整的 OO 应用程序。

因此,您的应用程序应该基于类/对象,这是您和其他一些开发人员将使用的。现在您只需将该对象中的数据保存到数据库中。这意味着,您需要为此引入一些额外的层。一个非常好的是 Doctrine ORM。它会映射并将您的对象转换为数据库。通常每个类在db中都有自己的表,类中的每个字段在db中都有自己的列(这只适用于需要保存在db中的类)

关键是,您可以像使用任何其他对象一样轻松地在应用程序中使用对象,而无需知道它们应该如何保存在数据库(或其他地方)中。只有你需要做的是:

$task->save();

就是这样。该任务将保存在 db 中。

【讨论】:

  • 好的,当我将一个类保存到数据库中并假设我有 10 个任务时,几天后我回到此页面时如何通过数据将所有任务重新创建为对象从数据库。当我创建像 task1 这样的任务时,我只会做 $tasks1 = new Tasks(...); 我得到但如何再次获取所有这些对象的访问权限?回到我必须这样做的课程中,我们使用了 .get(index) (这是在 java 中),如果我们想要一个特定的项目,我们必须使用某种搜索来找到匹配的类。这在 PHP 中是否同样有效?
  • 这取决于您使用的 ORM,但获取任务非常简单直接。它可能像: $task = new Task(); $allTask​​s = $task->fetchAll();在这种情况下, $allTask​​s 是所有实际上是对象的任务的数组。但是语法取决于 ORM。 Doctrine 是一种非常流行的 ORM,也许你可以看到它在 Symfony(框架)中是如何工作的 symfony.com/doc/current/book/doctrine.html
【解决方案2】:

类和对象可帮助您将代码和逻辑组织成独立的单元。就这些。这非常重要。它没有解决存储问题或其他任何问题。

是的,你还是把对象的数据存入数据库,然后再从数据库中读取,再创建一个对象实例。

input → new Task(..) → store object data in database
read data from database → new Task(..) → display on website

为什么这比直接使用数据库中的数组更好?因为它可以让你更好地组织你的代码。即使对象的生命周期只有几分之一秒,在这几分之一秒内,所有使用该对象的代码都可以写得更优雅,最重要的是类型安全,因为它明确定义了对象看起来像。数组是一个无类型的东西,你的应用程序变得越复杂,就越难以处理。尤其是重构只使用数组的代码非常非常困难。

【讨论】:

    猜你喜欢
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    相关资源
    最近更新 更多