Heim > php教程 > PHP开发 > Hauptteil

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

高洛峰
Freigeben: 2016-12-30 10:01:41
Original
1663 Leute haben es durchsucht

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();
?>
Nach dem Login kopieren

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();
?>
Nach dem Login kopieren

Ausgabe:

hello (1)
hello (2)
hello (3)
Nach dem Login kopieren

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();
?>
Nach dem Login kopieren

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 { // 继承类与接口
  // ...
}
?>
Nach dem Login kopieren

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 );
?>
Nach dem Login kopieren

Ausgabe:

Document Object
(
)
Nach dem Login kopieren

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());
?>
Nach dem Login kopieren

Ausgabe:

User Object
(
  [group:DomainObject:private] => default
)
SpreadSheet Object
(
  [group:DomainObject:private] => document
)
Nach dem Login kopieren

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();
?>
Nach dem Login kopieren

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();
?>
Nach dem Login kopieren

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; ); // 最后执行析构函数,使用完之后执行
?>
Nach dem Login kopieren

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 );
?>
Nach dem Login kopieren

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
)
Nach dem Login kopieren

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
?>
Nach dem Login kopieren

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)
?>
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!