参考文档:http://php.net/manual/zh/language.oop5.php
1、new的几种方式
$obj = new ClassName(); $obj = new ClassName; $obj = new $obj; $className = 'Foo'; $obj = new $className;
2、new self、new static、new parent的区别
等待补充
3、extends – 继承
- PHP不支持多重继承,一个类只能继承一个基类。
- 被继承的方法和属性可以通过用同样的名字重新声明被覆盖。但是如果父类定义方法时使用了 final,则该方法不可被覆盖。可以通过 parent:: 来访问被覆盖的方法或属性。
- 当覆盖方法时,参数必须保持一致否则 PHP 将发出 E_STRICT 级别的错误信息。但构造函数例外,构造函数可在被覆盖时使用不同的参数。
4、::class
自 PHP 5.5 起,关键词 class 也可用于类名的解析。使用 ClassName::class 你可以获取一个字符串,包含了类 ClassName 的完全限定名称。这对使用了 命名空间 的类尤其有用。
5、属性、方法、对象的访问控制及可见性
属性初始化的值必须是常数,这里的常数是指 PHP 脚本在编译阶段时就可以得到其值,而不依赖于运行时的信息才能求值。
Note: 为了兼容性考虑,在 PHP 4 中使用 var 关键字对变量进行定义的方法在 PHP 5 中仍然有效(只是作为 public 关键字的一个别名)。在 PHP 5.1.3 之前的版本,该语法会产生一个 E_STRICT 警告。
6、自动加载
9、抽象类
10、接口类 - interface
11、trait – 特征类
- trait类和继承相比,继承(extends)是纵向扩展,trait是横向扩展(水平扩展);
- 特征类使用use,多个trait类使用,分隔
- 优先顺序是来自当前类的成员 > trait 的方法 > 被继承的方法。
- 使用insteadof 、as来解决使用多个特征类时,存在的冲突方法。例如:
B::smallTalk insteadof A;
B::bigTalk as talk;
- 使用 as 语法还可以用来调整方法的访问控制,例如:
sayHello as private myPrivateHello;
- 了对使用的类施加强制要求,trait 支持抽象方法的使用
- Traits 可以被静态成员静态方法定义,如果 trait 定义了一个属性,那类将不能定义同样名称的属性,否则会产生一个错误。
12、匿名类 - 非常有用
- 字面含义,即没有类名称的类,使用 new class{} 或者 new class(10) extends outClassName
- 参考文档:http://php.net/manual/zh/language.oop5.anonymous.php
13、overloading – 重载
- PHP的重载使用魔术方法来实现,魔术方法包括__set、__get、__unset、__isset、__call、__callstatic。
- 当访问不可见的、未定义的属性和方法,重载的魔术方法会被调用。
- 所有的重载魔术方法都必须被声明为 public,这些魔术方法的参数都不能通过引用传递
14、魔术方法
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo()
- __sleep()和__wakeup(),分别在使用serialize和unserialize时调用。
- __toString():当类被当成字符串使用时调用,例如:echo $obj
- __invoke():当尝试以调用函数的方式调用一个对象时调用。即把对象当成函数处理,$obj = new CallableClass; $obj(5);
- __debugInfo():在打印输出时被调用,例如var_dump();
- __clone():对象复制时使用.
15、后期静态绑定
后期静态绑定的解析会一直到取得一个完全解析了的静态调用为止。另一方面,如果静态调用使用 parent:: 或者 self:: 将转发调用信息。
16、关键字final
- final仅能定义类和方法,不能定义属性。final定义的方法不能被子类覆盖,final定义的类不能被继承。
17、对象的比较
- ==成立的条件:a和b两个对象具有相同的属性和属性值,而且两个对象是同一个类的实例。
- ===成立的条件:a和b两个对象变量一定要指向某个类的同一个实例(同一个对象)
18、类型约束
- 类型可以指定为对象(在函数原型里面指定类的名字)、接口、数组、callable,NULL值,不能使用int、string。
- 类型的约束除了使用在类的方法中,同样可以使用在普通的函数中。
19、对象和引用
20、对象的序列化(serialize)和反序列化(unserialize)
- 对象的序列化仅保存类属性。
- 对象反序列化时,必须确保有该对象的类定义。