zoukankan      html  css  js  c++  java
  • PHP笔记(二)

    (一)自动加载

    魔术方法总结
     __construct():构造函数,new一个对象的时候自动调用,为实例化的对象赋初值等操作
     __destruct():析构函数,对象被注销的时候自动调用,可以打印出些东西来


     __get():只要是访问对象的私有属性(无论内外),都会自动调用,传递需要读取的属性名,切记要return回来这个属性名
     __set():只要是修改对象的私有属性(无论内外),都会自动调用,传递需要修改的属性名,切记要return回来这个属性名


     __unset():删除对象的私有属性时自动调用,传入被删除的属性名,在函数里再写一遍unset函数
     __isset():使用isset检测对象的私有属性时自动调用 ,传递被检测的属性名。返回isset属性名


     __toString():使用echo打印对象的时候,自动调用。显示想要现实的内容,一般写个定界符的变量。注意返回字符串
     __call():当调用未公开的(即私有的不存在)的函数时,自动调用,传入 被调用函数的名,和一个数组,里面放的参数列表
     __clone():使用clone克隆对象时,并可以对新克隆出来的对象赋初值。
     __sleep():对象串行化时,自动调用。返回一个数组,数组元素就是我们需要串行化的属性
     __wakeup():对象反串行化时,自动调用。对反串行化的属性赋初值。
     __autoload():最重要的。在类的外部调用,而且当调用不在本文档中的类时,会自动导入对应的类文件

     1.自动加载
     function __autoload($className){
    include strtolower($className).".class.php";
    }
     注意
     这个会在实例化一个对象的时候,如果用到的类不在当前文件,那就会自动调用这个函数。如果存在了,就不会调用这个函数。
     这个导入对于同一个类文件只会导入一次,导入一次之后,类就已经拷贝过来了,相当于在类中了,再实例化,就不调用他了
     切记,以后 类文件 都写入到一个专门的文件夹中,而且格式必须同一,完全小写,特别是类名,必须小写,别忘了
     include strtolower($className).".class.php"; 注意格式,2个点一定不能忘了
     这个在实例化时,会自动将不存在的类名宁当作参数传给 __autoload();然后我们把他strtolower转小写,拼串


     2.对象的序列化与反序列化。也叫 串行化和反串行化
     serialize串行化;unserialize反串行化
     $str=serialize($lisi); 他就是把对象转换成 一溜 字符串的形式 ,这样就可以用echo打印了
    echo $str."<br/>";
    $str1=unserialize($str); 将已经序列化的对象使用反序列化函数转变回来,又成为了一个对象了。
     var_dump($str1);


     使用串行化的情况
     对象数据需要在网络中传输的时候;
     对象数据需要写在文件中,在数据库中长期保存对象数据。


     3. __sleep
     当执行对象串行化的时候,也就是调用serialize函数的时候。会自动执行__sleep函数,而且他需要返回一个数组
     数组里写了哪些成员属性,那些成员属性就可以串行化。注意,当数组里不写属性,就是所有属性都不串行化。如果不写
     __sleep函数就是默认所有的属性都串行化。


     4. __wakeup
     当执行对象反串行化的时候,也就是调用unserialize函数的时候。会自动执行__weekup函数,他可以为反串行化
     的属性重新赋值
     function __wakeup(){
    $this->name="王文彦";
    }
     $b=unserialize($a);
    echo $b->name; 这个就打印出 王文彦来了


     5.类型约束
     指在变量前加上数据类型,用于强制约束此变量的类型,使这个变量只能接收这种类型的数据,其他类型无法接收
     function func(array $a){
    var_dump($a);
    }
    func(["aaa",1]);
    注意:只有 数组和对象才能进行类型约束,其他的 Number、String等在PHP中是不行的,其他强语言可以

    function func(array $a){
    echo $a->name;
    }
    func(new Student("桑桑",15,"女生"));
     注意,如果是类的话,只能 是对应的类和这个类的子类
     注意:在PHP中,数据约束只用在 函数形参 中,其他地方是不能使用的,会报错。
     new Student();这是直接创建了一个 匿名对象,就是没赋给变量而已,存在,但是咱不好找

    (二)抽象类

     对象串行化
     1. clone和__clone
     引用数据类型,传递的是地址,所以改一个,另一个也变。
     但是通过clone将一个对象完全克隆出另一个对象,这两个对象是独立的,互不干扰的。
     $lisi= clone $zhangsan; 当外部对象使用clone关键字的时候,会自动调用__clone魔术方法。
     __clone函数,类似于克隆时调用了一遍构造函数,可以给新的克隆的对象的属性赋新值,不写,就是赋的原来被克隆对象的值
     __clone函数里的$this指的是当前,新的对象

     2. __toString函数
     echo $lisi;当使用echo等输出语句,打印对象的时候,就会自动调用__toString函数,并打印出这个函数内return回来的东西。
     3. __call函数
     $zhangsan->say1(1,2,3); 当调用未定义的函数、或者私有的函数时,会自动调用这个魔术函数
     function __call($name,$canshu){
    echo "您调用的函数未定义";
    var_dump($name); //直接打印出第一个形参
    var_dump($canshu); //直接打印出第二个形参
    } 第一个参数 是我们调用的函数的名,第二个参数是数组,是我们我们调用此方法是传的参数

    (三)接口

    【抽象类】
     1.什么是接口?
     接口是一种规范,提供了一组实现接口的类所必须实现的方法组合,
     接口使用interface关键字声明;

     interface Inter{}

     2.接口中的所有方法,必须都是抽象方法。
     接口中的抽象方法不需要也不能使用abstract修饰

     3.接口中不能声明变量,不能有属性,只能使用常量!!!
     const NUM = 10;

     4.接口可以继承接口,使用extends关键字!
    接口使用extends继承接口,也不能实现多承。
     interface int1 extends Inter{}

     5.类可以实现接口,使用implement关键字!
     类使用implement实现接口,可同时实现多个接口,多个接口间使用逗号分隔;
     class Person implements Inter,inter2{}

     一个类实现一个或多个接口,那么这个类必须实现所有接口中的所有抽象方法!除非,这个类是抽象类

     【接口与抽象类区别】
     1、声明方式上,接口使用interface关键字,抽象类使用abstract class
     2、实现/继承方式上,一个类使用extends继承抽象类,使用implement实现接口
     3、抽象类只能单继承,接口可以多继承(接口extends接口)多实现(类implement接口);
     4、抽象类中可以有非抽象方法,接口中只能有抽象方法,不能有非抽象方法;
     抽象类中的抽象方法必须使用abstract关键字修饰,接口中抽象方法不能带修饰词;
     5、抽象类是个类,可以有属性、变量;接口中只能有常量

    (四)多态

    【多态】
     1、一个类,被多个子类继承。如果,这个类的某个方法,在多个子类中,表现出不同的功能,我们称这种行为为多态

     2、实现多态的必要途径
     ①子类继承父类;
     ②子类重写父类方法;
     ③父类引用指向子类对象;

  • 相关阅读:
    【海洋女神原创】安装导论谨以此文与那些徘徊在安装的大门外,并且被花哨的功能所迷惑的朋友们共勉。
    【海洋女神原创】Installshield脚本拷贝文件常见问题汇总
    Installshield获取安装包版本的系统变量是IFX_PRODUCT_VERSION
    Installshield 64位操作系统下拷贝文件,如何重定向到32位的系统文件夹下
    【海洋女神原创】installshield 32位打包和64位打包的注意事项
    Installshield关于.NET安装时需要重启动的处理办法,以及延伸出的重启后继续安装的安装包的一点想法
    【海洋女神原创】一个简单的带序列号输入的安装包
    How to:installshield安装包怎样才能出现选择路径的界面?
    Excel连接字符串在.NET中的应用
    将Excel的数据导入DataGridView中[原创]
  • 原文地址:https://www.cnblogs.com/lieyancjj/p/6986868.html
Copyright © 2011-2022 走看看