Explication détaillée d'exemples d'interface orientée objet PHP, d'héritage, de classes abstraites, de destruction, de clonage et d'autres fonctionnalités avancées

伊谢尔伦
Libérer: 2023-03-11 21:54:01
original
1349 Les gens l'ont consulté

Cet article présente principalementla programmation orientée objet PHPfonctionnalités avancées et analyse les attributs statiques, les attributs constants et les interfaces impliquées dans la programmation orientée objet PHP sous forme d'exemples . , héritage, classe abstraite, destruction, clonage et autres concepts et techniques d'utilisation, les amis dans le besoin peuvent se référer à

Attributs statiques

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

Commentaires :

propriétés et méthodes statiques , qui peuvent être appelées directement via les classes.

2. 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();
?>
Copier après la connexion
Sortie :

hello (1)
hello (2)
hello (3)
Copier après la connexion
Commentaire : self pointe vers 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 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.

3. Attributs des constantes

<?php
class ShopProduct {
  const AVAILABLE   = 0; // 只能用大写字母命名常量
  const OUT_OF_STOCK  = 1;
  public $status;
}
print ShopProduct::AVAILABLE;
?>
Copier après la connexion
Sortie : 0

Commentaires : Les constantes ne peuvent être qu'en lettres majuscules et peuvent être appelées directement via les classes. .

4. Interface

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

5. Classes et interfaces

<?php
class TimedService{ }
interface Bookable{ }
interface Chargeable{ }
class Consultancy extends TimedService implements Bookable, Chargeable { // 继承类与接口
  // ...
}
?>
Copier après la connexion

6. 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 );
?>
Copier après la connexion
Sortie :

Document Object
(
)
Copier après la connexion

7. Méthode statique

<?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());
?>
Copier après la connexion
Sortie :

User Object
(
  [group:DomainObject:private] => default
)
SpreadSheet Object
(
  [group:DomainObject:private] => document
)
Copier après la connexion

7. 🎜>Rend la classe incapable d'être héritée, peu utilisée

Sortie :

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

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

Sortie :

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

Erreur fatale : Impossible de remplacer la méthode finale Checkout : totalize( )

8.

Destructeur

Sortie :

<?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; ); // 最后执行析构函数,使用完之后执行
?>
Copier après la connexion
ne rien faire

9. La méthode de clonage

est exécutée lors du clonage

Sortie :

<?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 );
?>
Copier après la connexion

Regardez un autre exemple

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
)
Copier après la connexion

Commentaire : L'apprentissage peut encore développer le cerveau. Aujourd'hui, je comprends enfin pourquoi il existe plusieurs concepts de flèches $person->account->balance. L'attribut de compte ici est un objet.

<?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
?>
Copier après la connexion

10. toString

Commentaires : Il doit être valide uniquement s'il s'agit d'un print ou d'un echo, print_r affichera l'objet.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal