oop 类和对象的_抽象类和OOP附加功能

oop 类和对象的

介绍

本系列的最后一章。

如果您已经跟踪了这些博客文章,那么您现在完全能够使用面向对象范例来创建项目。

我很高兴您已经阅读了所有部分,在这一部分中,您将结束您的开始。

事实上,

现在,您将学习如何使用抽象类和PHP的其他一些较不常见的功能,例如反射API和单例设计模式。

继续阅读,您会发现,根据许多其他Web开发人员(包括我自己),这些资源将使您实现您所寻找的突破。

跟随系列...

这篇博客文章是“ 面向对象编程的完整指南:

从过程编程到PHP的 OOP专家”

如果您还没有阅读其他部分

您可以通过以下链接查看其他博客文章
面向对象程序设计导论
PHP中的继承和接口
更多接口和多态性
可见性和静态关键字
构造函数和魔术方法
抽象类和多余的位

表中的内容

抽象类

抽象类与接口非常相似,但是它们具有Web开发人员需要注意的不同规则。

定义非常简单,基本上,抽象类是包含抽象方法的类,

抽象方法是已声明但未在代码中实现的方法。

这种类不能构造为对象,实际上,它们需要扩展。

扩展抽象类的“普通”类必须实现父级内部的所有方法。

需要注意的是,子类必须定义具有相同或较少限制性可见性的抽象方法,

这意味着,如果抽象类中有一个受保护的方法,则只能将其实现为公共方法或受保护的方法。

另一个规则是数字和类型或必需的参数必须与参数相同。

 abstract class Building { 
     abstract protected function getWindowsCount(); 
     public function __construct() 
{
         echo “Building cannot be constructed”; 
}
}
 class Office extends Building { 
     public function getWindowsCount() 
{
         return 12; 
}
}
 $myOffice = new Office; 
// This command will return “Building cannot be constructed”
$myOffice->getWindowsCount();
// This command will return 12

我定义了扩展抽象类Building的Office类。

我已经实现了getWindowsCount()并将其可见性从受保护更改为公共。

Office类中没有抽象方法,因此,我可以从中构造一个对象。

我在抽象类中添加了一个构造函数,以便您可以知道在实例化对象时调用了父级构造函数的事实。

接口和抽象类之间有什么区别?

总结一下,

将接口视为空外壳。

它只有方法的签名,这意味着方法没有主体。

接口不执行任何操作只是一种模式,即您需要复制的一组方法。

另一方面,抽象类是适当的类。

即使它们看起来像界面,也具有一些特定的特征。

您可以通过给定的方法名称来指定它们的用途。

这是一个突出显示两者之间差异的示例:

 interface Building 
{
      public function build(); 
      public function getWindowsCount(); 
}
 class Office implements Building 
{
     public $windows; 
     public function build() 
{
         echo “Office built”; 
}
     public function getWindowsCount() 
{
         return $this->windows; 
}
}

在这里,我们要说的是所有Building应该看起来像这样,而不是由Office类来更改功能。

abstract class Building
{
public $windows;
public function getWindowsCount()
{
return $this->windows;
}
abstract public function build();
}
class Office extends Building
{
public function build()
{
echo “Office built”;
}
}

相反,在抽象类中,我们说的是所有Building必须具有getWindowsCount()

然后,我们说方法build()可以不同,因此我们必须让Office类根据其需要提供实现。

额外奖励

至此,我们几乎完成了对PHP中的面向对象编程的介绍,

很多信息已经共享,我希望您能理解所有信息(如果不只是在下面写下您的问题)。

但是,有些事情很快就被提到了,我想更深入地介绍一下,让您对这个话题有更广泛的理解。

方法链

方法链接是一种OOP技术,它允许程序员以顺序的方式执行几个不同但相互关联的动作。

让我们分解这句话,
“执行不同的动作”是指调用不同的方法或函数;

执行关联的动作 ”可以转换为与该类的同一对象或实例相关的动作;

以顺序方式 ”只是建议将这些方法一个接一个地调用。

这是一个示例,将阐明概念:

 class Building 
{
     public $message; 
     function __construct() 
{
$this->message = "Foundation poured - ";
}
     function stepOne() 
{
$this->message .= "framing, plumbing, electrical and HVAC completed -";
         return $this; 
}
     function stepTwo() 
{
$this->message .= "interior and exterior completed";
         return $this; 
}
     function getMessage() 
{
         return $this->message; 
}
}
 $myHome = new Building(); 
 echo $myHome->stepOne()->stepTwo()->getMessage(); 

干得好,

Building类的所有方法都具有一个共同点,即所有特征均使用关键字$ this返回对象本身,

如果需要整理内存,我已经在面向对象编程简介中解释了$ this关键字的作用。

最后一个命令是链接该类的所有方法,以构建我们的句子。

最后一条命令的结果将如下所示:

“地基浇筑-框架,水暖,电气和HVAC完成-内部和外部完成”。

这很容易,您可以立即将其实现到您的代码中而不会出现任何问题,只需小心地返回对象即可。

自动加载

必须先定义任何类,然后再使用它,

忘记这样做会导致引发错误。

自动加载以及PSR-4标准允许您在需要一个类时定义它们。

我确信我不必说这是一个非常重要的功能。

在PHP中,自动加载由spl_autoload_register()接受,该函数接受一个函数作为参数,

这完全是题外话,只是为了详细解释其工作原理,我需要写另一篇文章,

所以我只给你一个可以理解的例子:

假设您要自动加载的类位于“ classes /”路径中,

这就是你会做的。

这或多或少是大多数PHP框架幕后发生的事情。

 function myAutoloader($className) { 
     include 'classes/' . $className . '.php'; 
}
spl_autoload_register(myAutoloader);

spl_autoload_register还有两个参数,

第二个是布尔值,用于定义在无法注册autoload_function时, spl_autoload_register是否需要引发异常,

第三个参数也是布尔值,如果为true,它将在自动加载器之前,而不是附加它。

如果发生错误,并且函数无法找到指定的类,它将引发致命错误。

匿名班

如果PHP允许Web开发人员即时创建和实例化对象,那不是很好吗?

PHP 7的发行版将其包含在其功能列表中。

 $myAnonymousBuilding = new class(“Main Street”) 
{
     public function __construct(string $address) 
{
         echo “a new class has been constructed in ” . $address; 
}
}

酷吧?

请注意,内联实现此类非常容易,它甚至可以像普通类一样接受参数。

该示例中的代码将输出字符串“在Main Street上已经构造了一个新类”。

匿名类的主要用途是您需要扩展命名类的情况。

例如,如果您需要重写属性或方法,而不是声明它,则可以仅在当前使用的相同工作流程中创建一个内联实现。

反射API

反射是PHP 5.0发行版中引入的一项非常有用的功能,后来成为5.3的标准。

该API允许您检查PHP元素并在运行时获取有关它们的信息。

为了我,

使用反射API最有用的地方之一是在自动化测试期间,尤其是在PHP Unit期间。

例如,在类中测试私有属性的值时,可以通过API进入属性,然后根据测试进行断言。

有不同的反射类,每个反射类都允许您检查不同类型的变量。

以下是一些类:

  • 反射类
  • 反射对象
  • 反射法
  • 反射功能
  • 反射属性

下面是一个如何使用ReflectionClass的快速示例:

 $ReflectionObject = new ReflectionClass(“Building”); 
print_r($ReflectionObject->getMethods());

本示例将输出Building类中所有可用方法的数组。

传递给ReflectionClass的参数可以有两种类型,即带有类名称的字符串或类本身的真实实例。

每个反射类都有几种方法,使您可以检索有关要检查的元素的不同信息。

辛格尔顿

任何自重的Web开发人员迟早都会遇到以其掌握编程技巧的设计模式。

这些模式仅是以预定方式解决问题的既定方法。

为了提高性能和代码质量,PHP框架的99%使用了它们。

如果您从未听说过“ design pattern”一词,那么这就是您的最佳选择。

我想向您介绍其中最简单的一个。

我们将再次使用我们虚构的城市,我们有几座建筑物,办公室,学校等,

那市政厅呢? 市长需要密切注意所有这些类,实例化,方法和属性。

在一个城市中,只有一位市长,他只能在市政厅的一栋大楼里工作。

一个城市中只能有一个市政厅。

好…

我们如何在编程中添加此规则?

辛格尔顿

class cityHall
{
private static $instance = null;
private function __construct()
{
...
}
public static function getInstance()
{
if (self::$instance == null){
self::$instance = new Singleton();
}
return self::$instance;
}
}

就这个,

这是Singleton设计模式的实现。

它实际上如何运作?

如您所见,构造函数的可见性设置为private,它阻止了对象的创建。

为了创建该类的实例,您需要调用静态方法getInstance()

它检查是否已经创建了该实例,并使用以下命令创建了一个新实例

self::$instance = new Singleton();

否则,它仅返回已经创建的对象。

结果是,在这种情况下,您所有程序中始终只有一个单一的cityHall。

在实际情况下,哪里可以使用Singleton设计模式?

Singleton非常简单,但是处理起来也很成问题,每当您必须有一个类的单个实例时,就考虑这种设计模式。

从长远来看,它必须是一个。

在创建数据库类以将DB连接到代码时,一种简单的实现方法是,在大多数情况下,每个项目只有一个数据库。

这是它的完美用法。

结论

多合一版本的完整版“面向对象编程的完整指南”可在Kindle上以Kindle格式获得。

如果您已遵循本文的所有部分,则将经历一段漫长的旅程。

您已经意识到,面向对象编程或OOP的难度要比局外人想象的要难。

现实情况是,作为Web开发人员,我们喜欢使用行话。

属性,参数,接口,抽象类,依赖项注入。

这些话很快就会让人头疼。

然而,

只需不断花一点时间,您就会发现应用这些新知识不仅可能,而且比您想象的要容易。

下一步是什么?

如果您了解本文的基本概念,就可以学习PHP框架,

他们中有很多,选择其中之一可能会让人不知所措。

下面是我写的一个非常深刻的比较,将其中的24个进行比较,您在其他地方都找不到类似的东西。
PHP框架指南。

如果您喜欢此内容,并且渴望更多,请 加入Facebook社区 ,我们在其中共享信息和新闻。

翻译自: https://hackernoon.com/abstract-classes-and-oop-extras-d087eeb1aca9

oop 类和对象的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值