飞机的 PHP 学习笔记六:面对对象

前言

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

声明一个类

语法如下:

class classname[ extends baseclass [ implements interfacename, [ interfacename, ...] ] ]
{
    [ use traitname, [traitname, ...]];
    [ visiblity $property[ = value]; ...]
    [ function functionname (args) ]{
        //code
    }
}

PHP 中的面对对象和 Java 中的面对对象用法基本相似。只是用法更随意。

比如:它可以用一个变量来提供类名:

$class = "Person";
$object = new $class;
// 等同于
$object = new Person;

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

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

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

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

final 关键字来声明一个类/方法,子类将无法重写这个类/方法。

在一个对象类的实例中,可以用 self 关键字来调用属性或方法。

声明属性

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

class Person
{
    function getName(){
        return $this->name;
    }
    function  setName($newName){
        $this->name = $newName;
    }
}
$person = new Person;
$person->setName("plane");
echo $person->getName(); // plane

声明类常量

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

继承

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

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

trait

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

trait traitname [ extends baseclass ]
{
    [ use traitname, [ traitname, ... ]];
    [ abstract function functionname(); [...] ]
    [ visibility $property [ = value ]; ... ]
    [ function functionname (args){
        //code
        } 
    ]
}

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

trait Command
{
  function run(){
    echo "Executing a command";
  }
}

trait Marathon
{
  function run(){
    echo "Running a marathon";
  }
}

class Person
{
  use Command, Marathon {
    Command::run as runCommand;
    Marathon::run insteadof Command;
  }
}

$person = new Person;
$person->run(); // "Running a marathon"
$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() : 一个对象从字节流中被创建时调用。

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

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!