课时165 对象串行化(序列化)2
* __sleep()在串行化时自动调用的方法
* 作用:可以设置需要串行化的对象的属性
* 只要在这个方法中,返回一个数组,在数组中声明了那个属性名,那个属性就会被串行化,没有在数组中的属性就不被串行化.
* 默认不加数组,全部属性都串行化.
*
* __wakeup()---在返串行化时自动调用的方法
* 作用:
* __construct()对对象进行初始化
* __clone()对克隆对象进行初始化
* __wakeup()对串行化回来后的对象进行初始化
function __sleep(){
echo "开始串行:";
return array("name");}
function __wakeup(){
echo "返串行化开始:";
$this->name = "sce";
}
课时166 PHP数组的串行化(JSON格式)
<?php
/*
* 数组串行化 json ---- javascript object
* 处理json_encode() 不支持中文的情况
* 实际应用中,当有中文字符时,当直接使用json_encode() 函数会使汉字不能正常显示
*
*/$arr = array("name"=>"zhangsan","age"=>10,"sex"=>"man");
//串行化
$str = json_encode($arr);
//返串行化,第二个参数true返串行化为数组
$prr = json_decode($str,true);
echo $prr[‘name‘];
?>
结果:
zhangsan
课时167 魔术方法__set_state()
<?php
/*
* 1.eval()函数 --- 检查并执行php代码
* 2.var_export()可以打印各个类型的信息,但会将类似转成合法的php代码
*
* __set_state()方法,就在在使用var_export()方法时,到处一个类的信息时自动调用的方法
*
*/
class Person{
public $name;
public $age;
public $sex;function __construct($name,$age,$sex){
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
}
function say(){
}
static function __set_state($arr){ //方法必须是静态的.
$p = new person("lisi",43,"woman");
$p->name = $arr[‘name‘];
$p->age = $arr[‘age‘];
return $p;
}
}
$b = new person("zhangsan",20,"man");
$b ->name = "liiii";
$b ->age = 234;
eval(‘$c =‘.var_export($b,true).";");
var_dump($c);
?>
结果:
object(Person)[2] public ‘name‘ =>
string
‘liiii‘ (length=5) public ‘age‘ =>
int
234 public ‘sex‘ =>
string
‘woman‘ (length=5)
课时168 PHP 5.3以后新增的魔术方法
__invoke()
在对象实例之后,直接像变量函数一样直接调用这个对象,引用后加上()自动调用这个方法.
__callstatic()
跟__call()一样,但是它是用来处理静态方法的.而且自身也必须是静态的.
课时169 自动加载类__autoload()
__autoload()
只要在这个脚本中,需要加载类的时候,就会自动调用这个方法.
<?php
// 一个文件放一个类, 文件名就是类名. 再加二级域名class.
function __autoload($classname){
include strtolower($classname)."class.php";
}
?>
课时170 PHP抽象方法和抽象类1
* 1.什么是抽象方法? * 定义:一个方法如果没有方法体(一个方法,不使用"{}",直接使用分号结束的方法,才是没有方法体的方法),则这个方法就是抽象方法 * * 一.声明一个方法,不实用{},而直接以分号结束 * 二.如果是抽象方法,必须使用abstract(抽象关键字来修饰) * 2.什么是抽象类? * 一.如果一个类中有一个方法是抽象的方法,则这个类就是抽象类 * 二.如果声明一个抽象类,则这个类必须要使用abstract来修饰 * * 注意: * 1.只要使用 abstract 修饰的类,就是抽象类 * 2.抽象类是一种特殊的类,特殊在抽象类中可以有抽象方法 * 3.除了在抽象类中可以有抽象方法以外,和正常的类完全一样 abstract class person { //抽象类 //抽象方法 abstract function say(); }
课时171 PHP抽象方法和抽象类2
* 注意2:
* 1.抽象类不能实例化对象(不能创建出对象)
* 2.如果看见抽象类,就必须写这个类的子类,将抽象类中的抽象方法覆盖(加上方法体).
* 3.子类必须全部实现(覆盖重写)抽象方法,这个子类才能创建对象,如果只实现部分,那么还有抽象方法,那么子类也必须是抽象类
*
* 抽象方法作用: 抽象方法就是一个规定了子类必须有这个方法.子类必须有这个方法的实现,功能交给子类
* 只写出结构,而没有实现,实现交给具体的子类去实现
*
*
* 抽象类的作用:就是要求子类的结构,所以抽象类就是一个规范
abstract class person { //抽象类
//抽象方法
abstract function say();
}
class student extends person {
function say(){
echo "子类实现功能";
}
}
$s = new student();
$s -> say();
结果:
子类实现功能
课时172 PHP面向对象接口技术
<?php
/*
* 抽象类是一种特殊的类,接口是一种特殊的抽象类,所以接口也是一种特殊的类
* 1.抽象类和接口都有抽象方法
* 2.抽象类和接口都不能创建实例对象
* 3.抽象类和接口的使用意义也是作为一种规范
*
* 接口和抽象类相比,特殊在:
* 1.接口中的方法,必须全要是抽象方法
* 所以在接口中的抽象方法不需要使用abstract,直接使用分号结束即可
* 2.接口中的成员属性,必须是常量(不能有变量)
* 3.所有的权限必须是公有的(public)
* 4.声明接口不使用class,而是使用interface
*
*
*
*
*/
class Demo {
}
abstract class Demo2 {
}
interface Demo3 {
const NAME = "sss";
function test();
}
echo Demo3::NAME;
?>
结果:
sss
课时173 PHP接口应用的一些细节
* 接口应用的一些细节:
* 1.可以使用extends让一个接口继承另一个接口 (接口和接口的关系---只有扩展新的抽象方法,没有覆盖关系)
* 2.可以使用一个类来实现接口中的全部方法,也可以使用一个抽象类,实现接口中的部分方法 (类与接口,抽象类与接口---存在覆盖关系)
* 3.类与接口,抽象类与接口就不用使用extends这个关键字,使用implements(实现). implements相当于extends
* extends 继承(扩展),在这个PHP中,一个类只能有一个父类
* 4.一个类可以在继承另一个类的同时,可以使用implements实现一个接口或者多个接口 (一定要先继承再实现,顺序不能变)
* 5.实现多个接口,只需要使用逗号分开多个接口即可
interface Demo3 {
const NAME = "sss";
function test();
}
interface Test extends Demo3 {
function test2();
}
class hello implements Demo3 {
function test(){
}
}
echo Demo3::NAME;
课时174 PHP面象对象的特性多态
课时175 PHP多态的应用实例
<?php
/*
* 多态特性:
* 1.程序扩展准备
* 技术:
* 1.必须有继承关系,父类最好是接口或抽象类
*/
interface USB { //创建接口USB
const WIDTH = 12;
const HEIGHT = 3;
function load();
function run();
function stop();
}
class computer {
function useUSB(USB $usb) { //参数里边类和接口是可以用类名来限制的. 这个方法里只能传这个接口或类的对象.
$usb -> load();
$usb -> run();
$usb -> stop();
}
}
class Mouse implements USB{
function load(){
echo "加载鼠标成功<br>";
}
function run(){
echo "运行鼠标<br>";
}
function stop(){
echo "鼠标拔出<br>";
}
}
class keyPress implements USB {
function load(){
echo "加载键盘<br>";
}
function run(){
echo "运行键盘<br>";
}
function stop(){
echo "停止键盘<br>";
}
}
class worker {
function useing(){
$c = new computer();
$m = new Mouse();
$k = new KeyPress();
$c -> useUSB($k);
$c -> useUSB($m);
}
}
$wk = new worker();
$wk ->useing();
?>
结果:
加载键盘
运行键盘
停止键盘
加载鼠标成功
运行鼠标
鼠标拔出