1.PHP模拟HTTP请求
动作
- 连接apache服务器(fsockopen)
- 写入HTTP协议(fwrite)
- 接受返回的数据
- 解析数据(fgets fgetc)
2.魔术方法
定义: 系统已经定义好,但是需要用户在类里面显示的写出来才会被执行的方法。一旦定义了魔术方法,那么在某些特定的情况下会自动触发。
class Person{
public $name;
public $age;
function __construct($name,$age){
$this->name=$name;
$this0>age=$age;
}
function __destruct(){
//脚本执行结束析构自动执行
//可以使用unset($person)
}
/**
*对象转字符串方法
*只能返回字符串类型的数据
*echo对象输出时调用
*/
public function __toString()
{
return (string)($this->name.':'.$this->age);
}
/**
*对象克隆
* 开辟一块空间,复制该对象
* $this代表被克隆出来的对象
*/
public function __clone()
{
}
}
$person=new Person('hxh',18);
//unset($person);
3.魔术函数
__autoload.php
class Loader{
static function autoload($class){
require BASEDIR.'/'.str_replace('\\','/',$class).'.php';
}
}
self 与 $this的区别
- self代表类,$this代表对象
- self访问类常量,$this访问属性和方法
- self使用范围解析操作符 : : :: ::,$this使用对象访问符 → \rightarrow →
静态与非静态的区别
- 静态是给类使用,非静态是给对象使用
- 类可以访问普通方法,不能访问普通属性(类只负责结构不负责存储,并没有初始化)
- 对象可以访问静态方法,不能访问静态属性
class Person{
//普通属性
public $name; //name并没有进行初始化
private $age;
//静态属性
public static $count = 0;
public function __construct($name,$age){
//初始化
$this->name = $name;
$this->age = $age;
//计数器
self::$count++;
}
//定义一个方法,来获取对象数量
public static function getCount(){
//返回当前计数器的值
return self::$count;
}
//普通方法
public function setAge($age){
$this->age = $age;
}
//普通方法
public function test(){
echo 'hello world';
}
}
$person = new Person('hxh',123);
$person->test(); //可以
$person->serAge(18); // 可以
//类访问非静态属性和方法
Person::$count; //可以,因为$count是静态属性,就在代码区中
//Person::$name; //不可以,$name是普通属性,存在在堆里,类找不到
//类访问方法
Person::test(); //可以,但是因为test方法不是静态方法,本身不是为类存在的,所以会有一个类似警告的提示
Person::setAge(20); //不可以
堆区保存对象,栈区指向对象
接口与抽象类区别
- 接口不能有静态属性和非静态属性
- 接口中不能有方法体,必须是抽象方法、
- 接口中的方法必须使用public修饰()
- 接口内容只能是常量+公有的抽象方法
对象的保存:序列化和反序列化
$serialize_obj=serialize($this);
unserialize($serialize_obj);
反序列化过程:
- 去代码区找对应的类文件,如果没找到就归属到_PHP_Incomplete_class类下
- 通过找到的类创建一个对象,将类中的所有的属性都在对象空间中生成一次
- 将保存的对象里的属性进行覆盖操作
- 得到的结果就是新对象+旧数据
两个魔术方法
- __sleep:当对象被使用序列化当作文件保存时自动触发的方法
- __wakeup:当对象使用反序列化得到对象的饿时候会自动触发
<?php
/**
* Created by IntelliJ IDEA.
* User: 何晓宏
* Date: 2018/10/15
* Time: 1:17
*/
class DB{
private $host;
private $port;
private $user;
private $password;
private $dbname;
private $charset;
private $prefix;
/**
* DB constructor.
* @param array $arr,默认为空,一个关联数组里面有七个元素
*/
public function __construct($arr=array()){
$this->host=isset($arr['host'])?$arr['host']:'localhost';
$this->port=isset($arr['port'])?$arr['port']:'3306';
$this->user=isset($arr['user'])?$arr['user']:'root';
$this->password=isset($arr['password'])?$arr['password']:'';
$this->dbname=isset($arr['dbname'])?$arr['dbname']:'mydatabase';
$this->charset=isset($arr['charset'])?$arr['charset']:'utf8';
$this->connect();
$this->setCharset();
$this->setDbname();
}
/**
*数据库的连接
*/
private function connect(){
$this->link=mysql_connect() or die('连接失败');
}
/**
*设置字符集
*/
private function setCharset(){
$this->mysql_query("set names {$this->charset}");
}
/**
*选择数据库
*/
private function setDbname(){
$this->mysql_query("use {$this->dbname}");
}
/**魔术方法__sleep
* 当对象被当作文件保存时自动触发的方法
* 返回需要返回的对象数据的数组
* @return array
*/
public function __sleep()
{
return array('host','port','user','password','dbname','charset');
}
/**魔术方法__wakeup资源初始化
* 当对象使用反序列化得到对象的饿时候会自动触发
*/
public function __wakeup()
{
$this->connect();
$this->setDbname();
$this->setCharset();
}
}