zoukankan      html  css  js  c++  java
  • 4月28 继承 ,多态,重载,克隆

    复习类和对象
    类:由众多对象抽象出来的
    对象:通过类实例化出来的
    <?php
    class Info
    {
    public $code;
    protected $name;
    private $sex;
    function __construct($s)
    {
    $this->sex =$s;
    }
    function Say()
    {
    echo "hello";
    }
    function SetSex()
    {
    return $this->sex;
    }
    function GetSex($s)
    {
    $this->sex =$s;
    }
    function __set($a,$n)
    {
    $this->$a =$n;
    }
    function __get($a)
    {
    return $this->$a;
    }
    }


    //实例化对象
    $r =new Info("男");
    $r->code ="join";
    $r->Say();
    //$r->sex; //报错的,因为是面向类的
    var_dump($r);

     ?>

      继承
    相对于父与子的关系,可以联想到人
    概念:如果有一个子类那么该子类会继承父类的一切东西 (私有成员访问不到)
    做法:要求有父类和子类

    在定义子类的时候需要加一个关键字:extends
    特点:单继承,一个子类只能有一个父类, 联想到人:儿子只能有一个父亲,但是父亲可以有多个儿子
    如果父类中有构造函数,子类在实例化的时候按照父类的构造函数的标准来实例化
    parent 代表弗雷,只能在子类中使用,集成的是info,写info也是可以的,但最好不要写不利于维护
    final:用来修饰类的,代表该类是一个最终类,该类无法被继承 ,使用时写在父类上面的

    <?php
    //final class Info
    class Info
    {
    public $code;
    protected $name;
    private $sex;
    function __construct($s)
    {
    $this->sex =$s;
    }
    function Say()
    {
    echo "hello";
    }
    }
    class Test extends Info
    {
    public $birthday;
    function Run()
    {
    echo "running man";
    }
    function Say()
    {
    parent::Say();//父类的也会被调用的
    echo "你好"; //直接输出时会被覆盖
    }
    }
    $t = new Test("男");
    $t->code = "p001";
    //echo $t->sex;//报错了,访问不到
    //$t->Run(); //父类中没有的新方法的输出
    $t->Say(); //父类中有的方法的输出,不过父类的被覆盖了
    var_dump($t);

    ?>

    静态成员
    普通成员是体现在对象上的
    类里面的普通成员是属于对象的,不属于类的(调用的时候是用对象调用)
    什么叫做静态的:静态的成员是属于类,不是属于每个对象的
    static关键字定义静态的,定义静态成员使用static关键字
    静态方法里面不能调用普通成员,不能用$this,而是用self
    静态方法可以调用静态成员但是要使用self关键字
    self代表该类,$this 代表该对象

    <?php
    class Info
    {
    public static $class; //static 静态的
    public $code;
    protected $name;
    private $sex;
    static function Test() //调用静态方法
    {
    echo Info::$class; //调用自身类里面的静态成员
    echo "静态方法";
    }
    function __construct($s)
    {
    $this->sex =$s;
    }
    function Say()
    {
    echo Info::$class; //普通方法里面可以调用静态成员
    echo "hello";
    }
    }
    $r =new Info("男");
    echo Info::$class ="0305"; //访问静态成员
    echo Info::Test(); //静态里面不可以调用普通成员
    $r->Say();

    //也就是说:静态里面不可以调用普通的,普通方法里面可以调用静态的,静态方法里面可以调用静态成员

    ?>

    多态:

    多态的概念:当父类引用指向子类实例的时候,由于子类对父类函数进行了重写,导致我们在使用该引用去调用相应的方法表现出的不同

    条件:1.必须有继承
    2.父类的引用指向子类的实例
    3.子类必须要对父类的方法进行重写

    <?php
    class Ren
    {
    public $name;
    public $sex;
    function Say()
    {
    echo "hello";
    }
    }
    class China extends Ren
    {
    function Say()
    {
    echo "你好";
    }
    }
    class America extends Ren
    {
    {
    echo "hi";
    }
    }

    $r = new Ren(); // $r代表Ren类的引用
    $r1 = new China(); //$r1代表China类的引用

    $r2 =new America();//$r2代表America类的引用

    $r->Say(); //hello
    $r1->Say(); //你好

    $r2->Say();//输出hi


    ?>

    在c#中Ren $r =new Ren();以后用到的所有的$r时就是Ren的类型的,以后的赋值都没有任何的作用
    Ren $r = new China();c#中也是可以的,是引用$r指向China的子类
    再比如:Ren $r = new America();会像上输出America类里面的一些方法

    函数的重载:
    关于重载,一般出现在强类型语言中,弱类型语言中不存在,因此这里只是知道有这样的定义,会出现在一些面试的场合。所以条件概念都是必记得内容

    假如在php中有重载时:所有以下都是假设存在的
    <?php
    class Ren
    {
    public $name;
    public $sex;
    function Say()
    {
    echo "hello";
    }
    function Say($a)
    {
    echo $a."hello";
    }
    function Say($a,$b)
    {
    echo $a.$b."hello";
    }
    }
    $r = new Ren();
    $r->Say(); //会根据里面写的参数的个数输出的内容不同

    ?>
    重载实现的条件:1)函数名必须相同(方法名)
    2)在函数里面的参数的个数不同(方法名相同的基础上)
    3)如果参数的个数相同时,类型不同
    eg:function Say(int,$a) 和 function Say(string,$b)
    php是弱类型语言所以没有重载:首先php什么类型都可以存储因此类型不同的条件不能满足,
    php里面有可变参数的函数,因此参数个数不同这一块很难实现

    __tostring()方法的不同于c#中的,在c#中是转换成字符串类型

    <?php
    class Ren
    {
    public $name;
    public $sex;
    function Say()
    {
    echo "hello";
    }
    function __tostring()
    {
    return "这个对象变量包含name和sex,和一个say方法";
    }
    }

    $r =new Ren(); //__tostring用法的输出
    echo $r;
    ?>

    对象的克隆:

    <?php

    class Ren
    {
    public $name;
    public $sex;

    function Say()
    {
    echo "hello";
    }

    function __clone() //对象克隆的时候自动执行
    {
    $this->name="李四"; //$this指复本(克隆出来的新对象)
    }
    }

    $r =new Ren();
    $r->name = "张三";
    $r1=clone $r;
    echo $r->name;
    echo $r1->name;
    var_dump($r1);
    ?>
    克隆对象相当于复制一份交给$r1,在function方法中$this是指新克隆出来的对象

  • 相关阅读:
    南阳oj 814 又见拦截导弹
    南阳 zb的生日和邮票分你一般(01背包思路)
    导弹拦截(最长下降子序列)变形
    控件绝对定位函数
    小玩意
    java获取本机所有可用字体
    按键监听类KeyListener及适配器改良方案
    编译php-memcached扩展
    Memcached安装,启动,连接
    Apache配置虚拟主机
  • 原文地址:https://www.cnblogs.com/Duriyya/p/5443176.html
Copyright © 2011-2022 走看看