PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
作者:牛逼的霍啸林 发布时间:2023-11-23 11:35:00
本文实例讲述了PHP面向对象程序设计高级特性。分享给大家供大家参考,具体如下:
静态属性
<?php
class StaticExample {
static public $aNum = 0; // 静态共有属性
static public function sayHello() { // 静态共有方法
print "hello";
}
}
print StaticExample::$aNum;
StaticExample::sayHello();
?>
输出:0 hello
点评:静态属性和方法,可以通过类直接调用。
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();
?>
输出:
hello (1)
hello (2)
hello (3)
点评:self 指向当前类, this指向当前对象。self可以调用当前类的静态属性和方法。this指向当前对象。self可以调用当前类的静态属性和方法。this可以调用当前类的正常属性和方法。
常量属性
<?php
class ShopProduct {
const AVAILABLE = 0; // 只能用大写字母命名常量
const OUT_OF_STOCK = 1;
public $status;
}
print ShopProduct::AVAILABLE;
?>
输出:0
点评:常量只能用大写字母,并且可以通过类直接调用。
接口
<?php
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)
继承类与接口
<?php
class TimedService{ }
interface Bookable{ }
interface Chargeable{ }
class Consultancy extends TimedService implements Bookable, Chargeable { // 继承类与接口
// ...
}
?>
抽象类
先来看一段代码
<?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 );
?>
输出:
Document Object
(
)
静态方法
<?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());
?>
输出:
User Object
(
[group:DomainObject:private] => default
)
SpreadSheet Object
(
[group:DomainObject:private] => document
)
final字段
使类无法被继承,用的不多
<?php
final class Checkout { // 终止类的继承
// ...
}
class IllegalCheckout extends Checkout {
// ...
}
$checkout = new Checkout();
?>
输出:
Fatal error: Class IllegalCheckout may not inherit from final class (Checkout)
final方法不能够被重写
<?php
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()
析构函数
<?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( '' ); // 最后执行析构函数,使用完之后执行
?>
输出:
do nothing
__clone方法
克隆的时候执行
<?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 );
?>
输出:
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
)
再看一个例子
<?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
?>
点评:学习还是能够开拓大脑的,今天终于明白为什么有多个箭头的概念了$person->account->balance。这里的account属性是一个对象。
__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)
?>
点评:必须是print或echo时才有效,print_r就输出对象。
Person Object()
希望本文所述对大家PHP程序设计有所帮助。
猜你喜欢
- 1 动机greenlet 包是 Stackless 的副产品,其将微线程称为 “tasklet” 。tasklet运
- config.php<?phpdefine('APP_DIR', dirname(__FILE__));define(
- 函数如下: function update_timelist(&$arr,$timestamp,$threshold){ $time
- 在编译 PHP 时,如无特殊需要,一定禁止编译生成 CLI 命令行模式的 PHP 解析支持。可在编译时使用 –disable-CLI。一旦编
- 第一招、mysql服务的启动和停止net stop mysqlnet start mysql第二招、登陆mysql语法如下: mysql -
- 情景互动广告是指需要广告画面外的物体来参与的广告,例如:ps:这是我收集的,大家慢慢看吧!其中有大多数收集http://www.netnoe
- 我设了个排卖的起始时间然后设了一个结束时间现在要精确到小时比如提示 “离到期时间:1天XX小时”大家有什么想法吗?我就是在小时总是不能实现,
- int connectDb() { EXEC SQL BEGIN DECLARE SECTION; char username[20]; c
- 安装SQL Server 遇到错误提示:以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机!。找了半天
- 最近一段时间一直比较忙,已经有好几个月没有打理博客了。现将一个最近在项目中制作的一个菜单实例整理出来,共享一下。在后台或OA系统中最常用到的
- 等啊等,约会都回来了,终于等到了Google放出今年的情人节Logo,原本下午四点就可以上线的这篇文章,为了等待Google谷歌美国总部的那
- php的引用(就是在变量或者函数、对象等前面加上&符号),在PHP 中引用的意思是:不同的名字访问同一个变量内容。与C语言中的指针是
- 许多人在编写程序的时候因为贪图方便或不小心使用到程式的保留字,有时明明程序没有错,就是无法正确执行。您知道有哪些常见的保留字吗? 下面的都是
- 又从 James Padolsey 这里得到个好的点子。在实际写脚本过程中可能有段 Javascript 和 HTML 非常相关(比如实例化
- 网页路径问题可以说是在页面设计或程序中比较典型的问题,处理得不好会给你的带来很大的麻烦,如何才能彻底解决路径问题呢!asp之家为你特别准备了
- 现在网页的设计都讲究整体统一风格,无论是网页的文字、图像,还是浏览器的滚动条都要求颜色和风
- 这个问题我在给新云CMS升级时遇到了,按照升级步骤做完,后台登录时,出现“HTTP 错误 500.100 - 内部服务器错误 - ASP 错
- 作者:Scott Gerber原标题:Mobile App Development: 10 Tips for Small Business
- 如何对设计进行评判,一定有很多答案,有利有弊。问100位设计师,会得到100种回答。用线上PV、UV等数据说话,更多受产品属性、运营动作影响
- 我还我还是有必要改一个标题,(原题为 让你想不通的"bug"),以免有同学误会。先看代码。看完之后我有个问题提问一下,看