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( '' ); // 最后执行析构函数,使用完之后执行 ?>
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!