欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

高级OOP特性(6)

程序员文章站 2022-03-30 14:49:59
PHP不支持的高级OPP特性 对象克隆 克隆实例 __clone()方法 继承 类继承 继承和构造函数 继承与延迟静态绑定 接口 实现一个接口 实现多个接口 抽象类 命名空间介绍 ......

PHP不支持的高级OPP特性

 PHP不支持通过函数重载实现多态

PHP不支持多重继承

PHP不支持根据所修改数据类型为操作符赋予新的含义

对象克隆

  • 克隆实例

 在对象前面添加clone关键字来克隆对象,对象的属性值都被继承,克隆的对象还可以重新为原对象赋值

class xiu {
    private $name;
    //为$name定义一个设置方法和获取方法
    function getName(){
        return $this -> name;
    }
    function setName($name){
        $this -> name = $name;
    }
}
$xiu = new xiu();
$xiu -> setName("user");
//用clone克隆$xiu对象
$xiu2 = clone $xiu;
$xiu2 -> setName("kang");
echo $xiu -> getName();//输出user
echo $xiu2 -> getName();//输出kang
  • __clone()方法

 __clone()方法在克隆操作其中执行

class xiu {
    private $name;
    //为$name定义一个设置方法和获取方法
    function getName(){
        return $this -> name;
    }
    function setName($name){
        $this -> name = $name;
    }
    function __clone() {
        $this -> name = "sear";
    }
}
$xiu = new xiu();
$xiu -> setName("user");
//用clone克隆$xiu对象
$xiu2 = clone $xiu;
echo $xiu -> getName();//输出user
echo $xiu2 -> getName();//输出sear

继承

  • 类继承

 类继承通过关键字extends实现

下面的列子是kang类继承xiu类,所以kang类的对象具有xiu类的所有成员和方法

<?php
    class xiu {
        private $name;
        function setName($name) {
            $this -> name = $name;
        }
        function getName(){
            return $this -> name;
        }
    }
    class kang extends xiu {
        function getKang() {
            echo "kang方法";
        }
    }
    $kang = new kang();
    $kang -> setName("修抗");
    echo $kang -> getName();//输出修抗
    $kang -> getKang();//输出kang方法
?>

下面的列子是kang类继承了xiu类,ceo类继承了kang类

所以knag对象拥有xiu类的成员和方法,而ceo对象拥有kang类和xiu类的成员和方法

<?php
    class xiu {}
    class kang extends xiu {}
    class ceo extends kang {}
?>
  • 继承和构造函数

 如果父类有构造函数,而子类没有构造函数,那么子类实例化的时候会执行父类的构造函数

<?php
    class xiu {
        function __construct(){
            echo "执行父类构造函数";
        }
    }
    class kang extends xiu {

    }
    $kang = new kang();//输出"执行父类构造函数"
?>

但如果子类也有构造函数,那不管父类有没有构造函数,只会执行子类的构造函数

<?php
    class xiu {
        function __construct(){
            echo "执行父类构造函数";
        }
    }
    class kang extends xiu {
        function __construct(){
            echo "执行子类构造函数";
        }
    }
    $kang = new kang();//输出"执行子类构造函数"
?>

同时执行父类和子类的构造函数,需要添加 parent::__construct()(如果父类没有构造函数就会去找祖类)

<?php
    class xiu {
        function __construct(){
            echo "执行父类构造函数";
        }
    }
    class kang extends xiu {
        function __construct(){
            parent::__construct();
            echo "执行子类构造函数";
        }
    }
    $kang = new kang();//输出"执行父类构造函数执行子类构造函数"
?>

假设创建新的ceo对象时,需要xiu类和kang类的构造函数都在执行,此时就可以在ceo的构造函数中显式的引用这些函数

class ceo extends kang {
    function __construct(){
        xiu::__construct();
        kang::__construct();
    }
}
  • 继承与延迟静态绑定

self关键词会在编译时而非运行时确定其作用域(运行后编译)

<?php
    class xiu {
         static $name = "xiu";
         static function getName(){
            echo self::$name;
        }
    }
    class kang extends xiu {
         static $name = "kang";
    }
    echo kang::getName();//输出"xiu"
?>

接口

  • 实现一个接口

使用interface关键字创建接口

接口的属性必须是常量

接口的方法必须是public,且不能有函数体

使用implements关键字实现接口类

类必须实现接口中的所有方法

interface xiu{
    const brand = 'siemens';
    public function connect();
}
class kang implements xiu{
    public function connect(){
        echo self::brand;
    }
}
  • 实现多个接口

类可以同时实现多个接口

interface xiu{
    public function connect();
}
interface kang{
    public function contact();
}
class sear implements xiu,kang{
    public function connect(){}
    public function contact(){}
}

抽象类

 抽象类是不能实例化的类,只能被其他类继承

抽象类定义的所有方法都必须在子类实现

abstract class xiu {
    public $name;
    abstract public function kang();
}
class sear extends xiu{
    function kang(){}
}