PHP面向对象编程(imooc)代码合集(三)

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\n";
   }
   
   public function moreTesting() {
       echo "BaseClass::moreTesting() called\n";
   }
}

class ChildClass extends BaseClass {
  
  // 重写时参数不一定要跟父类完全一致
   public function moreTesting($tmp=null) {
       echo "ChildClass::moreTesting() called\n";
   }
}
// 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\n";
   }
   
   public function moreTesting() {
       echo "BaseClass::moreTesting() called\n";
   }
}

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\n";
       parent::moreTesting(); // parent关键字可以访问父类被重写的成员
       // step 3 self关键字可以访问该类自身的其他成员
       self::called();
       // step 4 self关键字可以访问该类定义的常量
       echo "CONST_VALUE: " . self::CONST_VALUE."\n";
       // 常量不能被赋值修改
       // self::CONST_VALUE = 11;
       // step 5 static关键字可以访问静态成员,当调用静态属性时记得加$符号
       echo "sValue: " . static::$sValue."\n";
  }
  // step 3
  public function called(){
    echo "ChildClass::called() called\n";
  }
 }
// 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 . "\n";
  }
}

// Animal类实现了ICanEat接口
class Animal implements ICanEat {
  public function eat($food){
    echo "Animal eating " . $food . "\n";
  }
}

// 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(){}
}


?>

 

posted @ 2015-12-05 09:37  constructora  阅读(174)  评论(0编辑  收藏  举报