-
enxtends
-
单继承
- public
- protected
-
子类和父类构造方法的执行
- 子类没有构造方法,父类有构造方法
- 实例化子类时,自动调用父类的构造方法
- 子类有构造方法,父类也有构造方法
- 实例化子类时,自动【隐式】调用子类的构造方法,需要手动【显示】的调用 parent::__construct()
- 子类没有构造方法,父类有构造方法
-
关键字
- parent 指向父类
- self 指向自身【定义的类】
- $this 指向当前对象实例
-
方法的重写
- 子类中的方法名跟父类一致
- 子类的访问权限不能严格于父类
- 父类 public 子类也只能是public
- 父类 protected 子类就可以是public 或者protected
- 父类如果是private 对子类不见可
- 子类中重写的方法,参数列表【个数】要跟父类一致
-
什么时候可以使用继承?【父类】
- 父类实现功能的复用
- 子类实现功能的扩展
-
没有父类
- 想办法封装父类【基类】
-
abstract修饰的类
-
抽象类不能被实例化
-
可以定义成员变量,成员方法,类常量,【跟普通类一致】
-
抽象方法
- abstract修饰的方法,抽象方法只定义方法名,不实现具体的功能【不能包含方法体】
- 类中有抽象方法,就必须声明为抽象类
-
继承抽象类,要么也是一个抽象类,要么是普通类。普通类需要把抽象方法全部实现
public $username = 'abstract';
public static $active_times = 0;
const ABSTRACT_VERSION = '1.0.0';
public function getUsername(){
return $this->username."----".self::ABSTRACT_VERSION;
}
//只声明方法,不实现。定义规范或者标准
abstract public function getVersion();
}
//实现了抽象类的方法
public function getVersion(){
}
}
接口
在抽象类之上,比抽象类更加严格和规范
-
interface
-
不能被实例化 Cannot instantiate interface lab09toolsLog
-
接口不能包含成员变量 **Fatal error**: Interfaces may not include member variables
-
任何方法都不能包含方法体 Interface function lab09toolsLog::getName() cannot contain body【全部抽象方法】【不能成员方法】
-
接口可以有常量
-
接口中只能有抽象方法,所以每个方法就不用声明为抽象 abstract 直接不用关键字
-
接口中只能有public的抽象方法,所以每个方法就不用声明为public 直接不用修饰符
-
可以同时实现多个接口
-
接口中定义的方法在实现类全部要实现【带有方法体】
const INTERFACE_VIERSION ='1.1.1';
function write();
function read();
function delete();
}
const FORMAT_VIERSION ='1.1.1';
function write2();
function read2();
function delete2();
}
public function write(){
//以文件处理的机制写日志
}
public function read(){
//以文件处理的机制读取日志
}
public function delete(){
//以文件处理的机制读取日志
}
public function write2(){
}
public function read2(){
}
public function delete2(){
}
}
多态
怎么实现?一个类可以有多种状态,多态
- 肯定现有父类【普通类,抽象类,可以接口】
- 父类中定义某个方法
- 可定有子类【继承普通类,或者实现抽象类,或者实现接口】
- 子类中实现或者重写父类中的方法
- 调用类【测试类】
- 有个方法的形参是某一父类,实参是某一个父类的实现类【子类】
- 由于不同子类实现了父类的某个方法,并且表现不同的功能和形态
public $username = 'abstract';
public static $active_times = 0;
const ABSTRACT_VERSION = '1.0.0';
public function getUsername(){
return $this->username."----".self::ABSTRACT_VERSION;
}
abstract public function Word();
}
public $username = 'abstract';
public static $active_times = 0;
const ABSTRACT_VERSION = '1.0.0';
public function getUsername(){
return $this->username."----".self::ABSTRACT_VERSION;
}
public function Word(){
echo '写PHP代码';
}
}
public $username = 'abstract';
public static $active_times = 0;
const ABSTRACT_VERSION = '1.0.0';
public function getUsername(){
return $this->username."----".self::ABSTRACT_VERSION;
}
public function Word(){
echo '写JAVA代码';
}
}
class Manger{
public function devison(Coder $coder ){
$coder->work();
}
}
$phpcoder = new lab09toolsPHPCoder;
$javacoder = new lab09toolsJavaCoder;
(new Manger())->devison($phpcoder);
(new Manger())->devison($javacoder);
面向对象-魔术方法
| 方法 | 描述 |
|---|---|
| __construct | 构造方法,实例化时自动调用 |
| __destruct | 析构方法,脚本结束时或者显示执行unset(对象实例)时调用 |
| __set( n a m e , name, name,val) | 设置或者修改不存在成员变量或者没有权限访问的成员变量 |
| __get($name) | 获取不存在成员变量或者没有权限访问的成员变量 |
| __call( m e t h o d , method, method,parmas) | 调用一个不存在或者没有权限访问的成员方法 |
| __callStatic( m e t h o d , method, method,parmas) | 调用一个不存在或者没有权限访问的静态方法 |
| __clone() | 克隆某个对象实例【如果需要就定义】 |
| __sleep() | 对某个对象实例进行系列化【保持对象】时调用【如果需要就定义】 |
private $id = 12;
public function __construct(){
echo '';
echo 'PHP入门
';
}
public function __destruct(){
echo '到放弃
';
}
public function __set($name,$val){
//id 21
echo $name,$val;
}
public function __get($name){
echo "获取私有变量".$name;
}
public function __call($method,$params){
var_dump($method);
var_dump($params);
}
public static function __callStatic($method,$params){
var_dump($method);
var_dump($params);
}
}
$coder = new Coder;
$coder->working(1,2,3);
$coder::working(1,2,3,4);
克隆对象和对象赋值的区别
$coder = new Coder;
$coder->id = 21;
$coder_2 = $coder;
$coder_2->id = 100;
//100
echo "通过赋值对象操作",$coder->id ;
$coder_3 = clone $coder;
echo "克隆对象实例之后",$coder_3->id;
$coder_3->id = 200;
echo "通过克隆对象操作",$coder->id ;
//
$coder4 = new Coder();
$coder5 = new Coder();
持久化保存对象【文件,数据库】
$coder = new Coder();
$coder->id = "复杂运算之后的结果";
//系列化对象实例
$coder_str = serialize($coder);
//保存对象
file_put_contents("Coder.log", $coder_str);
//读取系列化对象
$new_coder_str = file_get_contents("Coder.log");
var_dump($new_coder_str);//O:5:"Coder":1:{s:2:"id";s:27:"复杂运算之后的结果";}
//反系列化
$old_coder = unserialize($new_coder_str);
var_dump($old_coder->id);//"复杂运算之后的结果";
setTimeout(fucntion(){
window.location.href="http://www.baidu.com";
},3000)



