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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Typora markdown公式换行等号对齐_Typora编写博客格式化文档的最佳软件

Typora-编写博客格式化文档的最佳软件Typora 不仅是一款支持实时预览的 Markdown 文本编辑器,而且还支持数学公式、代码块、思维导图等功能。它有 OS X、Windows、Linux 三个平台的版本,是完全免费的。作为技术人员或者专业人员,使用Markdown…

Bootstrap静态cdn

百度的静态资源库的 CDN 服务http://cdn.code.baidu.com/ &#xff0c;访问速度更快、加速效果更明显、没有速度和带宽限制、永久免费,引入代码如下&#xff1a; <!-- 新 Bootstrap 核心 CSS 文件 --> <link href"http://apps.bdimg.com/libs/bootstrap/3.3.0/…

php复习,PHP排序算法的复习和总结

直接上代码吧&#xff01;/** 插入排序(一维数组)* 每次将一个待排序的数据元素&#xff0c;插入到前面已经排好序的数列中的适当的位置&#xff0c;使数列依然有序&#xff1b;直到待排序的数据元素全部插入完成为止。*/function insertSort($arr){if(!is_array($arr) || coun…

docker-machine

vbox安装 sudo /sbin/vboxconfig &#xfffc; yum install gcc make yum install kernel-devel-3.10.0-514.26.2.el7.x86_64 转载于:https://www.cnblogs.com/yixiaoyi/p/dockermachine.html

intention lock_写作技巧:你写出来的情节有用吗?好情节的原则——LOCK系统

读者喜欢一本小说的原因只有一个&#xff1a;很棒的故事。——Donald Maass来&#xff0c;话筒对准这位小作家&#xff0c;请问你是如何构思故事的&#xff1f;是习惯于现在脑海中把故事都想好了&#xff0c;才开始写作&#xff1f;还是习惯于临场发挥&#xff0c;喜欢一屁股坐…

zookeeper基本操作

1.客户端连接 [txtest1 bin]$ jps 23433 Jps 23370 QuorumPeerMain #zookeeper进程[txtest1 bin]$ ./zkCli.sh -server test1:2182 Connecting to test1:2182 2018-01-24 23:42:09,024 [myid:] - INFO [main:Environment100] - Client environment:zookeeper.version3.4.5-…

sqllite java 密码,SQLite登录检查用户名和密码

我正在创建一个应用程序(使用Java和SQLite)(JFrame&#xff0c;使用Netbeans)我有我想要登录的用户 . (我有所有正确的包JDBC&#xff0c;SQLite等)我遇到的问题似乎是获取用户名/密码来检查我的users.db文件..我正在使用Java和SQLite . 我也在使用JDBC .我的一些代码作为一个例…

springmvc与struts2的区别

1&#xff09;springmvc的入口是一个servlet&#xff0c;即前端控制器&#xff0c;例如&#xff1a;*.action struts2入口是一个filter过虑器&#xff0c;即前端过滤器&#xff0c;例如&#xff1a;/* 2&#xff09;springmvc是基于方法开发&#xff0c;传递参数是通过方法形…

power designer数据流图_鲲云公开课 | 三分钟带你了解数据流架构

目前&#xff0c;市场上的芯片主要包括指令集架构和数据流架构两种实现方式。指令集架构主要包括X86架构、ARM架构、精简指令集运算RISC-V开源架构&#xff0c;以及SIMD架构。总体来说&#xff0c;四者都属于传统的通用指令集架构。传统的指令集架构采用冯诺依曼计算方式&#…

onCreate源码分析

原文地址Android面试题-onCreate源码都没看过&#xff0c;怎好意思说自己做android Activity扮演了一个界面展示的角色&#xff0c;堪称四大组件之首&#xff0c;onCreate是Activity的执行入口&#xff0c;都不知道入口到底干了嘛&#xff0c;还学什么android,所以本文会从源码…

linux php环境搭建教程,linux php环境搭建教程

linux php环境搭建的方法&#xff1a;首先获取相关安装包&#xff1b;然后安装Apache以及mysql&#xff1b;接着修改配置文件“httpd.conf”&#xff1b;最后设置环境变量和开机自启&#xff0c;并编译安装PHP即可。一、获取安装包PHP下载地址&#xff1a;http://cn.php.net/di…

Apache2.2与Tomcat7集成方案详解

原文地址&#xff1a;http://my.oschina.net/u/919173/blog/159206 ------------------------------------ 首先谈一下为什么要集成Apache和tomcat7&#xff1f; Apache是当前使用最为广泛的WWW服务器软件&#xff0c;具有相当强大的静态HTML处理的能力。 Tomcat服务器是一个…

cocos 制作动态生成内容的列表_零代码工具,让你在线轻松制作交互内容!

在工作中设计师不会写代码&#xff0c;懂代码的不会设计&#xff0c;2种不同工作互掐的情况屡见不鲜&#xff0c;那我们如何把这2项工作一并融合贯通呢&#xff1f;对于不懂代码的职场“小白”&#xff0c;我们可以利用一些零代码工具来完成。今天小编介绍几款在线开发设计工具…

php怎样数据缓存文件,php数据缓存到文件类设计

// 自定义缓存类class Cache_Filesystem {// 缓存写保存function set ($key, $data, $ttl) {//打开文件为读/写模式$h fopen($this->get_filename($key), ‘a‘);if (!$h) throw new Exception("Could not write to cache");flock($h, LOCK_EX); //写锁定&#x…

jsp放在web-inf下的注意事项

原文&#xff1a;http://blog.csdn.net/whatlookingfor/article/details/38381881 ------------------------------------------------- web-inf目录是不对外开放的&#xff0c;外部没办法直接访问到。所有只能通过映射来访问&#xff0c;比如映射为一个action或者servlet通过…

php打印布尔型,PHP数据类型之布尔型的介绍_PHP

布尔类型是PHP中 最简单的类型。它的值可以为 TRUE 或 FALSE。如&#xff1a;$foofalse;$foo1true;echo "为假时输出值为:".$foo; //没有输出值echo "为真时输出值为:".$foo1; //输出1这里主要的细节&#xff1a;当转换为 boolean 时&#xff0c;以下值被认…

oracle 如何终止存储过程的运行

0.查询正在执行的存储过程&#xff1a; select * from v$db_object_cache where locks > 0 and pins > 0 and typePROCEDURE;1. 在V$ACCESS视图中找到要停止进程的SID: 举例&#xff1a;存储过程名&#xff1a;CRH_ENTRY SELECT t.* FROM V$ACCESS t WHERE t.objectCRH_…

python install zabbix.4.0

1.安装 MySQLdb 模块; #!/bin/bash #this is rpm python Environment depends on function depends_rpm(){ yum clean all yum -y install gcc* python-devel python-pip mariadb mariadb-devel mariadb-server if [ $? -eq 0 ]thenpip install MySQL-python1.2.5 elsee…

asp.net 获取全部在线用户_Qamp;A | 在线考试问卷答疑

01.如何批量导入试题&#xff1f;如果您已经在word或者excel中准备好了考试文档&#xff0c;通过批量导入试题的方式&#xff0c;可以让考试问卷的制作更加方便快捷。详细了解批量导入考试的文本格式&#xff1a;【点击此处】02.如何进行考试随机抽题&#xff1f;老师事先建立题…