7. 类与对象

基本概念

参考: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 将类的定义文件引入。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,923评论 18 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,145评论 6 13
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,765评论 18 399
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,141评论 0 62
  • 最近迟到次数却越来越多了,每次迟到心里也都会不好意思,回到办公室说今天早上娃娃又不愿早起之类的,同事说,小孩子都起...
    二解阅读 545评论 1 1