获得本站免费赞助空间请点这里
返回列表 发帖

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

尽管PHP4的OOP性能不强,但它还是能够被用来构建可行的面向对象的代码结构——只要你知道对象模型的缺陷,并且小心的处理它们。
) W. Z, f: h# a; p- ?PHP5在对象的处理方面做了很多改变,你或许会因此更倾向于完全忽略PHP4。但事实上,许多用OOP的程序员从很早以前就开始用老版本的PHP编写软件了。所以,大量的OOP代码早已存在,甚至在人们跳到PHP5上进行开发之前。
) g( A* l$ y' b' g5 v+ y本章不仅考察你对面向对象知识的总体掌握,还包括对PHP4特有的OOP实现机制的认识。
5 H  W9 i5 I2 y2 p4 y5 v/ u, q# j! s4 ^  h  T' u
问题
9 t$ z) v' s: ^) \$ v0 D/ W6 h7 |! H9 ~; d* ?+ x
1.对象的蓝图是什么?
) n3 ^7 N* t0 X2 T$ x. A! w; o! R1 L( u
答案:____________
+ _3 h9 ^3 j) e1 U3 O* O! k( I' n' P. E1 |1 R' G
9 W4 I' N" y) i& W3 ]  m
2.以下代码执行后,数组$a->my_value中储存的值是什么?(三选)

  1. <?php
  2. class my_class
  3. {
  4.     var $my_value = array();
  5.     function my_class ($value)
  6.     {
  7.         $this->my_value[] = $value;
  8.     }
  9.     function set_value ($value)
  10.     {
  11.         $this->$my_value = $value;
  12.     }
  13. }
  14. $a = new my_class ('a');
  15. $a->my_value[] = 'b';
  16. $a->set_value ('c');
  17. $a->my_class('d');
  18. ?>
复制代码
A.c
, m/ V" `# k$ Z# @: \1 WB.b/ K* O$ C4 X) J' H& V3 l! Y8 ~- y
C.a) Y; N/ l# s! o! L' u/ ^. G
D.d
% F$ a# ?! k8 ^& Z  b7 l. cE.e8 V3 q: s2 a8 D7 P8 o6 _
* j9 k" E6 e/ N% Z1 C# q! o

