Heim  >  Artikel  >  php教程  >  Detaillierte Erläuterung der erweiterten Funktionen der objektorientierten PHP-Programmierung (Schnittstelle, Vererbung, abstrakte Klasse, Zerstörung, Klonen usw.)

Detaillierte Erläuterung der erweiterten Funktionen der objektorientierten PHP-Programmierung (Schnittstelle, Vererbung, abstrakte Klasse, Zerstörung, Klonen usw.)

高洛峰
高洛峰Original
2016-12-30 10:01:411658Durchsuche

Die Beispiele in diesem Artikel beschreiben die erweiterten Funktionen der objektorientierten PHP-Programmierung. Teilen Sie es wie folgt als Referenz mit allen:

Statische Eigenschaften

<?php
class StaticExample {
  static public $aNum = 0; // 静态共有属性
  static public function sayHello() { // 静态共有方法
    print "hello";
  }
}
print StaticExample::$aNum;
StaticExample::sayHello();
?>

Ausgabe: 0 Hallo

Kommentare: Statische Eigenschaften und Methoden können direkt über Klassen aufgerufen werden .

SELF

<?php
class StaticExample {
  static public $aNum = 0;
  static public function sayHello() { // 这里的static 和 public的顺序可以颠倒
    self::$aNum++;
    print "hello (".self::$aNum.")\n"; // self 指向当前类, $this指向当前对象。
  }
}
StaticExample::sayHello();
StaticExample::sayHello();
StaticExample::sayHello();
?>

Ausgabe:

hello (1)
hello (2)
hello (3)

Kommentare: self zeigt auf die aktuelle Klasse, diese zeigt zum aktuellen Objekt. self kann statische Eigenschaften und Methoden der aktuellen Klasse aufrufen. Dies zeigt auf das aktuelle Objekt. self kann statische Eigenschaften und Methoden der aktuellen Klasse aufrufen. Dadurch können die normalen Eigenschaften und Methoden der aktuellen Klasse aufgerufen werden.

Konstantes Attribut

<?php
interface Chargeable { // 接口,抽象类是介于基类与接口之间的东西
  public function getPrice();
}
class ShopProduct implements Chargeable {
  // ...
  protected $price;
  // ...
  public function getPrice() {
    return $this->price;
  }
  // ...
}
$product = new ShopProduct();
?>

Wenn die getPrice-Methode nicht implementiert ist, wird ein Fehler gemeldet.

Schwerwiegender Fehler: Klasse ShopProduct enthält 1 abstrakte Methode und muss daher als abstrakt deklariert werden oder die restlichen Methoden implementieren (Chargeable::getPrice)

Geerbte Klassen und Schnittstellen

<?php
class TimedService{ }
interface Bookable{ }
interface Chargeable{ }
class Consultancy extends TimedService implements Bookable, Chargeable { // 继承类与接口
  // ...
}
?>

Abstrakte Klasse

Schauen wir uns zuerst einen Code an

<?php
abstract class DomainObject {
}
class User extends DomainObject {
  public static function create() {
    return new User();
  }
}
class Document extends DomainObject {
  public static function create() {
    return new Document();
  }
}
$document = Document::create();
print_r( $document );
?>

Ausgabe:

Document Object
(
)

Statisch Methode

<?php
abstract class DomainObject {
  private $group; // 私有属性group
  public function __construct() {
    $this->group = static::getGroup();//static 静态类
  }
  public static function create() {
    return new static();
  }
  static function getGroup() { // 静态方法
    return "default";
  }
}
class User extends DomainObject {
}
class Document extends DomainObject {
  static function getGroup() { // 改变了内容
    return "document";
  }
}
class SpreadSheet extends Document { // 继承之后,group也就与document相同了
}
print_r(User::create());
print_r(SpreadSheet::create());
?>

Ausgabe:

User Object
(
  [group:DomainObject:private] => default
)
SpreadSheet Object
(
  [group:DomainObject:private] => document
)

final field

macht die Klasse nicht vererbbar und ist es auch nicht oft verwendet

