今天开始学习的是PHP对象有的高级应用,前两天学习过PHP面向对象的一些基础知识,以及抽象类的应用。
(1), final关键字:final关键字来修饰类的作用是使类不再具有继承性。不能再派生出新的子类。若该final关键字作用于类中的一个方法,则该方法不能被子类继承。
(2)抽象类:用关键字abstract修饰,只能用作其他类的基类,本身不能被 实例化。该类同同普通类一样,也可以有成员变量和方法,但至少需包含一个方法,不用有方法体。方法的实现只能在子类中完成。
(3)接口的使用:由于继承只能为单继承,不能有多继承,这个可以用接口interface来实现.
(4)克隆对象:用关键字clone可以将一个对象$obj1赋给$obj2,$obj2 = clone $obj1。两个对象占用不同的物理空间,如果$obj2 = $obj1,则$obj1,$obj2占用相同的一个物理空间,相当于一个对象对另外一个对象的引用,判断两个对象是引用不是克隆可以用对象比较符==(内容完全相等),===(引用)来得到结果。如果想在被赋值对象$obj2里保留一些不同于赋值对象$obj1的变量,可以__clone()方法。
(5)对象类型检测instanceof: 可以用instanceof来判断对象$obj是否属于某类或该类的父类,格式如下:
(6)魔术方法:魔术方法即在一般的方法前有标志__,如前面学习过的构造函数__construct(),析构函数__destruct(),克隆函数__clone(), 这里有我们要提到的新的一引起魔术方法:
__get(),__set()方法:当程序试图调用一个不存在的类的成员变量的时候。PHP会执行该方法。
__call()方法:当程序试图调用一个不存在的类的成员函数的时候。PHP会执行该方法。
__sleep(),__wakeup()方法:当调用serialize()将一个对象进行序列化的时候,如果该对象里包含一个__sleep()函数,则会先执行该__sleep()方法。unserialize()函数可以重新一个还原被序列化了的对象,则会调用__wakeup()函数,用来恢复数可能丢失的数据库连接和相关工作 。但有一个疑问的是该类只能有一个变量才能调的通程序,如果有两个及以上变量的时候,程序会提示出错。
__toString()方法:该方法的作用用来可以将一个对象进行输出,如echo $obj,如果类中没有该方法的时候,则这样的代码会报错误。
__autoload()方法:一般写规范程序的时候,一个独立的类会保存在一个php文件中支,如果在一个新的页面要调用其他类的时候,可以用__autoload()和include_once()方法来一次加入多个类文件
呵呵,新手上路,请多多指教哈!
————————————————
原文链接:https://blog.csdn.net/combridge320/article/details/5420863
PHP 中接口与继承的定义与区别 (接口类和抽象类(都不能直接实例化))
接口与抽象类
一个类可以继承多个接口。。。
一个类只能继承一个抽象类。。。
接口 接口类不能被实例化,并且属性必须是常量,方法不能有方法体
接口类不能被实例化,需要一一实现接口定义的所有方法。关键字interface implements,
接口里面定义的所有方法都是空的。且不能实例化,而需要别的类去implements 它,而且必须一一实现接口定义的所有方法,
实际上接口类说白了,就是一个类的模板,一个类的规定,
接口中定义的所有方法都必须是公有,这是接口的特性。
什么时候用接口?
1、定规范,保持统一性;
2、多个平级的类需要去实现同样的方法,只是实现方式不一样
接口使用规范
- 接口不能实例化
- 接口的属性必须是常量
- 接口的方法必须是public【默认public】,且不能有函数体
- 类必须实现接口的所有方法
- 一个类可以同时实现多个接口,用逗号隔开
- 接口可以继承接口【用的少】
--------------------------------------------------------------------------------------------------------------------
抽象类&抽象方法 (只能被继承)(关键字 abstract)(继承关键字extends)
抽象类中也是可以有构造函数的。
具有抽象方法的类为抽象类,抽象类不能实例化,只能继承,
通过extends来实现,抽象类中也可以定义普通方法
父类方法执行方式不确定,但子类还都有这个方法。当父类为抽象类时,子类必须重写父类的抽象方法
抽象类里不一定非要写抽象方法,但有抽象方法的类必须定义为抽象类
抽象类必须继承使用
抽象方法不能有主体即{}
<?php
abstract class AbstractClass
{
// 强制要求子类定义这些方法
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// 普通方法(非抽象方法)
public function printOut() {
print $this->getValue();
}
}
抽象类中也是可以有构造函数的。虽然抽象类不能实例化,但是抽象类被继承之后,它的派生类可以实例化;而派生类在实例化调用构造函数的时候会先调用基类中的构造函数,所以抽象类的构造函数也是可以被调用的,所以抽象类中可以有构造函数。抽象类的析构函数最后是虚析构函数。
链接一有意思的问题 :PHP抽象构造函数 此问题讨论抽象类的抽象构造函数是子类的构造函数,还是基类构造函数的实现?