A.Parent called" u4 m" ]7 x, Q% |+ |2 n
B.一个错误" M; @$ m: }" i7 S" h
C.一个警告 0 O7 p4 Y* h% {4 L/ CD.什么都没有 - v& |6 y7 B( Q9 N. p7 e0 H& O+ [( { - e+ r% H; @6 h( N9 ^) K ; W* k7 j; D5 h% N; [$ u% y2 i7 ^$ ~( U( j/ j. k; U) z& z
答案速查' ]( Q3 C/ u7 O+ V" M
1.类5 W( w) L3 z, J- o9 n, y# p* b
2.BCD2 Q4 v' k+ ~5 @
3.C- N2 N8 k: s- f$ a
4.C t7 J) p, }1 W3 M& L+ c+ ~4 b
5.A, a; B' E6 `. B" f1 j8 I. Q0 X/ L
6.C( p2 q% S4 b& E4 z3 _
7.C $ J; C# n$ o; m8.C 5 I0 d3 a' z, J; m7 T9.D1 f( u& M! k: x+ F. {/ d0 p2 e! O
10.B* K8 W$ h% f- e% u% ]
11.D2 E, p/ \9 T2 d4 P- U# r% d/ m4 o$ B4 u
12.B 3 [& Y+ e; H$ }1 H: N3 _; e13.A 6 [2 b7 r( H( y! @: N14.D- s% N- L- [0 C+ ?" k2 P
15.A - s2 f, y4 B6 }) ]2 ` _16.B + G, T3 K* r$ ?. |& c+ P17.A% A4 Q1 ] c' R" A5 D
18.D : M$ {5 |0 h+ k0 n7 P19.设计模式# `/ x5 d; U5 d) l2 K2 E7 j
20.D# Q6 m) m6 l0 V5 {5 m. k
* T0 d- a8 k( U/ ?2 U
. q* I& G" P* Y s: P0 \2 T
3 M" ~1 _* b' U( y6 c/ W6 j# _答案详解* i' y) Y9 x: g) K6 y# X4 z
. [" S& B6 P. n7 G6 w' |$ H9 }
1.类是对象的蓝图(对象是类的实例)。 . \+ G/ s$ i- V) [4 A 3 e1 v8 P- _7 |6 N2 \- E( a' \2.正确答案是B、C和D。set_value方法使用了错误的表达式$this->$my_value,因此该方法实际上是空的(这在PHP5里会导致一个错误,但在PHP4中不会。——译者注)。* p; j, n8 i4 e& @
* v3 S. [# n# q9 f5 r1 b
3.答案是C。PHP4中无法限制对类成员的访问,而在PHP5中则可以通过private关键字实现。 & R9 z- G* U3 b, C8 Z) M: s$ W0 q8 Z4 E
4.单件模式可以限制一个类被实例化的次数。* Y' ^' W0 F8 c, d
1 }4 t! z8 F9 P+ I, ^5.尽管其他编程语言允许多重继承,但在PHP的对象模型中却不可以。因此答案是A。# _5 `" J7 d* e8 Y2 N" p
8 D' u( e! _: E. k9 s
6.方框中的代码表现的是抽象方法(abstrace method)的实现。如果这个类继承自其他类,而my_funct方法在子类中被调用时没有覆盖,代码将抛出一个错误。虽然只是近似的实现了抽象方法,但在PHP4有限的对象模型中,这已经做得很好了。/ \" z# p/ w. j; n- C3 z
* ^5 o/ V1 O! T, o1 ?7.PHP5有统一的构造函数(__construct()),但在PHP4中,构造函数就是和类有相同名称的方法。对于名为testclass的类,它的构造函数就是testclass()。答案是C。% P; X x% h0 @, l0 @5 m/ f
0 b) P: ]& Z' P7 M6 T7 |8.__sleep()和__wakeup()能被用来自定义对象的序列化过程。正确答案是C。) N+ b) M' Q. c+ b% d: h/ \
' }. |5 i8 P" m% {: e5 N9.PHP4中没有题目选项里所列的任何一个概念。答案是D。 7 ]5 I+ Y8 H7 Z+ F ( m# l1 x7 W3 C- d10.PHP中,在类的内部访问其成员和方法,要用$this这个特殊变量。因此答案是B。 # W: R1 V; g/ V& ` 9 {0 K( I; R' n( z; I' N. k Y11.正确答案是D。my_class::_my_class()不是合法的构造函数(方法名的开头多了个_),因此脚本不会输出任何东西。你可能觉得这题是在考眼力而不是知识,是的,我们就是这么打算。仔细想想你就会同意——绝大多数的bug都是由错误的拼写造成的。这题并不是在戏弄你,而是考验你的排错能力。 / s0 Y4 t- z, `5 K3 [& w0 K/ X5 V6 j% T, q$ k) C$ `
12.PHP4把对象视作标量进行处理,当$a赋给$b时,解释器创建对象的副本,因此对后一个对象的赋值不会影响到原先的对象。答案是B。但是要注意,PHP5里就不是这样处理的了(将会输出10)。$ n% ]& L6 }9 k
) \1 X! m' `+ C- q3 ^7 I$ |
13.一上来,构造函数my_class通过引用,将自身存储在了变量$global_obj中。你可能会因此觉得,当我们后来吧$global_obj->my_value的值变为10时,$a也会相应改变。不幸的是,new操作符返回的不是引用,而是对象的副本。脚本输出5,答案是A。 $ F* S6 N# s* b+ |2 w% k1 F& K 6 S0 X9 ]( y5 \# _14.PHP中,把对象传递给函数或者方法时,默认传递的是值。这意味着通过参数传递给函数的对象,其实是对象的副本。这点导致了在函数或方法里对对象进行改动时,不会影响函数外的原先的那个对象。/ b! V$ R- L' F! r. x& @! L
回到第14题中,这就说明对象$eight_tenths从来没有被reduce_fraction函数改动过,而$fraction对象(参数)则被改动了。如果要在函数内部改动对象,就必须以引用的方式传递参数: % u. {: l9 i+ y+ b& ~6 C' j5 V$ v9 n function reduce_fraction(&$fraction) . {% K% ?& }% ?4 U7 w o2 T: ~答案是D。 4 e5 L2 U" s( G1 h# n! y$ e ) K |/ u1 u3 ^15.题中所示的语法是用来进行静态调用的。当方法被静态调用时,它们就像一个独立的函数,与任何类的实例无关。答案是A。6 p6 k n( s, }7 M/ s5 Q
j: m6 i! d \% S. b7 u& e
16.没有。PHP4只允许声明静态函数变量,没有静态类变量。/ Y6 d5 p8 q# E' X
' l7 b0 a: z' {8 n+ b
17.答案是A。类b的属性$myvar将在b的父类——类a调用构造函数时被定义,此外,像PHP4中的普通变量一样,定义类变量时也不需要给它赋值。类b在其父类调用构造函数之前就给$myvar赋了值,所以不管之后如何赋值,输出都是1。 / N- }) s& G* X4 R1 l4 R" D) e 1 F% t( i" {$ F6 Z/ [% Y18.PHP4中无法即时装载类——它们必须在使用前就仔细声明好。PHP5中,可以使用__autoload魔术函数提醒解释器在找不到需要的类时尝试自动调用。因此答案是D。 & z M' ~! `; H# ?3 D% Q$ S8 V7 h' o' g6 G
19.为软件设计和编程中的常规问题提供良好的解决方案,这显然是在说设计模式。! a$ X6 G( d; [5 N3 F) X8 H
; Z/ f* @6 V$ ?
20.脚本什么都不输出(答案是D)。因为子类的构造函数不会自动调用父类的构造函数。