php-面向对象

OOP概述

  • 对象和类

    对象可以按类进行分类。类是表示彼此之前可能互有不同,但是必须具有一些共同点的对象集合。虽然类所包含的对象可能具有不同属性值,但是,这些对象都具有以相同方式实现的相同操作以及表示相同事物的相同属性

  • 多态性

    多态性是指不同类对同一操作可以有不同的行为和实现。多态性与其说是对象的特性,不如说是行为的特性

  • 继承

    继承允许我们使用子类在类之间创建层次关系。子类将从他的超类(也叫父类)继承属性和操作

类操作

  • 类结构
    一个最小的,最简单的类定义如下:
    class Person
    {
    
    }
    
  • 构造函数
    构造函数的声明与其他操作的声明一样,只是其名称必须是__construct(),在创建一个对象时自动调用
    public function __construct()
    {
        echo "new Person";
    }
    
  • 析构函数
    与构造函数相对的就是析构函数,析构函数允许在销毁一个类之前被调用,一个析构函数名称必须是__destruct(),析构函数不能带有任何参数
    public function __destruct()
    {
        echo "gcc Person";
    }
    
  • 实例化
    使用关键字new来创建一个对象
    $a = new Person();
    

简单类

class Person{
    private $name;
    public function __construct($name){
        $this->name=$name;
        echo "new Person\n";
    }
    public function __destruct(){
        echo "gcc Person\n";
    }
    public function show(){
        echo $this->name;
    }
    public function getName(){
        return $this->name;
    }
    public function setName($name){
        $this->name = $name;
    }
}

继承

  • 要指定一个类成为另一个类的子类,可以使用extends关键字,PHP为单继承
    class B extends A
    {
    
    }
    
  • privateprotected控制可见性
    可以使用privateprotected访问修饰符来控制需要继承的内容。如何一个方法和属性被指定为private,它将不能被继承。如果一个属性或方法被指定为protected,它将在类外部不可见,但是可以继承
    class A{
        public function __construct(){
            $this->fun1();
        }
        private function fun1(){
            echo "fun1\n";
        }
        protected function fun2(){
            echo "fun2\n";
        }
        public function fun3(){
            echo "fun3\n";
        }
    }
    class B extends A{
        public function __construct(){
            $this->fun2();
        }
    }
    $b = new B();
    $b->fun3();
    
    注:方法不修饰默认为public
  • final关键字禁止继承和覆盖
    PHP提供了final关键字,当一个函数声明前面使用这个关键字时,这个歌函数将不能被任何子类覆盖。也可以使用final关键字来禁止一个类被继承。
    final class A{
    
    } 
    

接口

使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
接口中定义的所有方法都必须是公有,这是接口的特性。

interface IA{
    function show();
}
class A implements IA {
    function show(){
        // TODO: Implement show() method.
    }
}

Trait

Trait是PHP一种代码复用机制,在Trait中,一个类可以组合多个Trait,而Trait可以继承其他Trait。Trait是代码重用最佳构建模块。
Trait和接口最大的不同就是:Trait包含了实现,而接口则不需要。

trait TA{
    public function show($name){
        echo "name is $name\n";
    }
}

使用Trait,这需要使用use关键字

class A {
    use TA;
    function speak(){
        $this->show("Tom");
    }
}

注:如果方法名相同,Trait方法会覆盖继承的方法,但当前方法会覆盖Trait的方法

高级功能

  • 类常量
    PHP提供了类级别常量,这个常量可以在不初始化该类的情况下使用。
    class Math{
        const pi = 3.14;
    }
    echo Math::pi;
    
    可以通过::操作符进行访问
  • 静态方法
    PHP允许使用static关键字,可以在未初始化类的情况下调用方法
    class Math{
        static public function add($a,$b){
            return $a+$b;
        }
    }
    echo Math::add(1,2);
    
    注:在一个静态方法中不可以使用this关键字
  • 检查类类型和类型约束
    instanceof关键字允许检查一个对象的类型,它可以检查一个对象是否是特定类的实例,是否继承或实现了某个接口
    $a instanceof A;
    
    PHP还提供了类类型提示功能,可以指定必须传入的参数类类型
    public function add(A $a){
        //...
    }
    
  • 后期静态绑定
    在相同函数有多个实现的继承层级中,可以使用后期静态绑定来确定调用具体类的方法
    class A {
        public static function showClass(){
            echo __CLASS__;
        }
        public static function test(){
            self::showClass();
        }
    }
    class B extends A{
        public static function showClass(){
            echo __CLASS__;
        }
    }
    A::test();
    B::test();
    
    以上代码两次输出为A,使用后期静态绑定可以保证,调用在当前使用的类所提供实现
    public static function test(){
        static::showClass();
    }
    
    static修饰符可以确保PHP使用了运行时调用的类
  • 对象克隆
    对象克隆可以通过clone关键字完成
    $b = clone $a;
    
    将创建对想$a的副本,具有与$a相同的类型与属性值,为浅拷贝
    也可以使用非默认拷贝方法:在类中创建__clone()方法
    class A {
        private $name;
        public function __clone(){
            echo "copy";
            $this->name = self::getName();
        }
        public function getName(){
            return $this->name;
        }
    }
    $a = new A();
    $b= clone $a;
    
  • 反射
    可以通过ReflectionClass实现反射
    $a = new ReflectionClass('A');
    echo $a;
    

命名空间

命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。
PHP 命名空间提供了一种将相关的类、函数和常量组合到一起的途径

虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口、函数和常量。

  • 定义
    创建命名空间可以使用namespace关键字
    <?php
    namespace MyProject;
    
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
    ?>
    
  • 命名空间导入和别名
    通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。
    use MyProject\Connection;
    $con = new Connection();
    
    use MyProject\Connection as Con;
    $con = new Con();
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352