class07
overwrite(重写)和Final关键字
overwrite(重写):在子类中编写一个与父类function完全一样的function,实现子类特定的功能
final关键字:final翻译过来就是"最终"的意思。final定义的函数或类,不能被子类重写,如果重写将会报错
<?php date_default_timezone_set("PRC"); /** * 重写和Final * 1. 子类中编写跟父类完全一致的方法可以完成对父类方法的重写 * 2. 对于不想被任何类继承的类可以在class之前添加final关键字 * 3. 对于不想被子类重写(overwrite, 修改)的方法,可以在方法定义前面添加final关键字 */ class BaseClass { public function test() { echo "BaseClass::test() called "; } public function moreTesting() { echo "BaseClass::moreTesting() called "; } } class ChildClass extends BaseClass { // 重写时参数不一定要跟父类完全一致 public function moreTesting($tmp=null) { echo "ChildClass::moreTesting() called "; } } // Results in Fatal error: Cannot override final method BaseClass::moreTesting() $obj = new ChildClass(); $obj->moreTesting(); ?>
class08数据访问补充
* 1. parent关键字可以用于调用父类被重写的类成员 * 2. self关键字可以用于访问类自身的成员方法,也可以用于访问自身的静态成员和类常量;不能用于访问类自身的属性;访问类常量时不用在常量名称前面加$符号 * 3. static关键字用于访问类自身定义的静态成员,访问静态属性时需要在属性名前面添加$符号
<?php date_default_timezone_set("PRC"); /** * 数据访问补充 * 1. parent关键字可以用于调用父类被重写的类成员 * 2. self关键字可以用于访问类自身的成员方法,也可以用于访问自身的静态成员和类常量;不能用于访问类自身的属性;访问类常量时不用在常量名称前面加$符号 * 3. static关键字用于访问类自身定义的静态成员,访问静态属性时需要在属性名前面添加$符号 */ class BaseClass { public function test() { echo "BaseClass::test() called "; } public function moreTesting() { echo "BaseClass::moreTesting() called "; } } class ChildClass extends BaseClass { public $height="198cm"; private static $sValue = "static value"; const CONST_VALUE = 'A constant value'; public function moreTesting() { echo "ChildClass::moreTesting() called "; parent::moreTesting(); // parent关键字可以访问父类被重写的成员 // step 3 self关键字可以访问该类自身的其他成员 self::called(); // step 4 self关键字可以访问该类定义的常量 echo "CONST_VALUE: " . self::CONST_VALUE." "; // 常量不能被赋值修改 // self::CONST_VALUE = 11; // step 5 static关键字可以访问静态成员,当调用静态属性时记得加$符号 echo "sValue: " . static::$sValue." "; } // step 3 public function called(){ echo "ChildClass::called() called "; } } // Results in Fatal error: Cannot override final method BaseClass::moreTesting() $obj = new ChildClass(); $obj->moreTesting(); ?>
class09接口
接口和类不同的地方在于,接口定义的方法没有具体实现,所以可以说是“一种没有实现具体方法的类”;要实现接口的方法,必须通过一般的class来实现。引入接口的好处在于,工程开发中把要编写的function功能层次地列举出来,方便其他版块开发人员的调用
/** * 接口 * 1. 接口的基本概念和基本使用方法 * 2. 接口里面的方法没有具体的实现 * 3. 实现了某个接口的类必须提供接口中定义的方法 * 4. 不能用接口创建对象,但是能够判断某个对象是否实现了某个接口 * 5. 接口可以继承接口(interface extends interface) * 6. 接口中定义的所有方法都必须是公有,这是接口的特性。 */
<?php date_default_timezone_set("PRC"); /** * 接口 * 1. 接口的基本概念和基本使用方法 * 2. 接口里面的方法没有具体的实现 * 3. 实现了某个接口的类必须提供接口中定义的方法 * 4. 不能用接口创建对象,但是能够判断某个对象是否实现了某个接口 * 5. 接口可以继承接口(interface extends interface) * 6. 接口中定义的所有方法都必须是公有,这是接口的特性。 */ interface ICanEat { public function eat($food); } // Human类实现了ICanEat接口 class Human implements ICanEat { // 跟Animal类的实现是不同的 public function eat($food){ echo "Human eating " . $food . " "; } } // Animal类实现了ICanEat接口 class Animal implements ICanEat { public function eat($food){ echo "Animal eating " . $food . " "; } } // step1 不同的类可以实现同一个接口,定义接口方法的不同实现 $man = new Human(); $man->eat("Apple"); $monkey = new Animal(); $monkey->eat("Banana"); // step2 尝试删除Human的eat方法并运行 // 实现了某个接口的类必须提供接口中定义的方法 // step3 不能用接口创建对象,但是能够判断某个对象是否实现了某个接口 //$eatObj = new ICanEat(); var_dump($man instanceof ICanEat); // 判断某个对象是否实现了某个接口 // step 4 接口可以继承接口 interface ICanPee extends ICanEat { public function pee(); } class Human1 implements ICanPee{ public function pee(){} } ?>