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