Les exemples de cet article décrivent les fonctionnalités avancées de la programmation orientée objet PHP. Partagez-le avec tout le monde pour votre référence, comme suit :
Propriétés statiques
<?php class StaticExample { static public $aNum = 0; // 静态共有属性 static public function sayHello() { // 静态共有方法 print "hello"; } } print StaticExample::$aNum; StaticExample::sayHello(); ?>
Sortie : 0 bonjour
Commentaires : les propriétés et méthodes statiques peuvent être appelées directement via les classes .
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(); ?>
Sortie :
hello (1) hello (2) hello (3)
Commentaires : self pointe vers la classe actuelle, cela pointe à l'objet actuel. self peut appeler les propriétés et méthodes statiques de la classe actuelle. cela pointe vers l'objet actuel. self peut appeler les propriétés et méthodes statiques de la classe actuelle. cela peut appeler les propriétés et méthodes normales de la classe actuelle.
Attribut constant
<?php interface Chargeable { // 接口,抽象类是介于基类与接口之间的东西 public function getPrice(); } class ShopProduct implements Chargeable { // ... protected $price; // ... public function getPrice() { return $this->price; } // ... } $product = new ShopProduct(); ?>
Si la méthode getPrice n'est pas implémentée, une erreur sera signalée.
Erreur fatale : La classe ShopProduct contient 1 méthode abstraite et doit donc être déclarée abstraite ou implémenter les méthodes restantes (Chargeable::getPrice)
Classes et interfaces héritées
<?php class TimedService{ } interface Bookable{ } interface Chargeable{ } class Consultancy extends TimedService implements Bookable, Chargeable { // 继承类与接口 // ... } ?>
Classe abstraite
Regardons d'abord un morceau de code
<?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 ); ?>
Sortie :
Document Object ( )
Statique méthode
<?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()); ?>
Sortie :
User Object ( [group:DomainObject:private] => default ) SpreadSheet Object ( [group:DomainObject:private] => document )
champ final
rend la classe impossible à hériter et est pas beaucoup utilisé
<?php final class Checkout { // 终止类的继承 // ... } class IllegalCheckout extends Checkout { // ... } $checkout = new Checkout(); ?>
Sortie :
Erreur fatale : la classe IllegalCheckout ne peut pas hériter de la classe finale (Checkout)
la méthode finale ne peut pas être remplacée
<?php class Checkout { final function totalize() { // calculate bill } } class IllegalCheckout extends Checkout { function totalize() { // 不能重写final方法 // change bill calculation } } $checkout = new Checkout(); ?>
Sortie :
Erreur fatale : impossible de remplacer la méthode finale Checkout::totalize( )
Destructeur
<?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( '' ); // 最后执行析构函数,使用完之后执行 ?>
Sortie :
ne rien faire
__méthode de clonage
Lors du clonage, exécutez
<?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 ); ?>
Sortie :
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 )
Regardez Un exemple
<?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 ?>
Commentaires : L'apprentissage peut encore développer le cerveau Aujourd'hui, je comprends enfin pourquoi il existe plusieurs concepts de flèches $person-> compte->solde. L'attribut de compte ici est un objet.
__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) ?>
Commentaires : Il doit être valide uniquement s'il s'agit d'un print ou d'un echo, print_r affichera l'objet.
Person Object()
J'espère que cet article sera utile à tout le monde dans la programmation PHP.
Pour des explications plus détaillées sur les fonctionnalités avancées de la programmation orientée objet PHP (interfaces, héritage, classes abstraites, destruction, clonage, etc.), veuillez faire attention au site Web PHP chinois !