PHP学习笔记

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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值