如果我在php中使用抽象类有什么好处?
2022-08-30 15:04:16
如果我在php中使用抽象类有什么好处?我找不到任何好东西。我想我可以很容易地使用抽象类来完成所有工作?
当然可以。但是,如果有许多对象几乎具有相同的类型,则可能有助于将常见功能提取到“基”类中,这意味着您不必复制该逻辑。
但实际上有两个原因。对我来说,第一个原因是抽象类的所有后代都具有相同的类型,并且两者都遵循完全相同的接口。这意味着例如,PDF文档将具有与docx文档相同的界面,并且客户端代码不必关心它正在处理哪个对象。简短示例(PHP)。
<?php
abstract class Document {
protected $author;
public function __construct( $author ) {
$this->author = $author;
}
abstract public function render( );
public function author( ) {
return $this->author;
}
}
class PdfDocument extends Document {
public function render( ) {
// do something PDF specific here.
}
}
class DocxDocument extends Document {
public function render( ) {
// do something DOCX specific here.
}
}
class DocumentHandler {
public function handle( Document $document ) {
$this->log( 'Author has been read ' . $document->author( ) );
return $document->render( );
}
}
首先;请注意,DocumentHandler 类不知道它实际处理的文档类型。它甚至不在乎。这是无知的。但是,它确实知道可以调用哪些方法,因为两种类型的文档之间的接口是相同的。这称为多态性,同样可以通过实现 Document 接口轻松实现。
第二部分是;如果每个文档都有一个作者,并且总是请求该作者,则可以将该方法复制到PdfDocument和DocxDocument,但您将复制自己。例如,如果您决定希望作者使用大写字母书写,并且将返回$this->author更改为ucwords($this->author),则必须执行与复制该方法一样多次。使用抽象类,可以定义行为,同时将类本身标记为不完整。这非常方便。
希望有所帮助。
当您有许多具有相同方法的类时,抽象类会为您提供帮助。
例:
abstract class Foo {
public function foo1() {
//Do something
}
public abstract class foo2();
}
class Bar extends Foo {
public class foo2() {
//Do something
}
}
class Baz extends Foo {
}
将会发生什么:
new Foo();
Foo
Bar.foo1()
Baz.foo1()
Baz
foo2
有用的示例:
abstract class Shape {
public function display() { /* ... */ }
//...
}
class Circle extends Shape {
//...
}
class Rectangle extends Shape {
//...
}
//...
你希望每个类都能够,但本身没有“形状”这样的东西。display()