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