小白教程

 找回密码
 立即注册
小白教程 首页 系列教程 PHP系列教程 查看内容

PHP 面向对象

发布者: 小白教程



抽象类

任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。

定义为抽象的类不能被实例化。

被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。

继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。

  1. <?php
  2. abstract class AbstractClass
  3. {
  4. // 强制要求子类定义这些方法
  5. abstract protected function getValue();
  6. abstract protected function prefixValue($prefix);
  7. // 普通方法(非抽象方法)
  8. public function printOut() {
  9. print $this->getValue() . PHP_EOL;
  10. }
  11. }
  12. class ConcreteClass1 extends AbstractClass
  13. {
  14. protected function getValue() {
  15. return "ConcreteClass1";
  16. }
  17. public function prefixValue($prefix) {
  18. return "{$prefix}ConcreteClass1";
  19. }
  20. }
  21. class ConcreteClass2 extends AbstractClass
  22. {
  23. public function getValue() {
  24. return "ConcreteClass2";
  25. }
  26. public function prefixValue($prefix) {
  27. return "{$prefix}ConcreteClass2";
  28. }
  29. }
  30. $class1 = new ConcreteClass1;
  31. $class1->printOut();
  32. echo $class1->prefixValue('FOO_') . PHP_EOL;
  33. $class2 = new ConcreteClass2;
  34. $class2->printOut();
  35. echo $class2->prefixValue('FOO_') . PHP_EOL;
  36. ?>

执行以上代码,输出结果为:

  1. ConcreteClass1
  2. FOO_ConcreteClass1
  3. ConcreteClass2
  4. FOO_ConcreteClass2

此外,子类方法可以包含父类抽象方法中不存在的可选参数。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则都是可以正常运行的。

  1. <?php
  2. abstract class AbstractClass
  3. {
  4. // 我们的抽象方法仅需要定义需要的参数
  5. abstract protected function prefixName($name);
  6. }
  7. class ConcreteClass extends AbstractClass
  8. {
  9. // 我们的子类可以定义父类签名中不存在的可选参数
  10. public function prefixName($name, $separator = ".") {
  11. if ($name == "Pacman") {
  12. $prefix = "Mr";
  13. } elseif ($name == "Pacwoman") {
  14. $prefix = "Mrs";
  15. } else {
  16. $prefix = "";
  17. }
  18. return "{$prefix}{$separator} {$name}";
  19. }
  20. }
  21. $class = new ConcreteClass;
  22. echo $class->prefixName("Pacman"), "\n";
  23. echo $class->prefixName("Pacwoman"), "\n";
  24. ?>

输出结果为:

  1. Mr. Pacman
  2. Mrs. Pacwoman

Static 关键字

声明类属性或方法为 static(静态),就可以不实例化类而直接访问。

静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。

由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。

静态属性不可以由对象通过 -> 操作符来访问。

自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。

  1. <?php
  2. class Foo {
  3. public static $my_static = 'foo';
  4. public function staticValue() {
  5. return self::$my_static;
  6. }
  7. }
  8. print Foo::$my_static . PHP_EOL;
  9. $foo = new Foo();
  10. print $foo->staticValue() . PHP_EOL;
  11. ?>

执行以上程序,输出结果为:

  1. foo
  2. foo


Archiver|手机版|小黑屋|小白教程 ( 粤ICP备20019910号 )

GMT+8, 2024-9-20 01:44 , Processed in 0.016397 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

返回顶部