7. 类与对象

2017-06-23  本文已影响6人  57fc17b7d598

基本概念

参考:7.1 类的概念

访问控制

针对对象的属性和方法,可以使用访问控制来限制它的作用域

public:公开的,在类中、实例中、子类中都能访问

protected:受保护的,在类中、子类中可以访问

private:私有的,仅能在类中访问

static:静态的,在哪都能用

类的属性在定义时必须指定访问控制级别,像下面这样:

// 类
class Foobar{
    // 我将报错
    $abc = "123";

    // 我不会报错
    public $test = 456;
}

类的方法如果不指定访问控制级别,那么默认就是 public 公开的。

属性常量

参考:7.2 类的属性

对象继承

参考:7.3 对象继承

自动加载

参考:7.4 类的自动加载

构造和析构

参考:7.5 构造和析构

范围解析操作符

参考:7.6 范围解析操作符

静态属性

一个类的属性和方法可以使用 static 标记为静态的,如没有显示指定访问控制级别,则默认为公开的。

静态成员需要使用 :: 范围解析操作符 来访问。

静态成员可以不用实例化对象而直接访问,但静态属性不能使用实例化对象来访问,而静态方法可以。

抽象类

参考:7.7 抽象类

对象接口

参考:7.8 对象接口

Trait

参考:7.9 Trait

匿名类

参考:7.10 匿名类

重载

参考:7.11 重载

遍历对象

参考:7.12 遍历对象

魔术方法

参考:7.13 魔术方法

Final 关键字

final 关键字可以应用到类或方法上
final 应用在类上时,该类无法被继承
final 应用在方法上时,该方法无法被重写

对象复制

对象的赋值通常是引用的,通过 clone 关键字可获取一个新的拷贝,使用 clone 后, 系统会先执行该对象的 __clone 方法,可以根据需要在该魔术方法中执行一些修改属性的操作。

// 定义类
class Example{
    // 我的属性
    private $foo = 123;
    private $bar = 'abc';
    // clone
    public function __clone(){
        $this->foo = 789;
    }
}
// 实例化
$exam = new Example();
// object(Example)#1 (2) { ["foo":"Example":private]=> int(123) ["bar":"Example":private]=> string(3) "abc" }
var_dump($exam);

// 执行复制
$temp = clone $exam;
// object(Example)#2 (2) { ["foo":"Example":private]=> int(789) ["bar":"Example":private]=> string(3) "abc" }
var_dump($temp);

对象比较

两个对象的属性和值相同,且是同一个类的实例,那么在执行 == 比较时,相等。
两个对象的属性和值相同,且是同一个类的同一个实例,那么在执行 === 比较时,相等。
判断一个对象是否为某一个类的实例,可以使用 instanceof 关键字。

类型约束

函数或类的方法可以对参数进行类型约束,调用时必须传递指定类型的数据,否则报错。

// 定义类
class Example{
    // 给方法的参数增加类型约束
    public static function fn(string $str){
        echo $str;
    }
}
// 给函数的参数增加类型约束
function fun(int $num){
    echo $num;
}
// 调用
Example::fn('hello world');
fun(123);

后期静态绑定

static 不在会被解析成定义当前方法所在的类了,而是根据实际运行时来计算。

当一个类的方法中使用了 static 关键字,那么到时候调用这个方法时,static 的指向并非是当前类,有可能指向其他父类。

static 的指向是上一个 非转发调用 时系统自动保存下来的类,转发调用 指的是 self::parent::static:: 等。

后期静态绑定这个概念通常会出现在继承关系中。

$this 代表的是当前实例

self 代表的是当前类、通常用于调用当前类的静态属性

parent 代表父类

对象的序列化

可以使用 serialize() 将对象进行序列化成字符串,然后将字符串保存,在另外一个脚本中使用 unserialize() 将保存的字符串读取传递进去,重新得到该对象。

需要注意的是,在 unserialize() 之前,记得 include 将类的定义文件引入。

上一篇 下一篇

猜你喜欢

热点阅读