PHP面试题精讲 — 面向对象类

Posted 小雨同学的服务器果然有问题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP面试题精讲 — 面向对象类相关的知识,希望对你有一定的参考价值。

日拱一卒无有尽,功不唐捐终入海 💋

一、常见题型

1. 面向对象的特点是什么?

  • 封装
  • 继承
  • 多态

2. private protected public 的区别?

  • private : 私有成员, 在类的内部访问。
  • protected : 保护成员,该类内部和继承类中访问。
  • public : 公共成员,没有访问限制。

3. 抽象类和接口的区别?

  • 抽象类(abstract)要继承(extends),只能继承一个
  • 接口(interface)要实现(implements),可以实现多个,必须实现全部方法

4. php如何实现多继承?

PHP原生支持多继承,但是可以通过trait实现。


trait traitXiaoyuOne{
    public function test(){
        echo "This is trait one <br/>";
    }
    public function testOne(){
        echo "one <br/>";
    }
}
 
trait traitXiaoyuTwo{
    public function testTwo(){
        echo "two <br/>";
    }
}
 
class basicTest{
    public function test(){
        echo "hello world\\n";
    }
}
class myCodeextends basicTest{
    use traitXiaoyuOne,traitXiaoyuTwo;
}
 
$test =new mycode();
$test->test();
$test->testOne();
$test->testTwo();

二、知识总结

下面是最常见面试中会遇到的知识点,问题频率很高,建议多看几遍加强记忆。

1. 访问控制protected private public


class MyClass
{
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj = new MyClass();
echo $obj->public; // 这行能被正常执行
echo $obj->protected; // 这行会产生一个致命错误
echo $obj->private; // 这行也会产生一个致命错误
$obj->printHello(); // 输出 Public、Protected 和 Private

2. 对象继承extends

对象的继承在实际项目的框架中运用非常广泛,子类就会继承父类所有公有的和受保护的方法。除非子类覆盖了父类的方法,被继承的方法都会保留其原有功能。

比如数据操作的模型类、视图类、控制器类,这些一般都是会继承一个父类,再根据实际情况去自己实现父类的方法。


class foo
{
    public function printItem($string) 
    {
        echo 'Foo: ' . $string . PHP_EOL;
    }
    
    public function printPHP()
    {
        echo 'PHP is great.' . PHP_EOL;
    }
}

class bar extends foo
{
    public function printItem($string)
    {
        echo 'Bar: ' . $string . PHP_EOL;
    }
}

$foo = new foo();
$bar = new bar();
$foo->printItem('baz'); // Output: 'Foo: baz'
$foo->printPHP();       // Output: 'PHP is great' 
$bar->printItem('baz'); // Output: 'Bar: baz'
$bar->printPHP();       // Output: 'PHP is great'

3. 魔术方法__construct()

初级面试题对于魔术方法的提问频率很高,主要在乎你知不知道有魔术方法,只要能答上来几个就算是合格了。

常见的方法有

  • __construct() 具有构造函数的类会在每次创建新对象时先调用此方法
  • __destruct() 构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行
  • __call() 在对象中调用一个不可访问方法时调用
  • __callStatic() 在静态上下文中调用一个不可访问方法时调用
  • __get() 读取不可访问属性的值时调用
  • __set() 在给不可访问属性赋值时调用
  • __isset() 当对不可访问属性调用 isset() 或 empty() 时调用
  • __unset() 当对不可访问属性调用 unset() 时调用
  • __toString() 一个类被当成字符串时调用

对于一般的编码规范来说,由于魔术方法是两个下划线,所以规范为一个下划线,比如_getList()

4. 类常量const

类的常量指的是在实际业务中不变的值,这些一般都放在常量里,关键词是const

常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。


class MyClass
{
    const constant = 'constant value';

    function showConstant() {
        echo  self::constant . "\\n";
    }
}

echo MyClass::constant . "\\n";

$classname = "MyClass";
echo $classname::constant . "\\n"; // 自 5.3.0 起

$class = new MyClass();
$class->showConstant();

echo $class::constant."\\n"; // 自 PHP 5.3.0 起

5. 静态方法 static

  • 声明类属性或方法为静态,就可以不实例化类而直接访问。
  • 静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。


class Foo {
    public static function aStaticMethod() {
        // ...
    }
}

Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod();

三、总结

面向对象是初级面试中很重要的一点,对应的实际业务中应用也非常多。

建议全面熟悉相关问题,有疑问可以评论,大家一起解决问题。

以上是关于PHP面试题精讲 — 面向对象类的主要内容,如果未能解决你的问题,请参考以下文章

php高级面试题

php——10道面试题

面向对象 面试题

PHP面试题精讲 — 基本数据类型函数弱类型

PHP面试题精讲 — 基本数据类型函数弱类型

PHP面试题精讲—2021—时间日期格式化在实际项目的应用