重写又叫覆盖,就是将从父类继承下来的属性或方法重新“定义”——就是从新写。
但注意:子类覆盖父类的方法,虽然可以去调用父类的同名方法去完成一定的工作,但不是必须的。也有可能父类的该方法所执行的结果并不适合子类,此时子类就去完全自己写了。
重写的基本要求:
访问控制权限:
下级的访问控制权限应该不低于上级的访问控制权限:
上级:public 下级:只能public
上级:protected 下级: protected, public
上级:private 下级:private protected public——实际此情况无意义。
私有的不能覆盖,而是完全当作自己全新的。
方法的参数形式:
应该跟父类的一致。
//重写
//class teacher{
// public $name = "张三";
// public $age = "20";
// public $subject = "语文";
// function intro(){
// echo "My".$this->name."age".$this->age;
// }
//}
//class student extends teacher{
// public $name = "李四";
// public $age = "25";
// public $sex = "男";
// function intro(){
// echo "My".$this->name."age".$this->age."sex".$this->sex;
// }
构造方法的重写问题:构造方法不但可以像其他普通方法一样重写,而且,比普通方法更宽松:重写的时候参数可以不一致。
最终类final class:
通常,一个类,没有特别声明的话,则“别人”就可以随意拿过来使用并对之进行“扩展”——继承。
但是:
如果某个类不希望对其进行扩展,则可以将其声明为“最终类”。
形式:
final class 类名{ 。。。。类定义。。。。}
最终方法final method
通常,一个方法,如果没有特别声明,则下级类就可以对其进行“覆盖”(重写)。
但是:
如果某个方法不希望被下级类覆盖,就可以对其生命为“最终方法”。
形式:
final function 方法名(){。。。。方法定义。。。。}
//final,不能被继承、重写、调用
final class teacher{
public $name = "张三";
public $age = "20";
public $subject = "语文";
final function intro(){
echo "My".$this->name."age".$this->age;
}
}
class student extends teacher{
public $name = "李四";
public $age = "25";
public $sex = "男";
function intro(){
echo "My".$this->name."age".$this->age."sex".$this->sex;
}
}
$stu = new student();
$stu->intro();
工厂模式
在实际应用中,我们总是需要去实例化很多很多的类——以得到对象。
则:
我们可以设计出一个“工厂”(其实就是类),该工厂的作用(任务)就是为人们“生产”各种对象。这种工厂通常只要指定类名,就可以据此获取一个该类的对象。
class factory{
//Instance表示“实例”,“对象”
static function getInstance($className){
if(file_exists('./class/' . $className . ".class.php")){
$obj1 = new $className();
return $obj1;
}
else{
return null;//也可以die();
}
}
}
$obj1 = factory::getInstance("A");//获取类A的一个对象
$obj2 = factory::getInstance("B");//获取类B的一个对象
$obj3 = factory::getInstance("A");//再获取类A的一个对象