Sre*_*raj 26 php oop abstract-class
可能重复:
接口与抽象类
如果我在php中使用抽象类有什么好处?
如果我使用抽象类或接口,目的是什么?
两者都只是简单地用身体创造防御名称
Ber*_*rak 68
如果我在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( );
}
}
Run Code Online (Sandbox Code Playgroud)
首先; 请注意,DocumentHandler类不知道它实际处理的是哪种类型的Document.它甚至不关心.它是无知的.但是,它确实知道可以调用哪些方法,因为两种类型的文档之间的接口是相同的.这称为多态,并且可以通过Document接口的实现轻松实现.
第二部分是; 如果每个文档都有一个作者,并且总是请求该作者,您可以将该方法复制到PdfDocument以及DocxDocument,但是您将自己复制.例如,如果您决定希望作者使用大写字母编写,并且您将$ this-> author返回ucwords($ this-> author),那么您必须多次执行此操作.我复制了那个方法.使用抽象类,您可以定义行为,同时将类本身标记为不完整.这非常方便.
希望有所帮助.
Ste*_*roz 10
当您有许多具有相同方法的类时,抽象类可以帮助您.
例:
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 {
}
Run Code Online (Sandbox Code Playgroud)
会发生什么:
new Foo();
,Foo
是抽象的.Bar.foo1()
和Baz.foo1()
,他们会做同样的事情.Baz
没有实现abstact方法foo2
.有用的示例:
abstract class Shape {
public function display() { /* ... */ }
//...
}
class Circle extends Shape {
//...
}
class Rectangle extends Shape {
//...
}
//...
Run Code Online (Sandbox Code Playgroud)
你希望每个班级都能够display()
,但是没有"形状"这样的东西本身.