php面试题之二 (PHP面向对象) --- 2021-09-15

PHP面向对象

  1. 写出 php 的 public、protected、private 三种访问控制模式的区别(新浪网技术部)
    public:公有,任何地方都可以访问
    protected:继承,只能在本类或子类中访问,在其它地方不允许访问
    private:私有,只能在本类中访问,在其他地方不允许访问

相关题目:请写出 PHP5 权限控制修饰符
private protected public

  1. 设计模式考察:请用单态设计模式方法设计类满足如下需求:
    请用 PHP5 代码编写类实现在每次对数据库连接的访问中都只能获得唯一的一个数据库连接,具体连接数据库的详细代码忽略,请写出主要逻辑代码(新浪网技术部)
<?php
    class Mysql
    {
        private static $instance = null;
        private $conn;

        // 构造方法,设置为private,不允许通过new获得对象实例
        private function __construct(argument)
        {
            $conn = mysql_connect("localhost","root","root");
        }

        // 获取实例方法
        public function getInstance()
        {
            if (!self::$instance instanceof self) {
                self::$instance = new self;
            }
            return self::$instance;
        }

        // 禁止克隆
        private function __clone(){}
    }

    // 获得对象
    $db = Mysql::getInstance();
?>
  1. 写出下列程序的输出结果(新浪网技术部)
<?php
    class a
    {
        protected $c;

        public function a()
        {
            $this->c = 10;
        }
    }

    class b extends a
    {
        public function print_data()
        {
            return $this->c;
        }
    }

    $b = new b();
    echo $b->print_data();
?>

输出结果 10

  1. PHP5 中魔术方法函数有哪几个,请举例说明各自的用法 (腾讯 PHP 工程师笔试题)
    __sleep serialize 之前被调用
    __wakeup unserialize 时被调用
    __toString 打印一个对象时被调用
    __set_state 调用 var_export 时被调用,用__set_state的返回值作为 var_export 的返回值
    __construct 构造函数,实例化对象时被调用
    __destruct 析构函数,当对象销毁时被调用
    __call 对象调用某个方法,若存在该方法,则直接调用,若不存在,则调用__call 函数
    __get 读取一个对象属性时,若属性存在,则直接返回,若不存在,则调用__get 函数
    __set 设置一个对象的属性时,若属性存在,则直接赋值,若不存在,则调用__set 函数
    __isset 检测一个对象的属性是否存在时被调用
    __unset unset 一个对象的属性时被调用
    __clone 克隆对象时被调用
    __autoload 实例化一个对象时,如果对应的类不存在,则该方法被调用

相关题目:请写出 php5 的构造函数和析构函数
构造函数:__construct
析构函数:__destruct

  1. 如何使用下面的类,并解释下面什么意思?
<?php
    class test{
        function Get_test($num){
            $num = md5(md5($num)."En");
            return $num;
        }
    }

    $testObject = new test();
    $encryption = $testObject->Get_test("itcast");
    echo $encryption;
?>

双重 md5 加密

  1. How would you declare a class named “myclass” with no methods or properties?(Yahoo)
    class myclass{};

相关题目:如何声明一个名为“myclass”的没有方法和属性的类?

  1. How would you create an object, which is an instance of “myclass”? (Yahoo)
    $obj= new myclass();

相关题目:如何实例化一个名为“myclass”的对象?

  1. How do you access and set properties of a class from within the class?(Yahoo)
    使用语句:$this->propertyName,例如:
<?php
    class mycalss{
        private $propertyName;
        public function __construct()
        {
            $this->propertyName = "value";
        }
    }
?>
  1. The code below ___________ because ____________.(腾讯)
<?php
class Foo{
?>
<?php
    function bar(){
        print "bar";
    }
}
?>

A. will work, class definitions can be split up into multiple PHP blocks.
B. will not work, class definitions must be in a single PHP block.
C. will not work, class definitions must be in a single file but can be in multiple PHP blocks.
D. will work, class definitions can be split up into multiple files and multiple PHP blocks.
答案: B

  1. 类的属性可以序列化后保存到 session 中,从而以后可以恢复整个类,这要用到的函数是____。
    serialize() 和 unserialize()

  2. 在 PHP 中,如果派生类与父类有相同名字的函数,则派生类的函数会替换父类的函数,程序结果为
    <?php
    class A{
    function disName(){
    echo "Picachu";
    }
    }

