e class and derived classes //$x->private_foo(); //Invalid private methods can only be used inside the class $x2 = new foo2(); $x2->display(); ?> 提示:对象中的变量总是以私有形式存在的,直接操作一个对象中的变量不是一个好的面向对象编程的习惯,更好的办法是把你想要的变量交给一个对象的方法去处理。
接口 (Interfaces)
众所周知,PHP4 中的对象支持继承,要使一个对象成为另一个对象的派生类,你需要使用类似 “class foo extends parent” 的代码来控制。 PHP4 和 PHP5 中,一个对象都仅能继承一次,多重继承是不被支持的。不过,在 PHP5 中产生了一个新的名词:接口,接口是一个没有具体处理代码的特殊对象,它仅仅定义了一些方法的名称及参数,此后的对象就可以方便的使用 ''implement'' 关键字把需要的接口整合起来,然后再加入具体的执行代码。
例五:接口
interface displayable { function display(); } interface printable { function doprint(); }
class foo implements displayable,printable { function display() { // code } function doprint() { // code } } ?> 这对提高代码的可读性及通俗性有很大的帮助,通过上面的例子可以看到,对象 foo 包含了 displayable 和 printable 两个接口,这时我们就可以清楚的知道,对象 foo 一定会有一个 display() 方法和一个 print() 方法,只需要去了解接口部分,你就可以轻易的操作该对象而不必去关心对象的内部是如何运作的。
抽象类
抽象类不能被实例化。 抽象类与其它类一样,允许定义变量及方法。 抽象类同样可以定义一个抽象的方法,抽象类的方法不会被执行,不过将有可能会在其派生类中执行。
例六:抽象类
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
class foo { function __call($name,$arguments) { print("Did you call me? I''m $name!"); } } $x = new foo(); $x->doStuff(); $x->fancy_stuff(); ?> 这个特殊的方法可以被用来实现“过载(overloading)”的动作,这样你就可以检查你的参数并且通过调用一个私有的方法来传递参数。
例八:使用 __call 实现“过载”动作
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
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 中,你可以在对象的方法中指明其参数必须为另一个对象的实例。
例十:类型指示
class foo { // code ... } class bar { public function process_a_foo(foo $foo) { // Some code } } $b = new bar(); |