前言

最近在系统的学习 PHP ,参考的资料是《PHP编程》+ 官方文档(如果你有好的学习资料,欢迎推荐给我)。虽然这本《PHP编程》是基于 PHP5 的,但我笔记里的代码,全部在 PHP 7.2 的环境里测试过,是能够运行的。另,本笔记中只记录我模糊不清的知识。

声明一个类

语法如下:

  1. class classname[ extends baseclass [ implements interfacename, [ interfacename, ...] ] ]
  2. {
  3. [ use traitname, [traitname, ...]];
  4. [ visiblity $property[ = value]; ...]
  5. [ function functionname (args) ]{
  6. //code
  7. }
  8. }

PHP 中的面对对象和 Java 中的面对对象用法基本相似。只是用法更随意。
比如:它可以用一个变量来提供类名:

  1. $class = "Person";
  2. $object = new $class;
  3. // 等同于
  4. $object = new Person;

静态方法通过类来调用,而不是通过对象调用。静态方法由类名加两个冒号(::)和函数名构成。另:在静态方法内部,$this 会失效。

  1. HTML::p("Hello, world");

对象一旦被创建,就会通过引用传递。要像得到一个对象的副本,可以使用 clone 操作符。

  1. $f = new Person("Fred", 35);
  2. $b = clone $f;

final 关键字来声明一个类/方法,子类将无法重写这个类/方法。
在一个对象类的实例中,可以用 self 关键字来调用属性或方法。

声明属性

在 PHP 中,你可以任何位置增加新的属性。

  1. class Person
  2. {
  3. function getName(){
  4. return $this->name;
  5. }
  6. function setName($newName){
  7. $this->name = $newName;
  8. }
  9. }
  10. $person = new Person;
  11. $person->setName("plane");
  12. echo $person->getName(); // plane

声明类常量

使用 const 关键词来声明常量。一旦定义了一个类常量,他的值就不能在改变。

继承

如果一个子类与它的父类具有相同名称的属性或方法,则子类中的属性和方法比父类中的优先级高。引用类的属性会返回之类中的属性值,引用类方法时也会调用子类中的方法。

  1. parent::birthday(); // 调用父类中的 birthday 方法
  2. self::birthday(); // 调用当前类中的 birthday 方法

trait

PHP 5.4 新增特性,它允许在不创建一个父类的情况下,便可以在不同层次结构的类中复用类外部的代码,共享不同类的函数方法。语法如下:

  1. trait traitname [ extends baseclass ]
  2. {
  3. [ use traitname, [ traitname, ... ]];
  4. [ abstract function functionname(); [...] ]
  5. [ visibility $property [ = value ]; ... ]
  6. [ function functionname (args){
  7. //code
  8. }
  9. ]
  10. }

如果引入多个 trait 出现重名的情况,可以在类中定义一个别名。

  1. trait Command
  2. {
  3. function run(){
  4. echo "Executing a command";
  5. }
  6. }
  7. trait Marathon
  8. {
  9. function run(){
  10. echo "Running a marathon";
  11. }
  12. }
  13. class Person
  14. {
  15. use Command, Marathon {
  16. Command::run as runCommand;
  17. Marathon::run insteadof Command;
  18. }
  19. }
  20. $person = new Person;
  21. $person->run(); // "Running a marathon"
  22. $person->runCommand(); // "Executing a command"

构造函数

在创建一个对象是,会自动调用名为 __construct() 的函数。
PHP 并不支持构造函数链的自动调用,也就是说,当实例化子类时,只有子类自己构造函数会被调用,父类的构造函数不会被调用。我们可以显式地调用父类的构造函数:parent::__construct()

析构函数

当一个对象被销毁时,就会自动调用名为 __destruct() 的函数。

自省

自审是一种让程序检查对象特性的机制,可以检查对象的名称、父类、属性和方法等。
class_exists() : 确定一个类是否存在。
method_exists() : 确定函数是否存在。
get_declared_classes() : 返回一个包含所有已定义的类的数组。
get_class_methods() : 得到一个类中只有默认值的属性。
get_class_vars() : 得到一个类中所有方法。
get_object_vars() : 返回对象中只有默认值的属性。
get_parent_class() : 得到一个类的父类名称。
display_classes() : 显示所有当前已声明的类,以及他们的方法和属性。
is_object() : 确定是否为一个对象。

序列化

序列化一个对象是指将一个对象转换成字节流的形式,这样就可以将对象保存在文件中。这对数据的持久化非常有用。PHP 中的序列化几乎时全自动的,除了要调用 serialize()unserialize() 函数外,你几乎不需要做任何额外的工作。
在序列化和反序列化的过程中,PHP 有两个用于对象的钩子( hook ):
__sleep() : 一个对象被序列化之前被调用。
__wakeup() : 一个对象从字节流中被创建时调用。

感谢你看到了这里。如果文章有错误,请评论指正,谢谢!