PHP面向對象試題(基礎部分)

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

public:公有,任何地方均可以訪問
protected:繼承,只能在本類或子類中訪問,在其它地方不容許訪問
private:私有,只能在本類中訪問,在其餘地方不容許訪問php

相關題目:請寫出 PHP5 權限控制修飾符

private protected publicmysql

2. 設計模式考察:請用單態設計模式方法設計類知足以下需求:

請用 PHP5 代碼編寫類實如今每次對數據庫鏈接的訪問中都只能得到惟一的一個數據庫鏈接,具體鏈接數據庫的詳細代碼忽略,請寫出主要邏輯代碼(新浪網技術部)sql

<?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 實例化一個對象時,若是對應的類不存在,則該方法被調用django

相關題目:請寫出 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 加密session

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();oop

相關題目:如何實例化一個名爲「myclass」的對象?
8. How do you access and set properties of a class from within the class?(Yahoo)

使用語句:$this->propertyName,例如:ui

<?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 multiple PHP blocks.
答案: 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代碼實現其中一種。(卓望)

單例模式,工廠模式單例模式 實現代碼 見 第二題

相關文章
相關標籤/搜索