1 寫出 php 的 public乎婿、protected儒洛、private 三種訪問控制模式的區(qū)別(新浪網(wǎng)技術(shù)部)
public:公有粹舵,任何地方都可以訪問
protected:繼承属百,只能在本類或子類中訪問茬末,在其它地方不允許訪問
private:私有,只能在本類中訪問慢叨,在其他地方不允許訪問
相關(guān)題目:請寫出 PHP5 權(quán)限控制修飾符
private protected public
2 設(shè)計模式考察:請用單態(tài)設(shè)計模式方法設(shè)計類滿足如下需求:
請用 PHP5 代碼編寫類實現(xiàn)在每次對數(shù)據(jù)庫連接的訪問中都只能獲得唯一的一個數(shù)據(jù)庫連接纽匙,具體連接數(shù)據(jù)庫的詳細(xì)代碼忽略,請寫出主要邏輯代碼(新浪網(wǎng)技術(shù)部)
<?php
class Mysql
{
private static $instance = null;
private $conn;
// 構(gòu)造方法插爹,設(shè)置為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 寫出下列程序的輸出結(jié)果(新浪網(wǎng)技術(shù)部)
<?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();
?>
輸出結(jié)果 10
4 PHP5 中魔術(shù)方法函數(shù)有哪幾個请梢,請舉例說明各自的用法 (騰訊 PHP 工程師筆試題)
__sleep serialize 之前被調(diào)用
__wakeup unserialize 時被調(diào)用
__toString 打印一個對象時被調(diào)用
__set_state 調(diào)用 var_export 時被調(diào)用赠尾,用__set_state的返回值作為 var_export 的返回值
__construct 構(gòu)造函數(shù)力穗,實例化對象時被調(diào)用
__destruct 析構(gòu)函數(shù),當(dāng)對象銷毀時被調(diào)用
__call 對象調(diào)用某個方法气嫁,若存在該方法当窗,則直接調(diào)用,若不存在寸宵,則調(diào)用__call 函數(shù)
__get 讀取一個對象屬性時崖面,若屬性存在,則直接返回梯影,若不存在巫员,則調(diào)用__get 函數(shù)
__set 設(shè)置一個對象的屬性時,若屬性存在甲棍,則直接賦值简识,若不存在,則調(diào)用__set 函數(shù)
__isset 檢測一個對象的屬性是否存在時被調(diào)用
__unset unset 一個對象的屬性時被調(diào)用
__clone 克隆對象時被調(diào)用
__autoload 實例化一個對象時感猛,如果對應(yīng)的類不存在七扰,則該方法被調(diào)用
相關(guān)題目:請寫出 php5 的構(gòu)造函數(shù)和析構(gòu)函數(shù)
構(gòu)造函數(shù):__construct
析構(gòu)函數(shù):__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{};
相關(guān)題目:如何聲明一個名為“myclass”的沒有方法和屬性的類?
7 How would you create an object, which is an instance of “myclass”? (Yahoo)
$obj= new myclass();
相關(guān)題目:如何實例化一個名為“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 中,從而以后可以恢復(fù)整個類咱士,這要用到的函數(shù)是____立由。
serialize() 和 unserialize()
11 在 PHP 中,如果派生類與父類有相同名字的函數(shù)序厉,則派生類的函數(shù)會替換父類的函數(shù)拆吆,程序結(jié)果為
<?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 接口和抽象類的區(qū)別是什么?
抽象類是一種不能被實例化的類脂矫,只能作為其他類的父類來使用枣耀。抽象類是通過關(guān)鍵字abstract 來聲明的。
抽象類與普通類相似庭再,都包含成員變量和成員方法捞奕,兩者的區(qū)別在于,抽象類中至少要包含一個抽象方法拄轻,抽象方法沒有方法體颅围,該方法天生就是要被子類重寫的。
抽象方法的格式為:abstract function abstractMethod();
接口是通過 interface 關(guān)鍵字來聲明的恨搓,接口中的成員常量和方法都是 public 的院促,方法可以不寫關(guān)鍵字 public筏养,接口中的方法也是沒有方法體。接口中的方法也天生就是要被子類實現(xiàn)的常拓。
抽象類和接口實現(xiàn)的功能十分相似渐溶,最大的不同是接口能實現(xiàn)多繼承。在應(yīng)用中選擇抽象類還是接口要看具體實現(xiàn)弄抬。
子類繼承抽象類使用 extends茎辐,子類實現(xiàn)接口使用 implements。
13 類中如何定義常量掂恕、如何類中調(diào)用常量拖陆、如何在類外調(diào)用常量。
類中的常量也就是成員常量懊亡,常量就是不會改變的量依啰,是一個恒值。定義常量使用關(guān)鍵字 const店枣,例如:const PI = 3.1415326;
無論是類內(nèi)還是類外速警,常量的訪問和變量是不一樣的,常量不需要實例化對象艰争,訪問常量的格式都是類名加作用域操作符號(雙冒號)來調(diào)用坏瞄,即:類名:: 類常量名。
14 autoload()函數(shù)是如何運作的甩卓?
使用這個魔術(shù)函數(shù)的基本條件是類文件的文件名要和類的名字保持一致鸠匀。
當(dāng)程序執(zhí)行到實例化某個類的時候,如果在實例化前沒有引入這個類文件逾柿,那么就自動執(zhí)行__autoload()函數(shù)缀棍。
這個函數(shù)會根據(jù)實例化的類的名稱來查找這個類文件的路徑,當(dāng)判斷這個類文件路徑下確實存在這個類文件后就執(zhí)行 include 或者 require 來載入該類机错,然后程序繼續(xù)執(zhí)行爬范,如果這個路徑下不存在該文件時就提示錯誤。
15 哪種OOP設(shè)置模式能讓類在整個腳本里只實例化一次弱匪?(奇矩互動)
A. MVC
B. 代理模式
C. 狀態(tài)模式
D. 抽象工廠模式
E. 單件模式
答案:E
16 借助繼承青瀑,我們可以創(chuàng)建其他類的派生類。在PHP中萧诫,子類最多可以繼承幾個父類斥难?(奇矩互動)
A. 1個
B. 2個
C. 取決于系統(tǒng)資源
D. 3個
E. 想要幾個有幾個
答案:A
17 執(zhí)行以下代碼,輸出結(jié)果是(奇矩互動)
<?php
abstract class a{
function __construct()
{
echo "a";
}
}
$a = new a();
?>
A. a
B. 一個錯誤警告
C. 一個致命性的報錯
答案:C 因為類a是抽象類帘饶,不能被實例化
18 執(zhí)行以下代碼哑诊,輸出結(jié)果是
<?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,兩個類都定義了構(gòu)造函數(shù)及刻,由于二者名字相同镀裤,所以子類中的構(gòu)造函數(shù)覆蓋了父類的構(gòu)造函數(shù)竞阐,要想子類對象實例化時也執(zhí)行父類的構(gòu)造函數(shù),需要在子類構(gòu)造函數(shù)中使用 parent::__construct()來顯示調(diào)用父類構(gòu)造函數(shù)暑劝。
19 請定義一個名為MyClass的類骆莹,這個類只有一個靜態(tài)方法justDoIt。(卓望)
<?php
class MyClass{
public static function justDoIt(){
}
}
?>
20 只有該類才能訪問該類的私有變量嗎铃岔?(卓望)
是的
21 寫出你知道的幾種設(shè)計模式汪疮,并用php代碼實現(xiàn)其中一種峭火。(卓望)
單例模式毁习,工廠模式
單例模式 實現(xiàn)代碼 見 第二題