20191125PHP抽象类、接口和魔术方法
抽象类
不能被实例化,用于其他类的继承。使用abstract(抽象)。抽象方法一定是抽象类,抽象类不一定有抽象方法。
接口interface是特殊的抽象类。
eg:
<?php //抽象类 abstract class person{ function run(){ echo "runing………………"; } abstract function start(); } class boys extends person{ function start(){ echo "子类的方法start"; } } $a=new boys(); $a->run(); //接口的编写 interface student{ function name(); function study(); } class stu implements student{ function name(){ echo "姓名"; } function study(){ echo "学习"; } } $b=new stu(); $b->study(); ==================================================================
魔术方法克隆__clone()。
<?php //对象克隆和魔术方法__clone class person{ var $name; var $age; var $count=0; function __construct($name,$age){ $this->name=$name; $this->age=$age; } function __clone(){ $this->count+=1; } function run(){ echo $this->name."runing………………"; } } $a=new person("小明",23); $a->run(); echo $a->count; $b=clone $a; //克隆对象 $b->run(); echo $b->count; $c=new person("小花",22); echo $c->count; $d=clone $b; echo $d->count;
魔术方法__get() __set()
<?php class person{ private $name; private $age; function __set($name,$value){ $this->$name=$value; } function __get($name){ return $this->$name; } } $a=new person(); $a->name="小明"; echo $a->name;
魔术方法__call()、__tostring()
<?php //__call()、__toString() class person{ function __call($name,$v){ echo "您调用的方法".$name."不存在"; } function __toString(){ return "我是person类的信息"; } } $a=new person(); $a->run(); $a->stop(); echo $a;
其他的魔术方法:
__construct(),类的构造函数
__destruct(),类的析构函数
__call(),在对象中调用一个不可访问方法时调用
__callStatic(),用静态方式中调用一个不可访问方法时调用
__get(),获得一个类的成员变量时调用
__set(),设置一个类的成员变量时调用
__isset(),当对不可访问属性调用isset()或empty()时调用
__unset(),当对不可访问属性调用unset()时被调用。
__sleep(),执行serialize()时,先会调用这个函数
__wakeup(),执行unserialize()时,先会调用这个函数
__toString(),类被当成字符串时的回应方法
__invoke(),调用函数的方式调用一个对象时的回应方法
__set_state(),调用var_export()导出类时,此静态方法会被调用。
__clone(),当对象复制完成时调用
__autoload(),尝试加载未定义的类
__debugInfo(),打印所需调试信息