<?php
final class Checkout { // 终止类的继承
  // ...
}
class IllegalCheckout extends Checkout {
  // ...
}
$checkout = new Checkout();
?>

Ausgabe:

Schwerwiegender Fehler: Klasse IllegalCheckout erbt möglicherweise nicht von der letzten Klasse (Checkout)

Die endgültige Methode kann nicht überschrieben werden

<?php
class Checkout {
  final function totalize() {
    // calculate bill
  }
}
class IllegalCheckout extends Checkout {
  function totalize() { // 不能重写final方法
    // change bill calculation
  }
}
$checkout = new Checkout();
?>

Ausgabe:

Schwerwiegender Fehler: Die endgültige Methode kann nicht überschrieben werden. Checkout::totalize( )

Destruktor

<?php
class Person {
  protected $name;
  private $age;
  private $id;
  function __construct( $name, $age ) {
    $this->name = $name;
    $this->age = $age;
  }
  function setId( $id ) {
    $this->id = $id;
  }
  function __destruct() { // 析构函数
    if ( ! empty( $this->id ) ) {
      // save Person data
      print "saving person\n";
    }
    if ( empty( $this->id ) ) {
      // save Person data
      print "do nothing\n";
    }
  }
}
$person = new Person( "bob", 44 );
$person->setId( 343 );
$person->setId( &#39;&#39; ); // 最后执行析构函数,使用完之后执行
?>

Ausgabe:

nichts tun

__clone-Methode

Beim Klonen Folgendes ausführen:

<?php
class Person {
  private $name;
  private $age;
  private $id;
  function __construct( $name, $age ) {
    $this->name = $name;
    $this->age = $age;
  }
  function setId( $id ) {
    $this->id = $id;
  }
  function __clone() { // 克隆时候执行
    $this->id = 0;
  }
}
$person = new Person( "bob", 44 );
$person->setId( 343 );
$person2 = clone $person;
print_r( $person );
print_r( $person2 );
?>

Ausgabe:

Person Object
(
  [name:Person:private] => bob
  [age:Person:private] => 44
  [id:Person:private] => 343
)
Person Object
(
  [name:Person:private] => bob
  [age:Person:private] => 44
  [id:Person:private] => 0
)

Schauen Sie noch einmal. Ein Beispiel

<?php
class Account { // 账户类
  public $balance; // 余额
  function __construct( $balance ) {
    $this->balance = $balance;
  }
}
class Person {
  private $name;
  private $age;
  private $id;
  public $account;
  function __construct( $name, $age, Account $account ) {
    $this->name = $name;
    $this->age = $age;
    $this->account = $account;
  }
  function setId( $id ) {
    $this->id = $id;
  }
  function __clone() {
    $this->id  = 0;
  }
}
$person = new Person( "bob", 44, new Account( 200 ) ); // 以类对象作为参数
$person->setId( 343 );
$person2 = clone $person;
// give $person some money
$person->account->balance += 10;
// $person2 sees the credit too
print $person2->account->balance; // person的属性account也是一个类,他的属性balance的值是210
// output:
// 210
?>

Kommentare: Lernen kann das Gehirn immer noch erweitern. Heute verstehe ich endlich, warum es mehrere Pfeilkonzepte $person-> gibt. Konto- >Saldo. Das Kontoattribut ist hier ein Objekt.

__toString

<?php
class Person {
  function getName() { return "Bob"; }
  function getAge() { return 44; }
  function __toString() {
    $desc = $this->getName()." (age ";
    $desc .= $this->getAge().")";
    return $desc;
  }
}
$person = new Person();
print $person; // 打印时候集中处理
// Bob (age 44)
?>

Kommentare: Es muss nur gültig sein, wenn es print oder echo ist, print_r gibt das Objekt aus.

Person Object()

Ich hoffe, dass dieser Artikel für alle in der PHP-Programmierung hilfreich sein wird.

Ausführlichere Erläuterungen zu erweiterten Funktionen der objektorientierten PHP-Programmierung (Schnittstellen, Vererbung, abstrakte Klassen, Zerstörung, Klonen usw.) finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn