前言
最近在系统的学习 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() : 一个对象从字节流中被创建时调用。
感谢你看到了这里。如果文章有错误,请评论指正,谢谢!
