PHP学习笔记
类
类的声明
声明类的关键字时class,声明的格式如下:
访问权限修饰符 class 类名 {
类的内容;
}
其中,访问权限修饰符时可选的,常见的修饰符包括public、private和protected。默认情况下为public。
- public:可以从类的内部和外部访问;
- private:只能从类的内部访问;
类的成员属性
成员属性必须使用关键字进行修饰,常见的关键字包括public、private和protected等。如果没有特定的意义,仍然需要var关键字修饰。
构造方法
当我们在定义一个类的时候,我们可以将类的方法定义为一般方法和构造方法。构造方法在我们使用new关键字进行实例化对象的同时就会去调用执行我们所定义的构造方法。换而言之,我们可以通过构造方法在初始化类对象的时候就就对类成员属性进行初始化。
构造方法的语法格式:
function _construct([mixed args]){
//方法内容
}
注意:构造方法是不能有返回值(return)的。
析构方法
类的析构方法是在对象被销毁的时候调用的。
析构方法的语法格式:
function _destruct(){
//方法内容,通常是一些对象在被销毁前的一些清理任务
}
访问器
访问器的语法格式:
function _set($propName,$propValue){
$this->$propName=$propValue;
}
function _get($propName){
retun $this->$propName;
}
访问器的两个参数分别是属性名和属性值。
代码实例:
<?php
class guests{
private $property;方法
//当为私有属性进行赋值时调用这个
function _set($propName,$propValue){
$this->$propName=$propValue;
}
//当需要使用私有属性值时调用
function _get($propName){
return $this->$propName;
}
};
$Felix=new guests;
$Felix->name="赵庆飞";
$Felix->gender="男";
echo $Felix->name."是".$Felix->gender."<br />";
?>
在上面的实例代码中,我们newl一个guests类的对象,当我们分别对这个对象的私有属性进行赋值时就会调用_set()方法;我们最后需要输出私有属性的值时调用_get()方法。
类的继承
继承的关键字时extends,类继承的格式如下:
class 子类类名 extends 父类类名 {
子类的内容;
}
抽象类和接口
抽象类
抽象类使用abstract关键字进行声明,抽象类的声明语法格式如下:
abstract class 抽象类名{
abstract function 成员方法1(参数列表);
abstract function 成员方法2(参数列表);
}
抽象类的特点是:抽象类只能作为父类使用,因为抽象类的对象不能被实例化。抽象类与普通类的区别在于,抽象类的方法没有方法内容,而且至少包含一个抽象方法。抽象方法也必须使用abstract关键字,必须以;分号结束。
代码实例:
abstract class MyObject{
abstract function service ($getName,$price,$num);
}
//子类继承了一个抽象类型的父类
class MyBook extends MyObject{
function service($getName,$price,$num){
echo "您购买的商品是:".$getName."\t"."价格是:".$price."\t"."数量为:".$num;
}
}
$book=new MyBook;//实例化抽象类的子类对象
$book->service("《PHP5.5从零开始学习》",30,2);
接口
因为PHP只支持单继承,当我们需要实现多继承的功能时就需要调用多个接口来实现,这就是接口存在的原因。
需要注意的是,接口类中不能声明变量,只能使用const关键字声明常量。
多态
多态性是指同一操作作用于不同类的实例,将会产生不同的执行结果,即不同类的对象收到相同信息时,得到不同的结果。在PHP中实现多态有两种方法,包括通过继承实现和通过接口实现。
通过继承实现
<?php
abstract class Vegetables{ //定义抽象类Vegetables
abstract function go_Vegetables(); //定义抽象方法go_Vegetables
}
//马铃薯类继承蔬菜类
class Vegetables_potato extends Vegetables{
public function go_Vegetables(){
echo "马铃薯" ; //输出信息
}
}
class Vegetables_radish extends Vegetables{
public function go_Vegetables(){
echo "萝卜" ;
}
}
function change($obj){
if($obj instanceof Vegetables ){
$obj->go_Vegetables();
}else{
echo "传入的参数不是一个对象"; //输出信息
}
}
echo "实例化Vegetables_potato:";
change(new Vegetables_potato());
echo "<br>";
echo "实例化Vegetables_ radish:";
change (new Vegetables_radish ());
?>
上面的实例代码中,定义了一个抽象的父类Vegetables以及两个继承该父类的子类。从代码中我们可以看出,两个子类都实现了父类中的抽象方法,在调用chang方法是,我们传入的分别传入两个不同的子类对象,然后相应的子类对象去调用定义的类方法
输出结果:
实例化Vegetables_potato():马铃薯
实例化Vegetables_radish():萝卜
instanceof的作用:(1)判断一个对象是否是某个类的实例,(2)判断一个对象是否实现了某个接口。
通过接口实现
<?php
interface Vegetables{ //定义接口Vegetables
public function go_Vegetables(); //定义接口方法
}
class Vegetables_potato implements Vegetables{
public function go_Vegetables(){
echo "我们开始种植马铃薯" ;
}
}
//Vegetables_radish实现Vegetables接口
class Vegetables_radish implements Vegetables{
//定义go_Vegetables方法
public function go_Vegetables(){
echo "我们开始种植萝卜" ;
}
}
//自定义方法根据对象调用不同的方法
function change($obj){
if($obj instanceof Vegetables ){
$obj->go_Vegetables();
}else{
echo “传入的参数不是一个对象”;
}
}
echo "实例化Vegetables_potato:";
change(new Vegetables_potato());//实例化Vegetables_potato
echo "<br>";
echo "实例化Vegetables_radish:";
change (new Vegetables_radish ());
?>
实现原理与继承方式类似就不再进行详述。