当前位置:K88软件开发文章中心编程语言PHPPHP01 → 文章内容

PHP 面向对象

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-11 12:38:36

。在定义和使用常量的时候不需要使用 $ 符号。常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字(如 self,parent 或 static)。实例<?phpclass MyClass{ const constant = '常量值'; function showConstant() { echo self:





:





constant . PHP_EOL; }}echo MyClass:





:





constant . PHP_EOL;$classname = "MyClass";echo $classname:





:





constant . PHP_EOL; // 自 5.3.0 起$class = new MyClass();$class->showConstant();echo $class:





:





constant . PHP_EOL; // 自 PHP 5.3.0 起?>抽象类任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。定义为抽象的类不能被实例化。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。<?phpabstract class AbstractClass{ // 强制要求子类定义这些方法 abstract protected function getValue(); abstract protected function prefixValue($prefix); // 普通方法(非抽象方法) public function printOut() { print $this->getValue() . PHP_EOL; }}class ConcreteClass1 extends AbstractClass{ protected function getValue() { return "ConcreteClass1"; } public function prefixValue($prefix) { return "{$prefix}ConcreteClass1"; }}class ConcreteClass2 extends AbstractClass{ public function getValue() { return "ConcreteClass2"; } public function prefixValue($prefix) { return "{$prefix}ConcreteClass2"; }}$class1 = new ConcreteClass1;$class1->printOut();echo $class1->prefixValue('FOO_') . PHP_EOL;$class2 = new ConcreteClass2;$class2->printOut();echo $class2->prefixValue('FOO_') . PHP_EOL;?>执行以上代码,输出结果为:ConcreteClass1FOO_ConcreteClass1ConcreteClass2FOO_ConcreteClass2此外,子类方法可以包含父类抽象方法中不存在的可选参数。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则也是可以正常运行的。<?phpabstract class AbstractClass{ // 我们的抽象方法仅需要定义需要的参数 abstract protected function prefixName($name);}class ConcreteClass extends AbstractClass{ // 我们的子类可以定义父类签名中不存在的可选参数 public function prefixName($name, $separator = ".") { if ($name == "Pacman") { $prefix = "Mr"; } elseif ($name == "Pacwoman") { $prefix = "Mrs"; } else { $prefix = ""; } return "{$prefix}{$separator} {$name}"; }}$class = new ConcreteClass;echo $class->prefixName("Pacman"), "\n";echo $class->prefixName("Pacwoman"), "\n";?>输出结果为:Mr. PacmanMrs. PacwomanStatic 关键字声明类属性或方法为 static(静态),就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。静态属性不可以由对象通过 -> 操作符来访问。自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。<?phpclass Foo { public static $my_static = 'foo'; public function staticValue() { return self:





:





$my_static; }}print Foo:





:





$my_static . PHP_EOL;$foo = new Foo();print $foo->staticValue() . PHP_EOL;?>    执行以上程序,输出结果为:foofooFinal 关键字PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。以下代码执行会报错:<?phpclass BaseClass { public function test() { echo "BaseClass:





:





test() called" . PHP_EOL; } final public function moreTesting() { echo "BaseClass:





:





moreTesting() called" . PHP_EOL; }}class ChildClass extends BaseClass { public function moreTesting() { echo "ChildClass:





:





moreTesting() called" . PHP_EOL; }}// 报错信息 Fatal error:





Cannot override final method BaseClass:





:





moreTesting()?>调用父类构造方法PHP 不会在子类的构造方法中自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用 parent:





:





__construct() 。<?phpclass BaseClass { function __construct() { print "BaseClass 类中构造方法" . PHP_EOL; }}class SubClass extends BaseClass { function __construct() { parent:





:





__construct(); // 子类构造方法不能自动调用父类的构造方法 print "SubClass 类中构造方法" . PHP_EOL; }}class OtherSubClass extends BaseClass { // 继承 BaseClass 的构造方法}// 调用 BaseClass 构造方法$obj = new BaseClass();// 调用 BaseClass、SubClass 构造方法$obj = new SubClass();// 调用 BaseClass 构造方法$obj = new OtherSubClass();?>执行以上程序,输出结果为:BaseClass 类中构造方法BaseClass 类中构造方法SubClass 类中构造方法BaseClass 类中构造方法

上一页  [1] [2] [3] 


PHP 面向对象