2 W! P4 `" ]3 b8 e7 x. _- K+ f3.如何让类中的某些方法无法在类的外部被访问?
9 F4 W6 l  w8 J/ }$ a! I
& c% [  E+ N1 L/ _: ]$ wA.把类声明为private
9 S1 ]( O- K: B8 v! o1 G3 |: AB.把方法声明为private8 E& Z8 z7 R9 D. Z1 N- C2 |' q
C.无法实现' z! p% j$ M+ \! Z, ?3 Z1 g
D.编写合适的重载方法(overloading method)( d0 P2 \/ d/ J. |

1 i) k6 g+ q5 R3 ?7 l% g  A6 ^+ ?4 R# U; g/ K2 _
4.哪种OOP设计模式能让类在整个脚本里只实例化一次?; n$ ~) N3 |' V9 `5 H) @

) p! p. x1 M9 D0 H- i# q  O6 J8 s* w* zA.MVC模式3 J: C$ D6 H1 u9 e  z
B.抽象工厂模式(Abstract factory)  x, P. f2 H, A3 `5 o2 H  i2 w
C.单件模式(Singleton)* U3 Q8 z7 w1 H3 r, l
D.代理模式(Proxy)1 Y1 x6 k" o! e
E.状态模式(State)
( k* v9 @' G. H$ ?5 r# P" t0 U& P$ r, `
( J- W! G! B9 p
5.借助继承,我们可以创建其他类的派生类。那么在PHP中,子类最多可以继承几个父类?
5 m. L4 J) O: k9 f) s3 W
5 K2 _. o- T7 X4 ?A.1个% h# P, R1 b7 h2 e+ K' l
B.2个) C1 H; v) |$ l
C.取决于系统资源) u, F+ e1 O/ _
D.3个& B  j2 m, {1 A9 f( |5 r
E.想要几个有几个. _  F% G& c+ l- O1 [" Z" _0 w( D
/ Z+ y! D0 h$ W% u0 V

$ r- t) d' z: _( H2 N1 S6 Y1 e6.以下脚本近似的表示了一种在PHP4中无法实现的特性,请问这个特性叫什么?

  1. <?php
  2. class my_class
  3. {
  4.     function my_funct ($my_param)
  5.     {
  6.         user_error ("Please define me", E_ERROR);
  7.     }
  8.     function b()
  9.     {
  10.         return 10;
  11.     }
  12. }
  13. ?>
复制代码
A.多重继承
- @; J/ B3 K/ {3 Q) b  kB.接口
2 s) h; c- f7 r! j  `C.抽象方法* b$ m2 q) [5 @! E
D.Private方法- M2 b% H! N! T( X! d8 b& z; _
E.函数重载(function overloading)/ T) D# }( V7 x

: ]* `- V5 `! B' ]6 }2 R
+ B! c# ~! w9 e( H1 a, T- {! |2 U4 T7.假设定义了一个testclass类,它的构造函数的函数名是什么?# V0 K- _) d; e& w" {1 k

4 F9 z1 E. J; R; B- Z0 S, GA.__construct
+ O: O  b6 o4 @# g# X/ c) eB.initialize
. T4 B/ ^0 f, D6 {& dC.testclass1 p& p" A9 p$ P* t5 M) ]
D.__testclass
: S. ?" e1 A, \% d( XE.只有PHP5才支持构造函数$ T, l+ ]  n- Z

4 ^# B" C  c4 l3 @( j
; ]' W6 |5 m2 `: r# D8.一个类如何覆盖默认的序列化机制?
) x4 ^, H% W; ^1 [
- q, F# k& i5 V0 A) q) M4 XA.使用__shutdown和__startup方法
; R1 t& q+ J0 T8 SB.调用register_shutdown_function()函数
- q# T( q$ {3 P  B. aC.使用__sleep()和__wakeup()方法
+ E( j- g* j( Q  I7 n; o& ]D.无法覆盖默认序列化机制( W# l) c3 Z7 n0 Q) ^3 S* c
E.使用ob_start()将类放入输出缓冲中
! q: t; y' T2 @0 E2 [+ I5 n& A$ g+ v0 J2 D+ q) M( _
4 m$ k& Q. @7 ~+ p4 g
9.以下哪些面向对象的概念无法在PHP4中实现?
3 u) F* s- i0 L& K; w$ h: d4 h9 ?7 y, C& ]7 v# x) N
@抽象类
! J9 O, j* H# B# J7 \6 z9 E@Final类
+ d: w, H6 V7 \0 [@Public、private、protected(PPP)方法+ n; _3 Q% P+ o  J- l1 J4 W) E
@接口& I& B- M* L4 c( {# J* x( W7 M) J
% f0 i! Q" I5 O8 _
A.抽象类2 G3 O: N0 }& i+ U
B.PPP方法
. h7 [4 M- g$ V  K. b5 q& g" Q+ jC.PPP方法和接口
' U* Z0 H* Z  }1 F0 V, KD.以上所有都不可用( l+ \$ Y: u* U& v4 p' B
E.以上所有都可用7 r" j* Q& X8 a( k0 ?
7 v; B( I; G6 v* D& K  @7 u5 j! G
, o& _8 A: n0 j( \' I6 t
10.如何在类的内部调用mymethod方法?) F9 W- \* v% n+ \+ V" B
' Y3 P2 D& ~: v8 g
A.$self=>mymethod();3 ~" I  p( d# A) k4 M
B.$this->mymethod();
  F2 o) c2 v0 u: k+ uC.$current->mymethod();
' I' E  ?, k+ W& I- ]D.$this::mymethod()
6 h3 Q9 V/ [9 }3 s* m, fE.以上都不对
% H7 G6 d) |# S) C0 a3 Z$ u8 T2 T6 {, W* N4 D0 A) {* k$ r
0 I2 F, g3 M( o  h+ |6 R# G
11.以下脚本输出什么?

  1. <?php
  2. class my_class
  3. {
  4.     var $my_var;
  5.     function _my_class ($value)
  6.     {
  7.         $this->my_var = $value;
  8.     }
  9. }
  10. $a = new my_class (10);
  11. echo $a->my_var;
  12. ?>
复制代码
A.10
5 E; q) i1 B. J2 ]6 t8 _B.Null4 `$ M# ]: J, H$ ]0 a' L% u  Q6 r" E
C.Empty
# b! S- |; Z; xD.什么都没有
$ w; v. @; k! Y( @3 y6 G) V: {8 nE.一个错误5 B% |+ P0 l. u7 z' |( m7 ~6 V

& M3 U$ p& t" ^  c" S2 A
8 F2 m! I( `# [6 z% W12.以下脚本输出什么?

  1. <?php
  2. class my_class
  3. {
  4.     var $value;
  5. }
  6. $a = new my_class;
  7. $a->my_value = 5;
  8. $b = $a;
  9. $b->my_value = 10;
  10. echo $a->my_value;
  11. ?>
复制代码
A.10, J. d2 {9 I" [+ X
B.5: G* Z7 d0 x% |3 _5 D9 O
C.2* b: z4 t6 `$ u5 U) F- e$ ]
D.Null
% D" I# j+ x) H9 m  x9 ~. yE.什么都没有! u- C9 r: V6 B+ k

: ^  _2 F( U/ @$ p# N: W2 Y& L/ A1 R
13.以下脚本输出什么?

  1. <?php
  2. $global_obj = null;
  3. class my_class
  4. {
  5.     var $value;
  6.     function my_class()
  7.     {
  8.         global $global_obj;
  9.         $global_obj = &$this;
  10.     }
  11. }
  12. $a = new my_class;
  13. $a->my_value = 5;
  14. $global_obj->my_value = 10;
  15. echo $a->my_value;
  16. ?>
复制代码
A.5  K  q3 ^$ g9 I' D
B.10, r" H: V2 [2 ?1 J- Z
C.什么都没有) k# s  R& P' L
D.构造函数将报错3 _4 Q  m; F' h
E.510
- E7 s$ P& N$ y  ~$ A; l7 U
& v. N) [  N) B- N' Y) W3 L; [! A6 d; E
14.考虑如下一段代码,执行时,$eight_tenths->to_string方法返回的字符串是8/10而不是希望的4/5,为什么?

  1. <?php
  2. class fraction {
  3.     var $numerator;
  4.     var $denominator;
  5.     function fraction($n, $d) {
  6.         $this->set_numerator($n);
  7.         $this->set_denominator($d);
  8.     }
  9.     function set_numerator($num) {
  10.         $this->numerator = (int)$num;
  11.     }
  12.     function set_denominator($num) {
  13.         $this->denominator = (int)$num;
  14.     }
  15.     function to_string() {
  16.         return "{$this->numerator} / {$this->denominator}";
  17.     }
  18. }
  19. function gcd($a, $b) {
  20.     return ($b > 0) ? gcd($b, $a % $b) : $a;
  21. }
  22. function reduce_fraction($fraction) {
  23.     $gcd = gcd($fraction->numerator,
  24.     $fraction->denominator);
  25.     $fraction->numerator /= $gcd;
  26.     $fraction->denominator /= $gcd;
  27. }
  28. $eight_tenths = new fraction(8,10);
  29. /* Reduce the fraction */
  30. reduce_fraction($eight_tenths);
  31. var_dump($eight_tenths->to_string());
  32. ?>
复制代码
A.reduce_fraction函数必须返回一个值
8 n* |9 h  U% _' c+ ~$ HB.reduce_fraction函数必须接受一个整型值
$ ~, r6 B. o2 A  vC.gcd函数有问题
5 a$ ~8 S: s: m% ?% m. o' qD.必须通过引用的方式传递$eight_tenths对象  c' v5 m$ d5 A& D& C# C
E.对象的实例不能传递给方法以外的其他结构。
/ ^1 w% [% A) V
- i7 n" T( ?! n0 K3 ]$ X% B
- |( k) f/ m+ U5 W15.以下代码是做什么的?

  1. <?php
  2. require_once("myclass.php");
  3. myclass::mymethod();
  4. ?>
复制代码
A.静态调用mymethod方法
3 L1 l- Q6 I  a+ N  zB.生成myclass的实例并调用mymethod方法
* W  `  j' e! y. W- rC.产生一个语法错误" x1 m0 R: r* [) }
D.默认myclass类最后被创建出的实例并调用mymethod()+ Z9 [4 I& c, U! U! p
E.调用名为myclass::mymethod()的函数( h# p8 ^$ u# d: I6 H* Q; O- L
- g! ?: O/ S& Q$ J0 T9 V" s2 ~5 j+ i7 {
6 |7 o- Y! I- n4 U5 p- Q8 J# h5 X0 Q
16.PHP中有静态类变量吗?+ z+ u( p- N, w& z; t% g5 g
5 e; s( O& E' H
A.有# d0 B1 r+ A/ ]5 Z" s2 c
B.没有
1 N* P! c8 G* H- s4 B( f- P& q
! {# V6 r0 @0 N) h) k$ s: H0 O
$ Q$ b; k8 U1 {$ S' r# V  j17.以下脚本输出什么?

  1. <?php
  2. class a
  3. {
  4.     function a ($x = 1)
  5.     {
  6.         $this->myvar = $x;
  7.     }
  8. }
  9. class b extends a
  10. {
  11.     var $myvar;
  12.     function b ($x = 2)
  13.     {
  14.         $this->myvar = $x;
  15.         parent::a();
  16.     }
  17. }
  18. $obj = new b;
  19. echo $obj->myvar;
  20. ?>
复制代码
A.1
; k5 }, n* K6 \+ b1 ?) QB.2
9 r9 N8 a+ s; h0 j; o7 HC.一个错误,因为没有定义a::$myvar5 |: |3 M: x: l' ~
D.一个警告,因为没有定义a::$myvar
5 n  o$ f( l  {$ o* i$ U: U  t# tE.什么都没有+ f0 R0 l# x$ K% q. z  F' H
+ O3 _6 K6 ^* H! p2 h0 D9 S
; |. T- A8 {0 C! u8 F" @3 T+ C
18.如何即时加载一个类?
; N6 b; A, O4 X8 c9 g! S$ u+ {0 i, Y! Z, K7 J
A.使用__autoload魔术函数( z( C. k& a" P; m0 K
B.把它们定义为forward类3 y2 U7 i) x. |6 @1 h& E7 S4 e
C.实现一个特殊的错误处理手段
3 M. f& S; A  Y' v2 A! tD.不可能
4 z4 F! v% ^0 u+ s$ m! g/ g: V' h0 uE.用有条件限制的include来包含它们
+ V- ~' ^6 ?' y7 K" U9 m
* s& S8 u* M7 \* R
7 a" e1 ~3 e1 C2 Z2 S/ L. q19.__________提供了一个高性能的解决面向对象中重复出现的问题的方案?
% `' C- F. t& z
3 x; P! P' i; p# W    答案:__________- f. G8 p  N. H+ [8 f: h/ D

$ x3 x5 n4 r8 \% P0 K" A. V3 f; {+ L6 @8 k; U% ]
20.以下脚本输出什么?

  1. <?php
  2. class a
  3. {
  4.     function a()
  5.     {
  6.         echo 'Parent called';
  7.     }
  8. }
  9. class b
  10. {
  11.     function b()
  12.     {
  13.     }
  14. }
  15. $c = new b();
  16. ?>
复制代码
A.Parent called" ~: t  d6 ^$ d
B.一个错误* Y# F3 f6 x/ e: M
C.一个警告
3 w! E! ?1 S' u/ m. n( Q' I7 e  PD.什么都没有9 r2 f0 I8 ]) e8 [. ]+ D% L& {

+ h$ c- b3 x" V; O) s& n  V
/ |- j4 u- T9 {) C1 d! ]% L- l7 B: Q2 J5 p" }9 ^
答案速查
  A4 c, F* s1 D$ J0 d1.类
$ z+ g% S# ^1 `, e$ M8 S2.BCD
' i" E7 V3 Q0 T# z3.C" r  g# W! Q3 [7 f
4.C# q9 o  O' n: e8 n/ p! K3 y
5.A4 Q  u) x* s0 }5 z, N- g( ?
6.C
9 f, v- P, T# j4 O1 F6 h9 u: S6 N7.C
7 Q# W9 o1 J) r& v8.C
( D- N: u8 u8 ]# j; H6 @& `0 \9.D
, k# B, x6 S1 s$ ~7 R! v9 W10.B
% R: _* R* G  d9 u/ P11.D4 n, ~8 X& ^2 R7 R; {& Y- j
12.B- ^  M' `# p& z) ^  y6 t/ r
13.A
" P- o4 n8 p3 N* ^+ ^2 y14.D
' H2 D- V% Q3 d+ }( Q15.A
1 r0 X8 Y  M& z/ \# q16.B" a6 J4 Y" ^& q/ e: {/ z; q
17.A, k# O2 n; n$ G
18.D- C* l# i3 H- T  ?: C
19.设计模式
9 B. y6 o6 `* A+ o3 }! i20.D
% ]; p, n+ w2 F  y4 U4 d9 M: N# d8 C" E% Z) U- J
7 V, R8 B3 s+ X. i
7 a) k! `7 M7 q: b( ^( l
答案详解. S; u5 r) N; D! [5 o

/ v4 z% X3 b- F% @' T' L. N% G1.类是对象的蓝图(对象是类的实例)。
7 F1 W9 {" w: o- R' ?* K( u8 ^
/ {3 c2 P& _# I4 z2.正确答案是B、C和D。set_value方法使用了错误的表达式$this->$my_value,因此该方法实际上是空的(这在PHP5里会导致一个错误,但在PHP4中不会。——译者注)。
2 w! d; k6 z" @5 f, Q& q, u$ S' @$ Q2 g& l: k  x! x, ]
3.答案是C。PHP4中无法限制对类成员的访问,而在PHP5中则可以通过private关键字实现。
. r2 [* j/ c; n5 o  q) b4 f
1 y% C7 l% _  `; e4 C9 L  }4.单件模式可以限制一个类被实例化的次数。
7 f' y7 t0 L' Y* Z% m5 [* O  [; \6 p
5.尽管其他编程语言允许多重继承,但在PHP的对象模型中却不可以。因此答案是A。: ?8 C0 U7 w. s* ~

7 [+ h- ~7 @2 J; w9 Z: b& n% m; a6.方框中的代码表现的是抽象方法(abstrace method)的实现。如果这个类继承自其他类,而my_funct方法在子类中被调用时没有覆盖,代码将抛出一个错误。虽然只是近似的实现了抽象方法,但在PHP4有限的对象模型中,这已经做得很好了。
6 T1 C$ l! b# c+ M, @+ j* x" R- L+ k
/ V- w9 T' F: t& a( x; f7.PHP5有统一的构造函数(__construct()),但在PHP4中,构造函数就是和类有相同名称的方法。对于名为testclass的类,它的构造函数就是testclass()。答案是C。
8 \9 N2 B3 L6 t$ f- ~0 \; ~8 Y4 y  }! x9 [0 [3 C
8.__sleep()和__wakeup()能被用来自定义对象的序列化过程。正确答案是C。
, H7 \* W& Z% S  A' s! B, }; A3 e% ], M0 S  s2 b* j$ n
9.PHP4中没有题目选项里所列的任何一个概念。答案是D。# h' e" B# }/ W) K7 @
$ m4 X$ B" ~2 h  L* E
10.PHP中,在类的内部访问其成员和方法,要用$this这个特殊变量。因此答案是B。# p& S) d' Q  ~' E. B9 ]
* D6 m2 c6 k1 b' S/ \( A+ D/ p
11.正确答案是D。my_class::_my_class()不是合法的构造函数(方法名的开头多了个_),因此脚本不会输出任何东西。你可能觉得这题是在考眼力而不是知识,是的,我们就是这么打算。仔细想想你就会同意——绝大多数的bug都是由错误的拼写造成的。这题并不是在戏弄你,而是考验你的排错能力。
1 R! k' c. O# [! c7 V9 m5 i
; N, x3 G! V) ^12.PHP4把对象视作标量进行处理,当$a赋给$b时,解释器创建对象的副本,因此对后一个对象的赋值不会影响到原先的对象。答案是B。但是要注意,PHP5里就不是这样处理的了(将会输出10)。. U  x& v0 ]& R8 m+ ?  p$ E
/ ~$ n' i4 E9 [4 C4 H% x
13.一上来,构造函数my_class通过引用,将自身存储在了变量$global_obj中。你可能会因此觉得,当我们后来吧$global_obj->my_value的值变为10时,$a也会相应改变。不幸的是,new操作符返回的不是引用,而是对象的副本。脚本输出5,答案是A。! d. G, ^- }5 X! r% ?% n/ i/ Q: {

* |; P. X4 p2 @! Z2 y8 y" j; J14.PHP中,把对象传递给函数或者方法时,默认传递的是值。这意味着通过参数传递给函数的对象,其实是对象的副本。这点导致了在函数或方法里对对象进行改动时,不会影响函数外的原先的那个对象。
, r6 T2 a3 W$ W2 _; j回到第14题中,这就说明对象$eight_tenths从来没有被reduce_fraction函数改动过,而$fraction对象(参数)则被改动了。如果要在函数内部改动对象,就必须以引用的方式传递参数:
! z2 ^$ i' u$ b5 G, `    function reduce_fraction(&$fraction)! q7 v! Q1 p$ @/ p7 N' y  \
答案是D。& ~, K) W5 i- H- n/ Z

* b# c4 M5 D+ \4 W' Z, e- F15.题中所示的语法是用来进行静态调用的。当方法被静态调用时,它们就像一个独立的函数,与任何类的实例无关。答案是A。% f/ P! j3 y. J8 R& L4 g2 H2 j
; w" r" A6 a5 b9 D) ?2 L9 v( A
16.没有。PHP4只允许声明静态函数变量,没有静态类变量。" _! f6 t! B1 j! d
; d# Q  ?7 P) M: S7 P, r; ~) _' F# u
17.答案是A。类b的属性$myvar将在b的父类——类a调用构造函数时被定义,此外,像PHP4中的普通变量一样,定义类变量时也不需要给它赋值。类b在其父类调用构造函数之前就给$myvar赋了值,所以不管之后如何赋值,输出都是1。; ]8 l+ ?2 z# A$ z
! w8 i0 N8 |# Q8 C
18.PHP4中无法即时装载类——它们必须在使用前就仔细声明好。PHP5中,可以使用__autoload魔术函数提醒解释器在找不到需要的类时尝试自动调用。因此答案是D。
+ L4 C9 A5 E3 N" d. I
0 a  X- `$ E5 m3 U0 S5 h19.为软件设计和编程中的常规问题提供良好的解决方案,这显然是在说设计模式。
2 m; P" T6 t: s( I. L
0 n$ E1 j7 x- r+ s9 W" |20.脚本什么都不输出(答案是D)。因为子类的构造函数不会自动调用父类的构造函数。

返回列表
【捌玖网络】已经运行: