我在错误地使用oop吗?

时间:2018-09-05 08:01:39

标签: php oop procedural-programming

大约6个月前,我开始学习oop,尽管由于学习而停了一段时间。

问题是,每当我在项目中使用oop时,我通常都会尝试将每件事变成一个类...无论是初始化,显示,循环还是更多...确切地说,我还没有何时使用/创建类的概念。

另一个问题是,我倾向于不知道类相对于函数的主要好处。目前,我只是将它们混合在一起。

我观看了一个有关类和客户端代码的youtube视频。在该视频中,他们说类更像是开发人员代码,而客户代码是我们编写的代码,使用开发人员代码使事情变得更容易。因此,他建议我们将代码分为客户/开发人员代码。 但是我不知道如何将我的代码分解为客户端代码和开发人员代码。 实际上,我正在为所有页面(例如index.php,about.php

)创建类
<?php
    class about{
        public $title = 'about page';
        public $page_color = 'red';
      //functions and more codes
  }

编写完上面的代码后,我知道我做的不正确。我曾尝试搜索过google并阅读过许多oop书籍,但是每次它们使用 car 类示例时,我都无法将其应用于我的编码,或者无法解决上下文中某个类是否存在的问题没必要。

注意:我很乐意使用程序代码来构建网站,但是如果有一天需要,我需要学习。

3 个答案:

答案 0 :(得分:0)

要回答您的问题:是您使用不正确。 但这不是快速解决方法,可以正确使用它。

我无法给您任何答案,这意味着您明天就可以开始编写完美的OOP代码。

您在正确的道路上,学习和练习。犯错误,忍受这些错误并加以重构。这样做越多,您就会变得越锐利。

我有16年的经验,但我仍然在OOP中发现新的规则和例外。这不是一门精确的科学-它是一种可以根据上下文产生不同结果的方法。

仅查看您的所有评论,您将看不到任何普遍的完美共识。每个人都在迭代地改进彼此的实现。您可以在代码中使用这种方法,使其整洁有序,在找到更好或更正确的实现方式时将其交换出去。

答案 1 :(得分:0)

嗯,我还没有学过php。但是我是一个很好的Java开发人员。而且我的OOP概念很好。您提到您不了解类相对于功能的主要优点。他们两个完全不同。类是软件的蓝图。函数表示软件的行为。您编写了所有代码来处理用户提供的输入数据以及函数中的输出生成。类包含这些功能。在类中编写代码的主要优点是它们可以在一个地方编写并可以在任何地方重用。而且OOP概念过于广泛。一切都无法在帖子中解释。 OOP比过程编程更有优势。考虑您正在从事一个非常大的项目。 软件中的某些功能是常见的。在OOP中,您可以在一个地方编写代码,然后在任何地方使用它们。而在过程编程中,无论何时使用这些功能,都必须重写相同的代码。因此,在OOP中,您编写代码的头痛将最小化。同样,如果通用代码在一个地方工作,那么显然无论在哪里使用它都可以工作。 这是OOP从过程编程演变的方式。

答案 2 :(得分:-1)

OOP是大多数编程语言的骨干,因此,当您完全理解OOP时,基本上希望一直使用它。

网站为您提供了一些很好的例子,因此,我将尝试给出一个一般性的概述,然后重点介绍基于网络的内容。

类应使用常识名称保存与每次相关的数据。例如,一辆汽车显然会保存引擎(另一类),颜色,名称,所有者等。在此范围内,引擎将保存自己的一组与之相关的数据(最大速度,每加仑行驶的英里数,等等。)。这是将数据保持在一起的基础,接下来是类中的函数。

现在,尽管Car拥有与汽车相关的数据,但Car仍具有汽车将要执行的功能或汽车将用于与其数据进行交互的功能。 Getters(GetColour())允许外部对象获取有关该特定汽车的信息(因为Car1和Car2可以具有不同的颜色)。设置器则相反,用于设置对象特定的数据。然后,我们还有其他一切。在内部调用this.engine.start()的Car.start()可能会设置一些函数,以开始从发动机排出汽油并允许汽车行驶。

类都是关于具有这种易于阅读,易于理解和易于重用的东西。汽车课程结束后,您可以根据需要重复使用任意多的汽车,而且它们都是完全独立的。

在网络上

首先,我强烈建议您研究MVC架构,因为MVC架构是大多数Web架构所在的地方,并且使OOP易于理解。基本上,您的网站分为控制器(负责与数据库进行交互并为您提供页面),模型(您的数据库数据,例如用户)和视图(带有少量模板的HTML),以便控制器可以将动态数据传递给它。 )

例如:您转到website / posts / Stanley,您的路由器(另一个MVC事物)决定需要由PostsController(一个类)处理。帖子控制器知道您希望用户Stanley拥有所有帖子,因此它要求帖子模型(一个类)检索Stanley的所有帖子,然后控制器将这些传递给视图以使用您的Stanley特定帖子来填写模板。 / p>

第二次离开MVC,

在给出示例后,我假设您将大部分使用类进行数据操作和数据库访问。例如,如果您将博客文章存储在数据库中,则可能会有一个Blog类,其数据与您的数据库行(id,user_id,title,body)相匹配,并且具有访问该数据以将其放入HTML以及从中获取数据的功能。数据库。

例如: BlogPost :: All()可能会返回最新到最旧的每个博客文章的数组。 BlogPost:By(user_id)可能会返回特定用户的帖子数组。 BlogPost:Remove(id)可能会删除给定ID的博客文章。 BlogPost:RatingAtLeast(starRating),获取所有至少具有starRating评分的博客文章。

您明白了...该类将如上所述存在,从而为您提供一种客户端代码方式来访问您的用例特定的数据库,并且BlogPost包含与BlogPost相关的变量。因此BlogPost :: All()将返回BlogPost数组。