PHP 面向对象编程 - 常见的关键字

1. final 关键字;

  • 在PHP5中新增加了 final 关键字,它只能用来修饰类和方法。不能使用 final 这个关键字来修饰成员属性。
  • final 的特性:
    • 使用 final 关键字标识的类不能被继承
    • 使用 final 关键字标识的方法不能被子类覆盖(重写),是最终版本
  • 目的:一是为了安全,二是没必要被继承或重写
  • 实例:demo.class.php
<?php

// final关键字修饰的类,是最终的类不能被继承

final class demo{

    // final关键字修饰的成员方法,是最终版本的方法不能被重写
   final public function say(){
        echo "demo say";
    }
    
}


class demo1 extends demo{

    public function say(){
        echo "demo1 say";
    }
}

// $d1 = new demo1();	// 报错
// $d1 -> say();		// 报错

2. static 关键字;

  • static 关键字表示静态的意思,用于修饰类的成员属性和成员方法(即静态属性和静态方法)。
  • 类中的静态属性和方法不用实例化对象(new)就可以直接使用类名访问。
# 格式
类::$静态属性
类::静态方法
  • 在类的方法中,不能用 $this 来引用静态变量或静态方法,而需要用 self 来引用。
# 格式
self::$静态属性
self::静态方法
  • 静态方法中不可以使用非静态的内容。就是不让使用 $this。
    • $this 代表本对象,而对象实例化出来是放在动态内存中,所以说它是非静态的内容,在静态方法中是不可以使用的
  • 静态属性是共享的。也就是 new 很多对象,很多对象都可以访问这个静态属性。
    • 在 PHP 核心语法中,声明自定义函数的时候,可以定义静态的变量,这个变量也是共享的。
    • 其中静态变量有一个很大的特性就是”只能初始化一次“。
  • 实例:demo.class.php
<?php

class demo{

    // static 如果修饰成员属性,这个成员属性就是静态的成员属性
    static public $name = "zhangsan";
    static public $num = 0;     // 静态的成员属性只能初始化一次。所有实例化的对象访问的都是同一个静态成员属性

    public function __construct(){
        self::$num++;
    }


    // static 如果修饰成员方法。这个方法就是静态的成员方法
    static public function say(){
        // self 代表本类
        return self::$name;     // 在类的内部访问静态成员属性  self::成员属性名
    }
}

echo demo::$name;       // 在类的外部访问静态的成员属性。类名::成员属性名
echo demo::say();       // 在类的外部访问静态的成员方法。类名::成员方法名

$d1 = new demo();
echo "<br />";
echo demo::$num;	// 输出1
$d2 = new demo();
echo "<br />";
echo demo::$num;	// 输出2

3. 单例设计模式;

  • 单例模式的主要作用是保证在面向对象编程设计中,一个类只能有一个实例对象存在。
  • 实例:db.class.php
# 用静态成员属性和静态成员方法实现单例设计模式(只能有一个对象)
# 注释操作步骤

# 让类不能外部实例化,把构造方法设置成私有(private)
# 声明一个静态(static)的 getObj() 的方法,它可以不需要对象就可以从类的外部访问。
# 声明这个方法的目的就是为了得到对象,怎么得到呢,new DB()。

# 接下去 var_dump(DB::getObj()),你会发现一样实例化成功了,构造方法已经执行,打印出了一个对象
# 然而再 var_dump(DB::getObj()),构造方法又运行了一次,证明了还是实例化了两次,不符合需求。

# 说明实例化的过程要有选择的实例化,用 if 来控制一下。
# 判断一下没有实例化的时候,就实例化一次,如果已经实例化,就直接返回实例化的结果。

# 设置一个静态(static)的成员属性 $obj = null
# 在 getObj() 里判断静态的成员属性($obj)为空的话,就实例化结果(new DB()),并赋给静态成员属性 $obj
# 因为静态属性只能初始化一次这个特性,第二次再调用 getObj() 的时候,$obj 的值就已经是对象了,对象直接返回就行。
# 此时会发现构造方法就只执行了一次,返回对象两次。
# 证明了不管调用多少次,实例化的过程只有一次,保证这个程序只有一个对象产生,这就是单例设计模式。

<?php

class DB{

    static $obj = null;     // 声明一个变量的成员属性。主要用静态成员属性只能初始化一次的特性,把它作为标识

    // 用于链接数据库
    private function __construct(){
        echo "mysql linked....";
    }

    // 静态的成员方法可以不需要对象就可以直接访问。这个方法用于得到对象
    static function getObj(){
        // 判断静态成员属性是否是初始值
        if(is_null(self::$obj)){
            // 如果是初始值。就实例化对象
            self::$obj =  new self(); 	// 把对象赋值给静态的成员属性
        }
        
        // 把静态成员属性中的对象返回
        return self::$obj;
    }

    public function select(){
        echo "select data....";
    }
}

var_dump(DB::getObj());
var_dump(DB::getObj());
var_dump(DB::getObj());

4. const 关键字;

  • const 是一个在类中定义常量的关键字,我们都知道在 PHP 中定义常量使用的是 define() 这个函数,但是在类里面定义常量使用的是 const 这个关键字
# 语法
# 不需要实例化对象即可获取

const CONSTANT = ‘constant value’; 	//定义
echo self::CONSTANT;				//类内部访问
echo className::CONSTANT; 			//类外部访问

  • 实例:demo.class.php
<?php

class demo{

    // 常量定义时就要赋初始值
    // 常量一但定义就不能修改
    // 如果是多个单词组成的常量名要用下划线分隔
    const HOST = '127.0.0.1';
    const DB_NAME = 'test';

    public function getConst(){
    
        // 在类的内部访问常量 self::常量名
        return self::DB_NAME;
    }
}


//在类的外部访问常量 类名::常量名
echo demo::HOST;
echo "<hr />";
$demo = new demo();
echo $demo -> getConst();

5. instanceof 关键字。

  • Instanceof 关键字用于检测用于检测当前对象实例是否属于某一个类或这个类的子类
  • 实例:demo.class.php
<?php

class demo{

}


class demo1 extends demo{

}


$demo = new demo();
$demo1 = new demo1();

// instanceof 可以用于判断一个对象是否由一个类或这个类子类实例化来的
var_dump($demo instanceof demo);
var_dump($demo1 instanceof demo1);
var_dump($demo instanceof demo1);
var_dump($demo1 instanceof demo);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值