PHP抽象類

2018-02-22 16:40 更新

PHP教程 - PHP抽象類

抽象類定義了抽象概念,例如數(shù)字是一個(gè)抽象概念而int,字節(jié)是具體的概念。 車輛是抽象概念,當(dāng)汽車和船是具體概念時(shí)。

抽象類是繼承創(chuàng)建一個(gè)新的,非抽象(具體)類。

通過使父類抽象,你定義規(guī)則什么子類必須包含的方法。

父類中的抽象方法實(shí)際上不具有方法中的任何代碼。

它留給了孩子類。它指定了子類必須做什么,而不是如何做。



句法

要聲明抽象方法,只需使用abstract關(guān)鍵字,如下所示:

abstract public function myMethod( $param1, $param2 );

我們可以選擇指定方法必須包含的任何參數(shù)。

然而,你不包括實(shí)現(xiàn)該方法的任何代碼,也不指定方法必須返回的值的類型。

如果你聲明一個(gè)類的一個(gè)或多個(gè)方法是抽象的,你還必須聲明整個(gè)類抽象:

abstract class MyClass { 
    abstract public function myMethod( $param1, $param2 ); 
}   


注意

你可以實(shí)例化一個(gè)抽象類,也就是說,直接從它創(chuàng)建一個(gè)對象:

// Generates an error: "Cannot instantiate abstract class MyClass" 
$myObj = new MyClass;   

實(shí)施例1


<?PHP
abstract class Book {
        private $Name;
        public function getName() {
            return $this->Name;
        }
}
?>

如前所述,你也可以使用abstract關(guān)鍵字和方法,但是如果一個(gè)類有至少一個(gè)抽象方法,則該類本身必須被聲明抽象。

如果你試圖在抽象中提供任何代碼,你會(huì)得到錯(cuò)誤方法,這使得這是非法的:

<?PHP
abstract class Book {
        abstract function say() {
                print "Book!";
        }
}
?>

這也是非法的:

<?PHP
abstract class Book {
        abstract function say() { }
}
?>

相反,一個(gè)適當(dāng)?shù)某橄蠓椒☉?yīng)該是這樣的:

<?PHP
abstract class Book {
        abstract function say();
}
?>

實(shí)施例2

下面的代碼顯示了如何提供抽象類的實(shí)現(xiàn)。


//  w  w w .  java  2  s  .  c  om
<?php

abstract class Shape {
  private $_color = "black";
  private $_filled = false;

  public function getColor() {
    return $this->_color;
  }

  public function setColor( $color ) {
    $this->_color = $color;
  }

  public function isFilled() {
    return $this->_filled;
  }

  public function fill() {
    $this->_filled = true;
  }

  public function makeHollow() {
    $this->_filled = false;
  }

  abstract public function getArea();
}

class Circle extends Shape {
  private $_radius = 0;

  public function getRadius() {
    return $this->_radius;
  }

  public function setRadius( $radius ) {
    $this->_radius = $radius;
  }

  public function getArea() {
    return M_PI * pow( $this->_radius, 2 );
  }
}

class Square extends Shape {
  private $_sideLength = 0;

  public function getSideLength() {
    return $this->_sideLength;
  }

  public function setSideLength( $length ) {
    $this->_sideLength = $length;
  }

  public function getArea() {
    return pow( $this->_sideLength, 2 );
  }
}

class Rectangle extends Shape {
  private $_width = 0;
  private $_height = 0;

  public function getWidth() {
    return $this->_width;
  }

  public function getHeight() {
    return $this->_height;
  }

  public function setWidth( $width ) {
    $this->_width = $width;
  }

  public function setHeight( $height ) {
    $this->_height = $height;
  }

  public function getArea() {
    return $this->_width * $this->_height;
  }
}


class ShapeInfo {
  private $_shape;

  public function setShape( $shape ) {
    $this->_shape = $shape;
  }

  public function showInfo( ) {
    echo "<p>The shape"s color is " . $this->_shape->getColor();
    echo ", and its area is " . $this->_shape->getArea() .".</p>";
  }
}


$myCircle = new Circle;
$myCircle->setColor( "red" );
$myCircle->fill();
$myCircle->setRadius( 4 );

$mySquare = new Square;
$mySquare->setColor( "green" );
$mySquare->makeHollow();
$mySquare->setSideLength( 3 );

$info = new ShapeInfo();

$info->setShape( $myCircle );
$info->showInfo();
$info->setShape( $mySquare );
$info->showInfo();

$myRect = new Rectangle;
$myRect->setColor( "yellow" );
$myRect->fill();
$myRect->setWidth( 4 );
$myRect->setHeight( 5 );

$info->setShape( $myRect );
$info->showInfo();

?>

上面的代碼生成以下結(jié)果。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號