本文是根据慕课网Jason老师的课程进行的PHP面试知识点总结和升华,如有侵权请联系我进行删除,email:guoyugygy@163.com

在上一篇博文中,冷月为大家分享了会话控制的考点,其中 Cookie 和 Session 是其中的重点,对于客户端和服务端中的会话管理,各位小伙伴一定要勤加练习。今天,冷月为大家分享面向对象考点。

回顾真题

请写出 PHP 类权限控制修饰符

答案:

public:公有类型

在类、子类、外部都可以访问

protected:受保护类型

在类、子类可以访问

private:私有类型

只要在子类可以访问

考点分析

本考点主要是考察php中类中的权限控制修饰符,已经面向对象的特性、魔术方法、设计模式等考点

面向对象内容

继承

继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。

在php中类是单一继承,即一个类只能继承一个父类。

方法重写

子类在继承了父类后,可以重写父类的方法,即写一个与父类重名的方法将其覆盖。final修饰的类方法不可被子类重写。也可以使用parent::方法名()来调用父类的方法。

<?php/**
 * Created by 冷月小白.
 * 微信公众号: 学长冷月
 */class Dog{
    public function name()
    {
        echo "i am a dog";
    }}class XiaoHuang extends Dog{
    public function name()
    {
        echo "i am xiaohuang";
    }}$xiaohuang = new XiaoHuang();$xiaohuang->name(); //输出 "i am xiaohuang"

封装

封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。

多态

多态性是指相同的函数或方法可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。

抽象类的定义

任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。

定义为抽象的类不能被实例化。

继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。

<?php/**
 * Created by 冷月小白.
 * 微信公众号: 学长冷月
 */abstract class AbstractClass{
    // 强制要求子类定义这些方法
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);

    // 普通方法(非抽象方法)
    public function printOut() {
        print $this->getValue() . PHP_EOL;
    }}class ConcreteClass1 extends AbstractClass{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }}class ConcreteClass2 extends AbstractClass{
    public function getValue() {
        return "ConcreteClass2";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass2";
    }}$class1 = new ConcreteClass1;$class1->printOut();echo $class1->prefixValue('FOO_') . PHP_EOL;$class2 = new ConcreteClass2;$class2->printOut();echo $class2->prefixValue('FOO_') . PHP_EOL;?>

接口的定义

使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。

接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。

接口中定义的所有方法都必须是公有,这是接口的特性。

要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。

<?php/**
 * Created by 冷月小白.
 * 微信公众号: 学长冷月
 */// 声明一个'iTemplate'接口interface Name{
    public function setName($name,$value);
    public function getName($name);}// 实现接口class myName implements Name{
    private $vars = array();

    public function setName($name, $var)
    {
        $this->vars[$name] = $var;
    }

    public function getName($name)
    {
        return $this->vars[$name];
    }}$my = new myName();$my -> setName('a','b');echo $my -> getName('a'); //b

魔术方法

__construct() 函数

构造函数,在实例化类的时候自动执行

__destruct()函数

析构函数,析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

__call()函数

在对象中调用一个不可访问方法时,__call() 会被调用。

__callStatic()函数

在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。

__get()

读取不可访问属性的值时,__get() 会被调用。

__set()

在给不可访问属性赋值时,__set() 会被调用。

__isset()

当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。

__usset()

当对不可访问属性调用 unset() 时,__unset() 会被调用。

__sleep()

serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,则该方法会优先被调用,然后才执行序列化操作。

__wakeup()

unserialize()会检查是否存在一个__wakeup方法。如果存在,则会先调用 __wakeup方法,预先准备对象数据。

__toString()

__toString() 的具体用途是当一个对象被当作字符串对待的时候,会触发这个魔术方法。

__clone()

当对象被clone时,会触发这个方法

设计模式

工厂模式

单例模式

注册树模式

设配器模式

观察者模式

策略模式

一网打尽

请写出PHP的构造函数和析构函数

答案

<?php/**
 * Created by 冷月小白.
 * 微信公众号: 学长冷月
 */class A{
    public function __construct() //实例化时触发
    {
        echo "我被实例化拉";
    }
    
    public function __destruct() //对象被销毁时触发
    {
        echo "我被撤销啦";
    }}

相关阅读

php面试笔记(1)-php基础知识-变量和引用变量
php面试笔记(2)-php基础知识-常量和数据类型
php面试笔记(3)-php基础知识-运算符
php面试笔记(4)-php基础知识-流程控制
php面试笔记(5)-php基础知识-自定义函数及内部函数考点
php面试笔记(6)-php基础知识-正则表达式考点
php面试笔记(7)-php基础知识-文件及目录处理考点
php面试笔记(9)-php基础知识-面向对象考点
如果这篇博文有帮助到您,可以帮冷月点一个赞或者加一个关注哦!

欢迎关注我的公众号:学长冷月,获得独家整理的学习资源和日常干货推送。
如果您对我的专题内容感兴趣,也可以关注我的博客:guoyu7.com