Home  >  Article  >  Backend Development  >  Detailed explanation of examples of PHP object-oriented interface, inheritance, abstract classes, destruction, cloning and other advanced features

Detailed explanation of examples of PHP object-oriented interface, inheritance, abstract classes, destruction, cloning and other advanced features

伊谢尔伦
伊谢尔伦Original
2017-06-29 09:36:101287browse

This article mainly introduces PHP object-orientedProgramming Advanced features, and analyzes the static properties, constant properties, and interfaces involved in PHP object-oriented programming in the form of examples. , inheritance, Abstract class, destruction, cloning and other concepts and usage skills, friends in need can refer to the following

1. Static properties

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

Output: 0 hello

Comments: Static properties and methods can be called directly through the class.

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();
?>

Output:

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

Comments: self points to the current class, this points to the current object. self can call static properties and methods of the current class. this points to the current object. self can call static properties and methods of the current class. this can call the normal properties and methods of the current class.

3. Constant attributes

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

Output: 0

Comments: Constants can only use uppercase letters and can be called directly through classes.

4. Interface

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

If the getPrice method is not implemented, an error will be reported.

Fatal error: Class ShopProduct contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Chargeable::getPrice)

5. Inheritance Classes and interfaces

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

6. Abstract class

Let’s look at a piece of code first

<?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 );
?>

Output:

Document Object
(
)

7. Static method

<?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());
?>

Output:

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

7. Final field

makes the class unable to be inherited, use Not much

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

Output:

Fatal error: Class IllegalCheckout may not inherit from final class (Checkout)

final method cannot Overridden

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

Output:

Fatal error: Cannot override final method Checkout::totalize()

8 . Destructor

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

Output:

do nothing

9. clone method

Execute when cloning

<?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 );
?>

Output:

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
)

Look at another example

<?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
?>

Comments: Learning is still possible I have developed my brain, and today I finally understand why there are multiple arrow concepts $person->account->balance. The account attribute here is an object.

10. 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)
?>

Comments: It must be valid only if it is print or echo, print_r will output the object.

The above is the detailed content of Detailed explanation of examples of PHP object-oriented interface, inheritance, abstract classes, destruction, cloning and other advanced features. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn