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 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程式碼實現其中一種。(卓望)
單例模式,工廠模式
單例模式 實現程式碼 見 第二題