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程序设计有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值