oop 类和对象的
![](https://i-blog.csdnimg.cn/blog_migrate/58533f53474b3001deb585f5d19c1379.png)
介绍
本系列的最后一章。
如果您已经跟踪了这些博客文章,那么您现在完全能够使用面向对象范例来创建项目。
我很高兴您已经阅读了所有部分,在这一部分中,您将结束您的开始。
事实上,
现在,您将学习如何使用抽象类和PHP的其他一些较不常见的功能,例如反射API和单例设计模式。
继续阅读,您会发现,根据许多其他Web开发人员(包括我自己),这些资源将使您实现您所寻找的突破。
跟随系列...
这篇博客文章是“ 面向对象编程的完整指南:
从过程编程到PHP的 OOP专家”
如果您还没有阅读其他部分
您可以通过以下链接查看其他博客文章
面向对象程序设计导论
PHP中的继承和接口 ,
更多接口和多态性
可见性和静态关键字 ,
构造函数和魔术方法
抽象类和多余的位
表中的内容
抽象类
抽象类与接口非常相似,但是它们具有Web开发人员需要注意的不同规则。
定义非常简单,基本上,抽象类是包含抽象方法的类,
抽象方法是已声明但未在代码中实现的方法。
这种类不能构造为对象,实际上,它们需要扩展。
![](https://i-blog.csdnimg.cn/blog_migrate/75963e57afd71ca820fed7e6fd9ff1d8.png)
扩展抽象类的“普通”类必须实现父级内部的所有方法。
需要注意的是,子类必须定义具有相同或较少限制性可见性的抽象方法,
这意味着,如果抽象类中有一个受保护的方法,则只能将其实现为公共方法或受保护的方法。
另一个规则是数字和类型或必需的参数必须与参数相同。
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技术,它允许程序员以顺序的方式执行几个不同但相互关联的动作。
让我们分解这句话,
“执行不同的动作”是指调用不同的方法或函数;
![](https://i-blog.csdnimg.cn/blog_migrate/44d73bb2a1de13c76d7631549bb47341.png)
“ 执行关联的动作 ”可以转换为与该类的同一对象或实例相关的动作;
“ 以顺序方式 ”只是建议将这些方法一个接一个地调用。
这是一个示例,将阐明概念:
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连接到代码时,一种简单的实现方法是,在大多数情况下,每个项目只有一个数据库。
这是它的完美用法。
结论
![](https://i-blog.csdnimg.cn/blog_migrate/968a633267e322f06c71eb4297da775b.png)
多合一版本的完整版“面向对象编程的完整指南”可在Kindle上以Kindle格式获得。
如果您已遵循本文的所有部分,则将经历一段漫长的旅程。
您已经意识到,面向对象编程或OOP的难度要比局外人想象的要难。
现实情况是,作为Web开发人员,我们喜欢使用行话。
属性,参数,接口,抽象类,依赖项注入。
这些话很快就会让人头疼。
然而,
只需不断花一点时间,您就会发现应用这些新知识不仅可能,而且比您想象的要容易。
![](https://i-blog.csdnimg.cn/blog_migrate/6d752339c7cf88f912ef2aaedfbf52eb.png)
下一步是什么?
如果您了解本文的基本概念,就可以学习PHP框架,
他们中有很多,选择其中之一可能会让人不知所措。
![](https://i-blog.csdnimg.cn/blog_migrate/4c1f75abe5711102ac077c672b354c1b.png)
下面是我写的一个非常深刻的比较,将其中的24个进行比较,您在其他地方都找不到类似的东西。
PHP框架指南。
如果您喜欢此内容,并且渴望更多,请 加入Facebook社区 ,我们在其中共享信息和新闻。
翻译自: https://hackernoon.com/abstract-classes-and-oop-extras-d087eeb1aca9
oop 类和对象的