zoukankan      html  css  js  c++  java
  • 面向对象3

    抽象类:
    什么是抽象类:抽象类可以用来规范一些类的 共同特性 ,但又不需要去对他进行实例化
    就是说抽象类是用来专门做“父类的”,子类会继承它的特性
    形式 :
    abstract class 类名{里面写类的定义}

    抽象方法:抽象方法是一个没有 方法体的方法定义
    形式:
    abstract function 方法名();//注意,这里没有大括号,但是一定要有分号

    抽象类与抽象方法的关系:
    有抽象方法的类一定是一个抽象类,抽象类里面不一定要有抽象方法,但没有抽象方法的抽象类一般意义不大
    子类集成一个抽象类,那么子类必须实现父类抽象类里面的说有抽象方法,除非子类也是一个抽象类
    在子类中实现抽象父类的方法时,访问控制修饰符的范围不能降低,且方法的参数也须一致



    PHP中的重载:
    重载的定义 :
    在一个类中,有多个同名的方法,但每个方法的参数不同,这种现象就成为“重载”。
    参数的不同可以体现为:数量个数不同,类型不同,或者是顺序不同
    PHP中的重载:
    在php中,一个类里面是不可以定义多个同名方法的,这是一个语法错误。
    所以,php中的重载是另一个概念:
    属性重载: 如果使用一个不存在的属性,就会去自动调用类中预先定义好的某个方法以处理数据;
    属性的适用情形:(跟变量一样,只有4种使用情形)
    取值:$v1 = 对象->属性;
    赋值:对象->属性 = ??值;
    判断是否存在:isset(对象->属性);
    销毁:unset(对象->属性);
    属性的重载:(如果某种属性不存在,但在语法中使用如下情形 ,就会发生)
    取值:$v1 = 对象->属性; ======》自动调用类中的__get()方法
    赋值:对象->属性 = ??值; ======》自动调用类中的__set()方法
    判断是否存在:isset(对象->属性); ======》自动调用类中的__isset()方法
    销毁:unset(对象->属性); ======》自动调用类中的__unset()方法
    (使用的前提是类中要预先定义好这些方法)
    方法重载: 如果使用一个不存在的方法,就会去自动调用类中预先定义好的某个方法以处理该行为
    需要定义好的方法“__call”,在这个方法中必须带两个参数
    当使用一个对象(类)调用一个不存在的静态方法的时候,会自动去调用预先定义好的“__callStatic”方法(该方法必须带两个参数)

    __get(),__set(),__isset(),__unset(),__call(),__callstatic();——》这些方法都被成为“魔术方法”


    接口interfacce
    类:有属性,有方法,有类常量
    抽象类:有属性,有方法,有类常量;还可以有抽象方法(只有方法头)
    ‘更’抽象类(就是接口):有接口常量:还可以有抽象方法(只有方法头)

    接口常量:其实是就是常量。
    抽象方法:只有方法头 —— 下级自然就应该去“实现”它。
    接口可以实现多继承,而类不行
    但因为接口中的方法都是抽象的,则下级类就必须:
    1,要么实现该抽象方法(写出其方法体)
    2,要么也声明为抽象方法——等待更下一级的类去实现。

    类和对象的相关知识:
    类的自动加载(类的自动加载是指在外面的页面中,并不需要去“引入“类文件,但是你需要一个类的时候就去动态加载)
    做法一:使用__autoload魔法函数
    当程序需要一个类的时候就去调用__autoload函数,这个函数需要我们自己去定义并在其中写好加载类文件的通用语句
    形式:
    <?php
    //这个函数不是我们程序中区调用
    //而是在“需要类的时候”自动调用
    //而且此时就会传一个实参进来,是所需要的类名
    function __autoload($className){
    require "./library/".$className.".class.php";
    }
    $o1 = new A();
    echo "o1种的a1".$o1->a;
    ?>

    做法二:使用sql_autoload_register函数
    这个函数的作用是:用它“注册”(声明)多个可以用来替代__autoload函数的作用的函数
    用法:
    sql_autoload_regist("函数名1");
    sql_autoload_regist("函数名2");


    <?php
    //注册两个用于自动加载的函数名:
    sql_autoload_register('auto1');
    sql_autoload_register('auto1');
    //分别定义两个函数:
    function auto1($className){
    $file = "./library/".$className.".class.php";
    if(file_exists($file)){
    require "./library/" .$className . ".class.php";
    }
    }
    //这样,如果需要一个类,但当前页面还没有加载该类
    //就会一次调用auto1和auto2,直到找到该类文件并加载
    ?>


    对象的复制(克隆)clone
    克隆的方式有两种:
    浅克隆:
    浅克隆只能克隆对象中的“非对象非资源”数据(克隆不完全),浅克隆是默认的
    深克隆:
    想要实现深克隆(一个对象的所有属性数据彻底复制),就要对该对象类使用魔术方法:__clone()




    对象的遍历:
    对象也能使用foreach语句进行遍历,但需要注意两点:
    1、只能遍历属性
    2、只能遍历看的到的属性(私有属性不能遍历)
    在外面遍历:
    class A{
    public $a1 = 1;
    protected $a2 = 2;
    private $a3 = 3;
    }
    $dx = new A();
    //遍历时,key取得属性名,value取得对应的值
    foreach($dx as $key => $value){
    echo "<br>属性:$key = $value";
    }
    此时de protected和private属性都没有遍历出来
    如果想要全部遍历,则改造为:
    class A{
    public $a1 = 1;
    protected $a2 = 2;
    private $a3 = 3;
    function fetchAllProp(){
    foreach($this as $key=>$value){
    echo "<br>属性:$key = $value";
    }
    }
    }
    $dx = new A;
    $dx->fetchAllProp();






    PHP内置标准类(stdclass)
    在内置标准类的内部没有定义任何属性,但是我们可以使用该类的属性——不存在的属性



    将数据转化成为对象:
    转换基本语法:(目标类型)数据:

    对象转换为对象:没有变化;
    数组转换成为对象:数组的简明当做属性名,值应该对应值;
    通常,如果是数字下标,则其对应属性,并不方便操作。

    null转换成为对象:空对象



    类型约束:
    php是若类型语言,特点是无需为变量指定类型,而且在其后也可以储存任何类型
    但在php较新的语法中,在某些特定场合,针对某些特定类型,也可以进行语法约束
    特定场合:函数(或方法)的形参变量
    特定类型:对象类型(类名),接口类型(接口名),数组类型(array),函数类型(callable)

    与类有关的魔术常量:
    _CLASS_: 获取其所在的类的类名
    _METHOD_: 获取其所在的方法的方法名

    class A{
    function f1(){
    echo_CLASS_; //输出A
    echo_METHOD_; //输出f1
    //注意:get_class()也可以得到类名,但其必须有个对象
    }
    }


    数据(变量)序列化/反序列化
    什么叫做序列化:
    就是将一个变量的数据“转化为”字符串——但并不是类型转换
    其目的(意图)是将该字符串“存储起来”(比如存为文本文件)
    然后在其他时间(或其他运行环境/电脑)上,将其又恢复原样
    序列化的做法:
    1、$str = serialize($变量);//将变量的数据变成字符串,并存入变量$str1;
    但通常的应用,此时就应该将其保存为文件(或数据库),如下:
    2、file_put_contents("文本文件路径",$str);

    反序列化的操作:
    3、$str = file_get_contents(“文本文件路径”); //先从文本文件中取得内容
    4、$v1 = unserialize( $str); //反序列化,此时$v1这个变量中存储的就是原来变量内容


    其他魔术方法
    _sleep()和_wakeup()

    当对一个对象进行“序列化”操作的时候,会自动调用类中的_sleep()方法;
    当“反序列化”一个对象的时候,会自动调用对应类中的_wakeup()方法;

    __sleep()方法中可以进行一些数据(资源)的清理工作,并返回一个数组,该数组可以存储一些想要进行序列化的对象的属性——即可以挑选属性进行序列化。

    __wakeup()方法中,可以在进行反序列化操作的时候进行某些有用的“数据恢复工作”,比如:连接数据


    _tostring()方法
    把一个对象当做一个“字符串”来看待(处理)的时候,会自动调用该魔法方法
    通过该方法,可以返回“合适”的字符串,也可以认为就是对象转换为字符串的结果。如果没有改方法,会出错
    对象不能直接当做字符串使用 :
    class A{
    public $v1 = 1;
    public $v2 = 2;
    function _tostring(){
    //return"这是对象转字符串的结果"
    //不过,通常是这样做的
    return $this->v1 . "," .$this->v2;
    }
    }
    $dx = new A();
    echo "<br>".$dx;


    _invoke()方法
    对象当做一个“方法” (函数)的时候,会自动调用该魔法方法
    比如:
    $v1 = $obj(1,2); //$obj其实是一个对象,这里就相当于将对象当函数用。






    一些有关类和对象的系统函数和运算符
    class_exists(), :判断某个类是否存在(定义过)
    interface_exists(), :判断接口是否存在
    get_class():获取某个对象的“所属类名”
    get_parent_class(), :获取某个对象的“所属父类的类名”
    get_class_methods(), :获取一个类的所有方法,返回一个索引数组,就是这些方法的名字。
    get_class_vars(), :获取一个类的所有属性,返回一个数组,下标为属性名,值为属性值。
    get_declared_classes():获得所有声明过的类(含系统中的类)
    is_object():判断是否对象
    get_object_vars():获得对象的所有属性,返回一个数组,下标为属性名,值为属性值


    面向对象3大思想特征介绍(封装,继承,多态)
    封装:
    就是把数据“封闭”起来,尽量不给别人看到。面向对象的基本语法“类的定义”形式,可以认为是最基本封装——封装了很多数据到某个类(对象)。
    但:
    更严格(更常说)的封装,是尽量将属性做出“私有的”——并通过共有的方法来向外提供对该属性的“可控性操作

    多态:
    多态:看起来用的是相同的东西(方法),但会得到不同的结果。
    通常是指:一个对象可以使用相同的方法(动作)但得到不同的结果:
    (这里是其他常见面向对象语法示例:)
    class A{
    function f1($x ){....做事情1;。。。。}
    function f1($x, $y ){....做事情2;。。。。}
    function f1($x, $y, $z ){....做事情3;。。。。}
    }
    也指:不同的对象使用相同的方法,但得到不同的结果:

  • 相关阅读:
    HDU 4278 Faulty Odometer 8进制转10进制
    hdu 4740 The Donkey of Gui Zhou bfs
    hdu 4739 Zhuge Liang's Mines 随机化
    hdu 4738 Caocao's Bridges tarjan
    Codeforces Gym 100187M M. Heaviside Function two pointer
    codeforces Gym 100187L L. Ministry of Truth 水题
    Codeforces Gym 100187K K. Perpetuum Mobile 构造
    codeforces Gym 100187J J. Deck Shuffling dfs
    codeforces Gym 100187H H. Mysterious Photos 水题
    windows服务名称不是单个单词的如何启动?
  • 原文地址:https://www.cnblogs.com/LQK157/p/9152163.html
Copyright © 2011-2022 走看看