日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php抽象类继承抽象类,PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)...

發布時間:2025/3/11 php 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php抽象类继承抽象类,PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文實例講述了PHP面向對象程序設計高級特性。分享給大家供大家參考,具體如下:

靜態屬性

class StaticExample {

static public $aNum = 0; // 靜態共有屬性

static public function sayHello() { // 靜態共有方法

print "hello";

}

}

print StaticExample::$aNum;

StaticExample::sayHello();

?>

輸出:0??? hello

點評:靜態屬性和方法,可以通過類直接調用。

SELF

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

?>

輸出:

hello (1)

hello (2)

hello (3)

點評:self 指向當前類, this指向當前對象。self可以調用當前類的靜態屬性和方法。this指向當前對象。self可以調用當前類的靜態屬性和方法。this可以調用當前類的正常屬性和方法。

常量屬性

class ShopProduct {

const AVAILABLE = 0; // 只能用大寫字母命名常量

const OUT_OF_STOCK = 1;

public $status;

}

print ShopProduct::AVAILABLE;

?>

輸出:0

點評:常量只能用大寫字母,并且可以通過類直接調用。

接口

interface Chargeable { // 接口,抽象類是介于基類與接口之間的東西

public function getPrice();

}

class ShopProduct implements Chargeable {

// ...

protected $price;

// ...

public function getPrice() {

return $this->price;

}

// ...

}

$product = new ShopProduct();

?>

如果沒有實現getPrice方法,將會報錯。

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

繼承類與接口

class TimedService{ }

interface Bookable{ }

interface Chargeable{ }

class Consultancy extends TimedService implements Bookable, Chargeable { // 繼承類與接口

// ...

}

?>

抽象類

先來看一段代碼

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

?>

輸出:

Document Object

(

)

靜態方法

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

?>

輸出:

User Object

(

[group:DomainObject:private] => default

)

SpreadSheet Object

(

[group:DomainObject:private] => document

)

final字段

使類無法被繼承,用的不多

final class Checkout { // 終止類的繼承

// ...

}

class IllegalCheckout extends Checkout {

// ...

}

$checkout = new Checkout();

?>

輸出:

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

final方法不能夠被重寫

class Checkout {

final function totalize() {

// calculate bill

}

}

class IllegalCheckout extends Checkout {

function totalize() { // 不能重寫final方法

// change bill calculation

}

}

$checkout = new Checkout();

?>

輸出:

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

析構函數

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( '' ); // 最后執行析構函數,使用完之后執行

?>

輸出:

do nothing

__clone方法

克隆的時候執行

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

?>

輸出:

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

)

再看一個例子

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

?>

點評:學習還是能夠開拓大腦的,今天終于明白為什么有多個箭頭的概念了$person->account->balance。這里的account屬性是一個對象。

__toString

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)

?>

點評:必須是print或echo時才有效,print_r就輸出對象。

Person Object()

希望本文所述對大家PHP程序設計有所幫助。

總結

以上是生活随笔為你收集整理的php抽象类继承抽象类,PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。