几个PHP面向对象小实例

抽象类:抽象类不能被实例化,抽象类与其它类一样,允许定义变量及方法,抽象类同样可以定义一个抽象的方法,抽象类的方法不会被执行,不过将有可能会在其派生类中执行。

例1:抽象类

  1. <?php
  2. abstract class foo {
  3. protected $x;
  4. abstract function display();
  5. function setX($x) {
  6. $this->x = $x;
  7. }
  8. }
  9. class foo2 extends foo {
  10. function display() {
  11. // Code
  12. }
  13. }
  14. ?>

__call:PHP5 的对象新增了一个专用方法 __call(),这个方法用来监视一个对象中的其它方法。如果你试着调用一个对象中不存在的方法,__call 方法将会被自动调用。

例2:__call

  1. <?php
  2. class foo {
  3. function __call($name,$arguments) {
  4. print("Did you call me? I'm $name!");
  5. }
  6. } $x = new foo();
  7. $x->doStuff();
  8. $x->fancy_stuff();
  9. ?>

这个特殊的方法可以被用来实现“过载(overloading)”的动作,这样你就可以检查你的参数并且通过调用一个私有的方法来传递参数。

例3:使用 __call 实现“过载”动作

  1. <?php
  2. class Magic {
  3. function __call($name,$arguments) {
  4. if($name=='foo') {
  5. if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);
  6. if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);
  7. }
  8. } private function foo_for_int($x) {
  9. print("oh an int!");
  10. } private function foo_for_string($x) {
  11. print("oh a string!");
  12. }
  13. } $x = new Magic();
  14. $x->foo(3);
  15. $x->foo("3");
  16. ?>

__set 和 __get

这是一个很棒的方法,__set 和 __get 方法可以用来捕获一个对象中不存在的变量和方法。

例4: __set 和 __get

  1. <?php
  2. class foo {
  3. function __set($name,$val) {
  4. print("Hello, you tried to put $val in $name");
  5. }
  6. function __get($name) {
  7. print("Hey you asked for $name");
  8. }
  9. }
  10. $x = new foo();
  11. $x->bar = 3;
  12. print($x->winky_winky);
  13. ?>