class B extends A{
var $tmp;
function disName(){
echo "Doraemon";
}
}

cartoon = New B;cartoon->disName();
?>
A. tmp
B. Picachu
C. disName
D. Doraemon
E. 无输出
答案:D

  1. 接口和抽象类的区别是什么?
    抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。抽象类是通过关键字abstract 来声明的。
    抽象类与普通类相似,都包含成员变量和成员方法,两者的区别在于,抽象类中至少要包含一个抽象方法,抽象方法没有方法体,该方法天生就是要被子类重写的。
    抽象方法的格式为:abstract function abstractMethod();

接口是通过 interface 关键字来声明的,接口中的成员常量和方法都是 public 的,方法可以不写关键字 public,接口中的方法也是没有方法体。接口中的方法也天生就是要被子类实现的。
抽象类和接口实现的功能十分相似,最大的不同是接口能实现多继承。在应用中选择抽象类还是接口要看具体实现。
子类继承抽象类使用 extends,子类实现接口使用 implements。

  1. 类中如何定义常量、如何类中调用常量、如何在类外调用常量。
    类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。定义常量使用关键字 const,例如:const PI = 3.1415326;
    无论是类内还是类外,常量的访问和变量是不一样的,常量不需要实例化对象,访问常量的格式都是类名加作用域操作符号(双冒号)来调用,即:类名:: 类常量名。

  2. autoload()函数是如何运作的?
    使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。
    当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。

这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后就执行 include 或者 require 来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。

  1. 哪种OOP设置模式能让类在整个脚本里只实例化一次?(奇矩互动)
    A. MVC
    B. 代理模式
    C. 状态模式
    D. 抽象工厂模式
    E. 单件模式
    答案:E

  2. 借助继承,我们可以创建其他类的派生类。在PHP中,子类最多可以继承几个父类?(奇矩互动)
    A. 1个
    B. 2个
    C. 取决于系统资源
    D. 3个
    E. 想要几个有几个
    答案:A

  3. 执行以下代码,输出结果是(奇矩互动)

<?php
    abstract class a{
        function __construct()
        {
            echo "a";
        }
    }

    $a = new a();
?>

A. a
B. 一个错误警告
C. 一个致命性的报错
答案:C 因为类a是抽象类,不能被实例化

  1. 执行以下代码,输出结果是
<?php
class a{
    function __construct(){
        echo "echo class a something";
    }
}

class b extends a{
    function __construct(){
        echo "echo class b something";
    }
}

$a = new b();
?>

A. echo class a something echo class b something
B. echo class b something echo class a something
C. echo class a something
D. echo class b something
答案:D

类 b 继承自类 a,两个类都定义了构造函数,由于二者名字相同,所以子类中的构造函数覆盖了父类的构造函数,要想子类对象实例化时也执行父类的构造函数,需要在子类构造函数中使用 parent::__construct()来显示调用父类构造函数。

  1. 请定义一个名为MyClass的类,这个类只有一个静态方法justDoIt。(卓望)
    <?php
    class MyClass{
    public static function justDoIt(){

    }
    }
    ?>

  2. 只有该类才能访问该类的私有变量吗?(卓望)
    是的

  3. 写出你知道的几种设计模式,并用php代码实现其中一种。(卓望)
    单例模式,工厂模式
    单例模式 实现代码 见 第二题

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 1 写出 php 的 public、protected、private 三种访问控制模式的区别(新浪网技术部) ...
    叫我峰兄阅读 330评论 0 3
  • 继上一篇“php面试题之面向对象(一)”发表后,今天继续更新。 整个面向对象文章的结构涉及的内容模块有: 一、面向...
    it阿布阅读 295评论 0 10
  • 抽象类和接口的概念和区别 1. 概念: 抽象类:是一种特殊的,不能被实例化的类,只能作为其他类的父类使用。使用ab...
    Amy1234567阅读 350评论 0 0
  • 标签(空格分隔): Java面向对象 1. 面向对象的特征有哪些方面? 抽象:抽象就是找出一些事物的相似和共性之处...
    outSiderYN阅读 6,347评论 0 6
  • 题目来自《PHP程序员面试笔试宝典》,里面涵盖了近三年了各大型企业常考的PHP面试题,针对面试题提取出来各种面试知...
    琉忆光年阅读 1,247评论 0 2