首頁 >後端開發 >php教程 >php面試題中物件導向的題目分析

php面試題中物件導向的題目分析

黄舟
黄舟原創
2017-11-10 10:38:394108瀏覽

物件導向是我們學習php不可或缺的一部分,很多朋友對物件導向都是一知半解的,所以導致很多朋友去公司面試的時候,問到php面試題中物件導向的問題就不知道如何是好,在之前的文章我們也介紹php面試題,筆試題,php核心技術題, 今天我們就帶大家來看看這個php面試題中的物件導向的題到底有哪些?

php面試題之物件導向題目

1. 寫出php 的public、protected、private 三種存取控制模式的區別(新浪網技術部)

#public :公有,任何地方都可以訪問
protected:繼承,只能在本類或子類中訪問,在其它地方不允許訪問
private:私有,只能在本類中訪問,在其他地方不允許存取

相關題目:請寫出PHP5 權限控制修飾符
private protected public
2. 設計模式考察:請用單態設計模式方法設計類滿足以下需求:
請用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();
?>
3. 寫出下列程式的輸出結果(新浪網技術部)
<?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







# [!]4. 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

5. 如何使用下面的類別,並解釋下面什麼意思?

<?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 加密

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

相關題目:如何宣告一個名為「myclass」的沒有方法與屬性的類別?
7. How would you create an object, which is an instance of “myclass”? (Yahoo)

$obj= new myclass();
相關題目:如何實例化一個名為“myclass”的物件?
8. 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";
        }
    }
?>
## #9. 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 multi PHP blo .###答案: B######10. 類別的屬性可以序列化後保存到session 中,以便以後可以恢復整個類,這要用到的函數是。 ###serialize() 和unserialize()######11. 在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#######12. 介面與抽象類別的區別是什麼? #########抽象類別###是一種不能被實例化的類,只能作為其他類別的父類來使用。抽象類別是透過關鍵字abstract 來聲明的。 ###抽象類別與普通類別相似,都包含成員變數和成員方法,兩者的差異在於,抽象類別中至少要包含一個抽象方法,抽象方法沒有方法體,該方法天生就是要被子類別重寫的。 ###抽象方法的格式為:abstract function abstractMethod();###

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

13. 类中如何定义常量、如何类中调用常量、如何在类外调用常量。

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

14. autoload()函数是如何运作的?

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

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

15. 哪种OOP设置模式能让类在整个脚本里只实例化一次?(奇矩互动)

A. MVC
B. 代理模式
C. 状态模式
D. 抽象工厂模式
E. 单件模式
答案:E

16. 借助继承,我们可以创建其他类的派生类。在PHP中,子类最多可以继承几个父类?(奇矩互动)

A. 1个
B. 2个
C. 取决于系统资源
D. 3个
E. 想要几个有几个
答案:A

17. 执行以下代码,输出结果是(奇矩互动)
<?php
    abstract class a{
        function construct()
        {
            echo "a";
        }
    }

    $a = new a();
?>

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

18. 执行以下代码,输出结果是
<?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()来显示调用父类构造函数。

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

    }
}
?>
20. 只有该类才能访问该类的私有变量吗?(卓望)

是的

21. 写出你知道的几种设计模式,并用php代码实现其中一种。(卓望)

单例模式,工厂模式
单例模式 实现代码 见 第二题

总结:

我们在这个片文章中,我们主要给大家汇总了一下php面试题中关于面向对象中的一些常见面试问题,具体细节大家可以自己扩展,希望对你有所帮助!

相关推荐:

最让人容易出错的10道php面试题


php面試題目中php核心技術的問題分享


#php面試題目中筆試題目的總結


2017最完整的php面試題目及答案摘要


以上是php面試題中物件導向的題目分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn