捌玖网络工作室's Archiver

admin 发表于 2008-4-4 02:24

[Zend权威认证试题讲解]第二章-用PHP4进行面向对象编程

尽管PHP4的OOP性能不强,但它还是能够被用来构建可行的面向对象的代码结构——只要你知道对象模型的缺陷,并且小心的处理它们。
1Dd^vz5oBR~)U PHP5在对象的处理方面做了很多改变,你或许会因此更倾向于完全忽略PHP4。但事实上,许多用OOP的程序员从很早以前就开始用老版本的PHP编写软件了。所以,大量的OOP代码早已存在,甚至在人们跳到PHP5上进行开发之前。"\:T$f%DCwOC
本章不仅考察你对面向对象知识的总体掌握,还包括对PHP4特有的OOP实现机制的认识。*e6Y0Q!`4o^1J6x

Gj,]z&s2rU/iw$gR 问题F:t-GO c6N+]

6@,y j9O.Q9l[k5~J 1.对象的蓝图是什么?
3`3Z i C{ q{5@ (HR:Y/tw%qF
答案:____________
U z _fK4fn9|
:a9~;{6z7~ Nu\V g2a(h]-n^e
2.以下代码执行后,数组$a->my_value中储存的值是什么?(三选)[code] ;F6Z` g4L]
<?php
4w&|1v*^/FVI class my_class7`3sA v~pX P*G
{5v O8in'A[\
    var $my_value = array();Lp;Y3sQDy
    function my_class ($value)
y:D#W FO3L     {
Ut f#y;j!A         $this->my_value[] = $value;[XrgX#]6y
    }"^Z M&w5f+X a!S
    function set_value ($value)
A#}^+~R z6]"]5Qr*J     {[_A%Y| f
        $this->$my_value = $value;
r Se3~ };K:b,o     }%v(ELX X0ux6f
}
PB*IC h9w&G $a = new my_class ('a');
rvPL:r8g rg1_l $a->my_value[] = 'b';
M `$E ]tN:C $a->set_value ('c');.Y mQ0QGo.~b
$a->my_class('d');F(dV\Q-@m*mP S
?>[/code]A.cHbCj%]"z
B.b0Xu.nY/Ixzl ^k
C.a
tw;BEI D.dO1v WkVk }
E.e
-oXAoY |q&q4e3rO q0}!X'Z+F(i

H-iH,X&vA$P9^ 3.如何让类中的某些方法无法在类的外部被访问?
T)yfqtR
b*S/v3`d { A.把类声明为private
+~3F?3h xt B.把方法声明为private
o)@K/D#q8i`5CNh C.无法实现j;I3BUI-e^:GdR!x
D.编写合适的重载方法(overloading method)
#Z Gh"^v(Ax `)r0~$Z(I+{

H A&F-Jh&z.L 4.哪种OOP设计模式能让类在整个脚本里只实例化一次?
,TbCEra,hd Rh1@@DL.a$l4Y"\
A.MVC模式
&f#oon4v o B.抽象工厂模式(Abstract factory)h+eh&UL ]$e}j
C.单件模式(Singleton)a_auiz[
D.代理模式(Proxy)
$wf^q?1mZ e kM(g E.状态模式(State)hL S a&i,mjS6v
1]g9UW#H"G%S#d

8Uv\^-AO E j 5.借助继承,我们可以创建其他类的派生类。那么在PHP中,子类最多可以继承几个父类?
s)M{xnC
&~"Y9o{wxD Y@ A.1个
&`6y[5KW1G Jvga B.2个;Ezg8Gu"iXEJ
C.取决于系统资源M7I K"sm
D.3个3N \ J&f UD
E.想要几个有几个
X]l d X^ k!y:\L Axf9mU@'R

K4S/R(Ddy4~ H9k 6.以下脚本近似的表示了一种在PHP4中无法实现的特性,请问这个特性叫什么?[code]
(^]C \\,S@ <?php
zkk-\#WS5C6`+` class my_class-Xb2u-Db3o:R*L y
{0L+Mmt@s
    function my_funct ($my_param)3H$]? i Dp
    {+x!c$h*M#f n9gr'K
        user_error ("Please define me", E_ERROR);
I}mlX     }
7`B-T/H2r W.KU VJ     function b()
9|L!f,`)H.h     {3hNE%C%z1Y@[
        return 10;[`7k G/~I
    }
0JtOJm Mak*i }
Fl mPE d ?>[/code]A.多重继承-r\Z C"]~ V"F{`
B.接口 t&lE x7\5b0v
C.抽象方法xZ3s r+_8f\&|e
D.Private方法
Ra"yO)h:c$l(t1b_ E.函数重载(function overloading)
xyaQN&B H
Uf4I]?.x
-@-t$|V.F@[.] 7.假设定义了一个testclass类,它的构造函数的函数名是什么?c&^,DH"~T
}(^v ixSl
A.__construct
z&{[5E*J#XqX9? \ B.initialize
o o4p"`:Xu C.testclass
2`Abl T%^(GL2v0Y D.__testclass5j h3R AZzJ
E.只有PHP5才支持构造函数
9};Yk1V+h4p1V c%P3X}J M F$WW
f O%? u1O#y V
8.一个类如何覆盖默认的序列化机制?(udE5s*Y)~D2k,c

C]c_+s A.使用__shutdown和__startup方法
7hI*v(j%?qK B.调用register_shutdown_function()函数
q ub'e/S$Bi C.使用__sleep()和__wakeup()方法8}|/w:QKWB!h
D.无法覆盖默认序列化机制/c{Rk dH(ns
E.使用ob_start()将类放入输出缓冲中:k C {-n,?#Gr
a5C6g:Gg.{
s Z:} ^/W,|(\6U5`
9.以下哪些面向对象的概念无法在PHP4中实现?
t\J*~n:i ^M!Bx kPJbw
@抽象类
;S z'p/YdaZ @Final类 @U1Pmg&um
@Public、private、protected(PPP)方法g/WT{uEQr
@接口
2vV d8z"Yi
:Z-gwD6^ y)K A.抽象类
}q$ZRyYo3`r B.PPP方法
$?,?6F(i$i[9]w C.PPP方法和接口Ye_+Hf;i\
D.以上所有都不可用 CR:A2h-a,K
E.以上所有都可用za8a"X!H)IG'g

H,\(v%l(B+w
p'~.hL4UKj 10.如何在类的内部调用mymethod方法?)A.fW\m3YEa
9q0e7o |_3U
A.$self=>mymethod();oP'i7V0JY5W
B.$this->mymethod(); E7Z0n\KF5o
C.$current->mymethod();
6|.Xs-I7~ D.$this::mymethod()
+]q*I;t#Vb,GfA E.以上都不对 d+P)gm&K,U(F

Lf&C4ud ^
Q { W4{'Fs][ 11.以下脚本输出什么?[code] "i.gYm/E
<?phpf&e"YY#o)` E~
class my_classA8_.^4]"H4X V3}qq^0{
{
-c%YR'T.A&A     var $my_var;Yx.jj/D3wi-s)_
    function _my_class ($value)Z/EKE,~D `llDY M
    {
I7~7W`kz+I0b8F         $this->my_var = $value;
l#nJ:uPGgk:b     }
/Cbek2n7d }
q$D6w,ZCnU%HV $a = new my_class (10);i'TE5f~,yS `B
echo $a->my_var;)| h+B9`z`2X~ B*f*M1b
?>[/code]A.10
/I Ob~izh B.Null
6}"m zC!Vk%Sx0C C.Emptya^0W%?Vh hN
D.什么都没有
d C.X o:{S3~ E.一个错误\7H mB{2un B
^L5I6`l(u yo

5@SRa-n CD 12.以下脚本输出什么?[code]
2S [6J{z,e&`WV <?php
"I,_qC1dP5vt|7i ^ class my_class
4qS$J6n.b OF^Z3q:A {4nQoH] Y
    var $value;)G+@#K4OZkV4P(D|
}
i3J.Qi)ju!` $a = new my_class;
2eQ(T[8p&h2w $a->my_value = 5;
-|Qv'@ nA#rMD $b = $a;
;o9z,iL4C(C Fq9~ $b->my_value = 10;
W5S(j"e+TJQ.D&q\0bN*H echo $a->my_value;
$J;~f`q0y| ?>[/code]A.10
&t;gp#s_sZ7[6B B.53I/A`L!gX I"SV^&i
C.2(]5iL$P7q_H
D.Null$rIkQ%D^.@*EE? o&M2_
E.什么都没有
G:b t8WpS3tr
]%CWy8F*SH w hTJ1r(Gs
13.以下脚本输出什么?[code] _6gS5Bd}xc2`9qn
<?phpeTo*j4S]({H
$global_obj = null;
#v { Bmrz t class my_class$q.wX@3P(W;q
{
(K b*U9O2V Ya7e     var $value;
| ~ @IAv%F     function my_class()
ODZ_Soq)wRU1O     {Ut"MQ{5EX5yl1] T3x
        global $global_obj;|BrQ.vm
        $global_obj = &$this;
9c0U_ k$oV%t     },[7g#jvx&iB g
}]jPtVQ\4D$h6y
$a = new my_class;#p7R~zP&F MpO
$a->my_value = 5;
6Y,Z3VZ6j#Ld $global_obj->my_value = 10; EX0gC R
echo $a->my_value;B3qd5^fX RG
?>[/code]A.5
dy P3d9Ik A B.10
!Gptq*P o v C.什么都没有(Z5P}s d
D.构造函数将报错
7r4f ePkeRDko E.510
aR H%kvN7}t lv f(Tr}+Dd!y/D)Q9\*Q
3Xr$e)d#~-k"l)_
14.考虑如下一段代码,执行时,$eight_tenths->to_string方法返回的字符串是8/10而不是希望的4/5,为什么?[code] RhKS r Ne
<?php
$EB*W9H.i,B { class fraction {_-m/]4]F Yd FU-m8^
    var $numerator;
AG4{:P(HN     var $denominator;
%t ~9h0Y%|EJO XQg     function fraction($n, $d) {
E/R"I^3s         $this->set_numerator($n);
xv%v'\?/R%Fi O         $this->set_denominator($d);
cXq"W.Q(Us     }
/V v$gDY9fMXn     function set_numerator($num) {N'NXh6u
        $this->numerator = (int)$num;7gw@p}+A no'x
    }UNT!p`D3C p!A
    function set_denominator($num) {2K u%o4r R|
        $this->denominator = (int)$num;
mY8US,{7I1~Y     }v)Yt vb-s
    function to_string() {
@"o~ i0yv4|c$wE         return "{$this->numerator} / {$this->denominator}";1A5]+m#`]/AV
    }q&ja u{0F&y Q
}
[*p x.c ^.u3V function gcd($a, $b) { q7LrH] wh"mb0X
    return ($b > 0) ? gcd($b, $a % $b) : $a;
w9qh+u/~Zi }
j%tgQ)IF function reduce_fraction($fraction) {
]V4J x\}K;u     $gcd = gcd($fraction->numerator,
"D W1s ?8t9?EL     $fraction->denominator);|o1Q4n)Qv{
    $fraction->numerator /= $gcd;tcQ6L9]gU'zz
    $fraction->denominator /= $gcd;v5Bb1i xieD
}
{(VB0\4J R Md:M $eight_tenths = new fraction(8,10); nH7p%Yp1d~
/* Reduce the fraction */
8L)}W*`+lb reduce_fraction($eight_tenths);`5I"@^:R/q,RN-S
var_dump($eight_tenths->to_string());,JdtNdi
?>[/code]A.reduce_fraction函数必须返回一个值6Q"o*W,i gW5E6u
B.reduce_fraction函数必须接受一个整型值
~.V,s"B,`LCa C.gcd函数有问题8U;B \+A#ku
D.必须通过引用的方式传递$eight_tenths对象(T/gs*@$S%M k[.L
E.对象的实例不能传递给方法以外的其他结构。Yj(Ry3`TppW
?Z C:x&Q
9]:D vMnig }{
15.以下代码是做什么的?[code] Ykx/d)vg
<?phpX'n3CO#kl0z}
require_once("myclass.php");+Kde+A Db%r(Q
myclass::mymethod();5W2D Wmf+f*u
?>[/code]A.静态调用mymethod方法
`&bA#a6w0z i3m)]'b| B.生成myclass的实例并调用mymethod方法
&s6MP[] C.产生一个语法错误l` yBRRm
D.默认myclass类最后被创建出的实例并调用mymethod()
!U[)A4lG]x)| E.调用名为myclass::mymethod()的函数
P&{5m)H/s"\MK,SP
+\a3Odt)k&J V!?
r0c Vm;r:o,hH-Y 16.PHP中有静态类变量吗?@w-TK!d jM
5O ~!~gb
A.有
6I1Y1i{0Z;Zj Y B.没有q'[[2H0r9e
HD H@;\ W

^z/rr$W4q0M.Wt 17.以下脚本输出什么?[code] 9[\yh8F zl
<?php
O]'zr/y R'~6h7G class a
-j E wF3bk2u4C {
J V:Uv$FsD)v*E     function a ($x = 1)+y'x/u*A/q4y-FD
    {
%p C/q`*U"L F.k}3~;A,x'q         $this->myvar = $x;s$tMc+H_Z-o cgp [
    }%D;Bd+m\?;ld*KP]7i
}
n9^l Qm"F$`5~,B1h r class b extends aP }$Xh$m P$m
{FK-vN} f3jz%yk1D `
    var $myvar;u6d3~[ ]4|8b B:C-t
    function b ($x = 2)@M C:ZD o,LE
    {
3l0W`6s-i}         $this->myvar = $x; U{kQ4k \$Xa
        parent::a();2I.WvaY1d&g
    } ^p:? rQ8K}8?J |
}
}&~gVi'r+H/F $obj = new b;
d^9S1d&ovL$c!e echo $obj->myvar;s TQ4A@pP
?>[/code]A.1
-die5\0q.h B.2
6H Ns2~]x C.一个错误,因为没有定义a::$myvar
+N/kBt2MV`6tv D.一个警告,因为没有定义a::$myvarbH,O tn"mz"c
E.什么都没有
x+I)D,OJx5D 'u'L&RBC3dWRy

IhQ{&E)Ks6s6w+y 18.如何即时加载一个类?
"r o(|`X^L5T:HX;t
y.NB"NNa,h1@ A.使用__autoload魔术函数
U5K3BA'UP.W4i B.把它们定义为forward类,j;Ri[;rNK'f
C.实现一个特殊的错误处理手段-@9}Qo,W#xjPl
D.不可能 ToU@lT3s N
E.用有条件限制的include来包含它们M3FUM;vPw0C
/wf1xQn~*Y?

i8Z!Z F&ME(v2o2G;V]Q 19.__________提供了一个高性能的解决面向对象中重复出现的问题的方案?O(K4m"~ R3^h t&K-O
/v D{'sW7sf
    答案:__________n;gk:c']BQa2p/iP*f

#v.I IE|/zx;ZSG H1XYV*e-ha&gq
20.以下脚本输出什么?[code] U(YDW| N
<?php
nXe p+k^+O class aU9_c5f'~
{8LvPPp:e;F
    function a()
4hn/c:g[h1C`     { V b#S`jt2b`/S
        echo 'Parent called';|-rt7]T M N
    }
&PHx$v1oj }h R&BN2]A
class b
:X:^ _uGF {KUmg4UI
    function b()
*O^bL8}*G9x!j] j     {$k3ucYJKs
    }
1qYOCf o }
L}l,cQ^ M8|P $c = new b();
hE+`!G xr"f(~(x0D ?>[/code]A.Parent called
;i"OJ6qy.AJ ]DR0P B.一个错误
K6V5Dl Z C.一个警告TP]*e"s'bG[ FR Y2^
D.什么都没有
R@/Y!c gLf
r H:r%T-Q0@ LL "q\G@w.\.f)_4h'e
I_ zqy)i;U$d Z
答案速查Oa,{0[$e!@%NJ
1.类
Eif Y2Ug6x(\(} 2.BCD
f'q!V.U3MG7HS J 3.C o1B u#G;eRu
4.C
XaWK5Y~/dT4R 5.A
(BPWZS*o9p 6.C
?rE4F:l4bVu0c 7.C4o%~/u.GGJ5P
8.CfMf+Hq9Y8oBV
9.D
V![!^ JY,}8i 10.B
e s6]*I?O 11.D#}`{0Wq L{$O
12.B
KFy*H/T,_ 13.A
-vxziK 14.Dn!X$u/yi"l^
15.Au x$SN7s
16.B ] N.W FL zg#W}-_
17.A/cg;dY ^(BQ)m%d
18.DW2RV%Rs&~/Y4BR
19.设计模式.ka'zydN'n-?8Z b
20.D
${s ^ m+n2q L;T1ux5ae5r

\g.RA,P&~ %v.? ] zZ'g-b+ZF
答案详解 zI4B'vUx
)i1KV]2yFEt
1.类是对象的蓝图(对象是类的实例)。 {8Q ? L(agPi

6p.Sn"m z6L,W_ ~f 2.正确答案是B、C和D。set_value方法使用了错误的表达式$this->$my_value,因此该方法实际上是空的(这在PHP5里会导致一个错误,但在PHP4中不会。——译者注)。
f9y^+`] J(^(Oos(q
3.答案是C。PHP4中无法限制对类成员的访问,而在PHP5中则可以通过private关键字实现。
\:n%| gU%?Ks _V/Xh_v
4.单件模式可以限制一个类被实例化的次数。
.v#YHB1jxX e
WV&E~1M \;?.fs n%H 5.尽管其他编程语言允许多重继承,但在PHP的对象模型中却不可以。因此答案是A。D3~+}P'?Y#b4bI0Z
$r/aG+QA4E hS
6.方框中的代码表现的是抽象方法(abstrace method)的实现。如果这个类继承自其他类,而my_funct方法在子类中被调用时没有覆盖,代码将抛出一个错误。虽然只是近似的实现了抽象方法,但在PHP4有限的对象模型中,这已经做得很好了。pI9M{%a{fU6o

#a/_T*~CT6k*d"Qn 7.PHP5有统一的构造函数(__construct()),但在PHP4中,构造函数就是和类有相同名称的方法。对于名为testclass的类,它的构造函数就是testclass()。答案是C。!oQQ,G4]F:c

tqcK v }CNRF 8.__sleep()和__wakeup()能被用来自定义对象的序列化过程。正确答案是C。
X,_RPP
|7ZPl!FU 9.PHP4中没有题目选项里所列的任何一个概念。答案是D。
4U7l m q-fM5p
r Oj_ ^[+O 10.PHP中,在类的内部访问其成员和方法,要用$this这个特殊变量。因此答案是B。y |E'u~(O/|
$nYpwpS
11.正确答案是D。my_class::_my_class()不是合法的构造函数(方法名的开头多了个_),因此脚本不会输出任何东西。你可能觉得这题是在考眼力而不是知识,是的,我们就是这么打算。仔细想想你就会同意——绝大多数的bug都是由错误的拼写造成的。这题并不是在戏弄你,而是考验你的排错能力。
tj~FB Ci+\#|-v K3G7W1b'n9]B9X}
12.PHP4把对象视作标量进行处理,当$a赋给$b时,解释器创建对象的副本,因此对后一个对象的赋值不会影响到原先的对象。答案是B。但是要注意,PHP5里就不是这样处理的了(将会输出10)。p"FW"l-q.J

7tr:Rljj 13.一上来,构造函数my_class通过引用,将自身存储在了变量$global_obj中。你可能会因此觉得,当我们后来吧$global_obj->my_value的值变为10时,$a也会相应改变。不幸的是,new操作符返回的不是引用,而是对象的副本。脚本输出5,答案是A。Gdv%[-lYm G(i

&sR3irM S 14.PHP中,把对象传递给函数或者方法时,默认传递的是值。这意味着通过参数传递给函数的对象,其实是对象的副本。这点导致了在函数或方法里对对象进行改动时,不会影响函数外的原先的那个对象。+T}/GR+s V1v
回到第14题中,这就说明对象$eight_tenths从来没有被reduce_fraction函数改动过,而$fraction对象(参数)则被改动了。如果要在函数内部改动对象,就必须以引用的方式传递参数:
(D\&J*l} F:l)S     function reduce_fraction(&$fraction);n8@,|0^._` uv8~O
答案是D。
&c#G[8{:V n:V 1PJ {vD*Tu/}|
15.题中所示的语法是用来进行静态调用的。当方法被静态调用时,它们就像一个独立的函数,与任何类的实例无关。答案是A。,L-j7A'r;s%J'h |S

)p!A q$k2qh$B vU/? 16.没有。PHP4只允许声明静态函数变量,没有静态类变量。)p6| d w3Gl| y
:G4ewJ] C5~ @)J-XW6qYM
17.答案是A。类b的属性$myvar将在b的父类——类a调用构造函数时被定义,此外,像PHP4中的普通变量一样,定义类变量时也不需要给它赋值。类b在其父类调用构造函数之前就给$myvar赋了值,所以不管之后如何赋值,输出都是1。O]I ~yz9bi

;V'u9e D&{%Y-J1{ 18.PHP4中无法即时装载类——它们必须在使用前就仔细声明好。PHP5中,可以使用__autoload魔术函数提醒解释器在找不到需要的类时尝试自动调用。因此答案是D。4Hc)[`F(O6}:b*c

uY0g3L1lLS 19.为软件设计和编程中的常规问题提供良好的解决方案,这显然是在说设计模式。
ng$K(L _ k(R fb|m !['hfIV+^ j
20.脚本什么都不输出(答案是D)。因为子类的构造函数不会自动调用父类的构造函数。

页: [1]
【捌玖网络】已经运行:


Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.