抽象类与其它类一样,允许定义变量及方法。
抽象类同样可以定义一个抽象的方法,抽象类的方法不会被执行,不过将有可能会在其派生类中执行。
例六:抽象类
<?php
abstract class foo {
protected $x;
abstract function display();
function setX($x) {
$this-x = $x;
}
}
class foo2 extends foo {
function display() {
// Code
}
}
?
__call
PHP5 的对象新增了一个专用方法 __call(),这个方法用来监视一个对象中的其它方法。如果你试着调用一个对象中不存在的方法,__call 方法将会被自动调用。
例七:__call
<?php
class foo {
function __call($name,$arguments) {
print("Did you call me? I'm $name!");
}
} $x = new foo();
$x-doStuff();
$x-fancy_stuff();
?
这个特殊的方法可以被用来实现过载(overloading)的动作,这样你就可以检查你的参数并且通过调用一个私有的方法来传递参数。
例八:使用 __call 实现过载动作
<?php
class Magic {
function __call($name,$arguments) {
if($name=='foo') {
if(is_int($arguments[0])) $this-foo_for_int($arguments[0]);
if(is_string($arguments[0])) $this-foo_for_string($arguments[0]);
}
} private function foo_for_int($x) {
print("oh an int!");
} private function foo_for_string($x) {
print("oh a string!");
}
} $x = new Magic();
$x-foo(3);
$x-foo("3");
?
__set 和 __get
这是一个很棒的方法,__set 和 __get 方法可以用来捕获一个对象中不存在的变量和方法。
例九: __set 和 __get
<?php
class foo {
function __set($name,$val) {
print("Hello, you tried to put $val in $name");
}
function __get($name) {
print("Hey you asked for $name");
}
}
$x = new foo();
$x-bar = 3;
print($x-winky_winky);
?
类型指示
在 PHP5 中,你可以在对象的方法中指明其参数必须为另一个对象的实例。
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/php/)例十:类型指示
<?php
class foo {
// code ...
}
class bar {
public function process_a_foo(foo $foo) {
// Some code
}
}
$b = new bar();
$f = new foo();
$b-process_a_foo($f);
?
可以看出,我们可以显性的在参数前指明一个对象的名称,PHP5 会识别出这个参数将会要是一个对象实例。
静态成员
静态成员和静态方法在面象对象编程的术语中被称作 对象方法(class methods) 和 对象变量(class variables)。
对象方法 在一个对象没有实例化前允许被调用。同样,对象变量 在一个对象没有实例化前可以被独立操作控制(不需要用一个对象的方法来控制)。
例十一:对象方法和对象变量
<?php
class calculator {
static public $pi = 3.14151692;
static public function add($x,$y) {
return $x $y;
}
}
$s = calculator::$pi;
$result = calculator::add(3,7);
print("$result");
?
异常处理
异常处理是公认的处理程序错误的理想方法,在 Java 及 C 中都有这个概念,我们欣喜的看到,在 PHP5 已经加入了这方面的应用。你可以尝试使用 try 和 catch 来控制程序的错误。
例十二:异常处理
<?php
class foo {
function divide($x,$y) {
if($y==0) throw new Exception("cannot divide by zero");
return $x/$y;
}
}
$x = new foo();
try {
$x-divide(3,0);
} catch (Exception $e) {
echo $e-getMessage();
echo "n<br /n";
// Some catastrophic measure here
}
?
上例中,我们使用了 try 来执行花括号中的语句,当有错误发生的时候,代码会把错误交给 catch 子句来处理,在 catch 子句中,你需要指明要把错误交给某个对象处理,这样做可以 猜你喜欢