草庐IT

php - PHP 高级 OOP 特性的真实示例

coder 2024-04-06 原文

我正在努力提高我对 PHP 中 OOP 的了解,并且一直在研究抽象类和接口(interface)。

我学到了什么

  • 它们都是不能自己实例化但可以扩展的类(在接口(interface)的情况下实现)
  • 抽象类为扩展它们的其他类提供方法和属性。
  • 如果类使用抽象方法,则类本身也必须是抽象的。
  • 如果在抽象类中定义了抽象方法,则所有子类都必须定义该方法的细节。未定义为抽象的方法可以像普通方法一样使用。
  • 接口(interface)定义了实现它的类必须具有的方法。方法的功能未在接口(interface)中定义,接口(interface)仅提供必须包含在子类中的方法列表。
  • 接口(interface)不定义任何属性。
  • 类可以实现任意数量的接口(interface),但它们必须为它们实现的每个接口(interface)定义一个方法

我认为这涵盖了基础知识。如果您认为我遗漏了什么,请随时补充。

我想知道的是,是否有这些类(尤其是接口(interface)类)的实现示例。有谁知道任何使用它们的开源应用程序,我可以浏览这些应用程序以更好地了解它们并了解它们在何处以及何时有效使用?我遇到过使用动物的书籍示例,但未能证明这些类(class)的重要性。

最佳答案

final关键字防止类被其他类扩展,例子:

class Parent
{
}

class Mother extends Parent
{
}

final class Brother extends Mother /* - This class cannot be extended - */
{
}

class Pet extends Brother
{
}

Pet 类会抛出一个错误声明:Fatal error: Class Pet may not inherit from final class (Brother)

这也适用于方法,因此如果您不想让方法被继承,则导致子类具有相同的方法作为覆盖。

http://php.net/manual/en/language.oop5.final.php

Yo used that you would like some real world examples of what interfaces can be used for,以及数据库抽象层

您有 1 个基类,它提供了迭代数据库数据的基本方法,但是这将使用数据库类型的子类,例如 MySqlMsSql 等等,每个数据库类型都有自己的类,但是为了确保基类具有这些方法,它们都将实现相同的接口(interface)。

例子

interface IDatabaseLayer
{
    public function connect();
    public function query();
    public function sanitize();
    //...
}

这样基类就知道MySql和MsSql有上面的方法,从而减少错误,更有条理。

当将对象传递给类时,您希望确保对象属于特定类型,PHP5 允许您定义应将什么类型的对象作为参数传递给方法。

假设你有 3 个类

  • DatabaseCredentials
  • 数据库连接
  • 数据库查询

您可以在 DatabaseConnection 的构造中明确定义您需要一个 DatabaseCredentials 类,如下所示:

class DatabaseConnection implements Connectable
{
    public function __construct(DatabaseCredentials $ConnectionDetails)
    {
        $this->Connect($ConnectionDetails->BuildDSN());
    }
}

真正开始的好方法是阅读此处:


您可能希望了解的 PHP5 的另一个特性是 namespace ,这将使您能够保持代码的组织性,拥有多个具有相同名称的对象,使自动加载更加高效

小例子:

namespace Database\MySql
{
    class Database{}
}

namespace Database\MsSql
{
    class Database{}
}

你可以像这样使用:

use Database;
$Database = new MySql\Database();

关于php - PHP 高级 OOP 特性的真实示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4678889/

有关php - PHP 高级 OOP 特性的真实示例的更多相关文章

  1. ruby - 如何使用 CarrierWave 从 S3 获取真实文件 - 2

    我有一个应用程序可以读取文件的内容并为其编制索引。我将它们存储在磁盘本身中,但现在我使用的是AmazonS3,因此以下方法不再适用。事情是这样的:defperform(docId)@document=Document.find(docId)if@document.file?#Youshould'tcreateanewversion@document.versionlessdo|doc|@document.file_content=Cloudoc::Extractor.new.extract(@document.file.file)@document.saveendendend@docu

  2. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  3. Ruby-vips 图像处理库。有什么好的使用示例吗? - 2

    我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby​​代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby​​-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby​​-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby​​-vips的github页面上的链接,我们将不胜感激!如果有ruby​​-

  4. arrays - 如何在下面的示例中将两个值数组分组为 n 个值数组? - 2

    我已经有很多两个值数组,例如下面的例子ary=[[1,2],[2,3],[1,3],[4,5],[5,6],[4,7],[7,8],[4,8]]我想把它们分组到[1,2,3],[4,5],[5,6],[4,7,8]因为意思是1和2有关系,2和3有关系,1和3有关系,所以1,2,3都有关系我如何通过ruby​​库或任何算法来做到这一点? 最佳答案 这是基本Bron–Kerboschalgorithm的Ruby实现:classGraphdefinitialize(edges)@edges=edgesenddeffind_maximum_

  5. ruby - Google-api-ruby-client 翻译 API 示例 - 2

    很高兴看到google代码:google-api-ruby-client项目,因为这对我来说意味着Ruby人员可以使用GoogleAPI-s来完善代码。虽然我现在很困惑,因为给出的唯一示例使用Buzz,并且根据我的实验,Google翻译(v2)api的行为必须与google-api-ruby-client中的Buzz完全不同。.我对“Explorer”演示示例很感兴趣——但据我所知,它并不是一个探索器。它所做的只是调用一个Buzz服务,然后浏览它已经知道的关于Buzz服务的事情。对我来说,Explorer应该让您“发现”所公开的服务和方法/功能,而不一定已经知道它们。我很想听听使用这个

  6. ruby - 有人可以解释一下在 Ruby 中注入(inject)的真实、通俗易懂的用法吗? - 2

    我正在学习Ruby,遇到了inject。我正处于理解它的风口浪尖,但当我是那种需要真实世界的例子来学习一些东西的人时。我遇到的最常见的例子是人们使用inject来添加一个(1..10)范围的总和,我不太关心这个。这是一个任意的例子。在实际程序中我会用它做什么?我正在学习,所以我可以继续使用Rails,但我不必有一个以Web为中心的示例。我只需要一些我可以全神贯注的目标。谢谢大家。 最佳答案 inject有时可以通过它的“其他”名称reduce更好地理解。它是一个对Enumerable进行操作(迭代一次)并返回单个值的函数。它有许多有

  7. ruby - 是否有 SproutCore 或 Cappuccino 的现场演示/示例应用程序 - 2

    在他们的网站上找不到任何内容。我主要只是想看看哪个值得一试(当然是RIA)。谢谢 最佳答案 SproutCoredemos 关于ruby-是否有SproutCore或Cappuccino的现场演示/示例应用程序,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1419788/

  8. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  9. ruby - 高级语言是否使用数据结构? - 2

    我目前还在上学,正在上一门关于用C++实现数据结构的类(class)。在业余时间,我喜欢使用“高级”语言(主要是Ruby和一些c#)进行编程。既然这些高级语言为你管理内存,你会用数据结构做什么?我可以理解对队列和堆栈的需求,但是您需要在Ruby中使用二叉树吗?还是2-3-4树?为什么?谢谢。 最佳答案 Sosincethesehigherlevellanguagesmanagethememoryforyou,whatwouldyouusedatastructuresfor?使用数据结构的主要原因与垃圾收集无关。但它是以某种方式有效的

  10. ruby - 如何设置自动测试以仅重新运行失败的 rspec 示例 - 2

    我对自动测试的工作方式的印象(基于cucumbergithubwiki和其他在线内容)是它应该重新运行红色示例,直到它们通过。我的问题是它会重新运行规范文件中找到失败示例的所有示例,包括通过的示例。我不想浪费时间在修复失败示例的同时重新运行通过的示例。是否可以配置自动测试以便仅运行失败的示例? 最佳答案 您需要rspec-retrygem。以下是文档中有关如何实现它的一些示例:将它应用到覆盖整个测试套件的configureblock中...RSpec.configuredo|config|config.verbose_retry=t

随机推荐