作业内容:1、练习课上所学知识
PHP 封装
可用public
、protected
、private
来修饰对象的属性和方法,使用不同修饰符的属性和方法,其可被访问的权限也不同:
- 使用
public
修饰的属性和方法可以在任何地方调用,如果在类中的属性和方法前面没有修饰符,则默认修饰符为public
。 - 使用
protected
修饰的属性和方法可在本类和子类中被调用,在其他地方调用将会报错。 - 使用
private
修饰的属性和方法只能在本类中被访问。
<?php
// 定义一个父类
class Father{
public $name; // 姓名(公有)
private $age; // 年龄(私有)
protected $weight; // 体重(保护)
// 构造函数
public function __construct($name, $age, $weight){
$this->name = $name;
$this->age = $age;
$this->weight = $weight;
}
// 根据属性名获取属性值
public function get($key){
return $this->$key;
}
}
class Son extends Father{
// 为了跟父类区别开,重新定义了一个相同功能的方法
public function key($key){
return $this->$key;
}
public function get_weight(){
return $this->weight;
}
}
$obj1 = new Father('sunny', 22, '60kg');
echo $obj1->name; //输出sunny
// echo $obj1->age; //将会报错:Cannot access private property Father::$age,因为age是私有的
// echo $obj1->weight; //将会报错: Cannot access protected property Father::$weight,因为weight是受保护的
echo $obj1->get('age'); //但可以通过公用方法访问
echo $obj1->get('weight'); //但可以在子类内部调用
// --------------华丽的分隔线------------------------------
$obj2 = new Son('rain', 23, '70kg');
echo $obj2->name; // 输出rain
echo $obj2->key("weight"); // 输出70kg,因为weight是protected,可以继承到子类
// echo $obj2->key('age'); // 报错,Undefined property: Son::$age,age变量只能在父类中使用,没有继承到子类
echo $obj2->get('age'); // 输出23,因为这个是调用父类了,所以可以正常显示
?>
PHP 继承
把一个类作为公共基类,其他的类继承自这个类,则其他类中都具有这个基类的属性和方法,其他类也可各自额外定义自己不同的属性和方法。
类的继承使用关键词extends
,在子类中可使用parent
访问父类的方法。在子类中可重写父类的方法。
<?php
// 定义一个父类
class Father{
public $name; // 姓名(公有)
private $age; // 年龄(私有)
protected $weight; // 体重(保护)
// 构造函数
public function __construct($name, $age, $weight){
$this->name = $name;
$this->age = $age;
$this->weight = $weight;
}
public function like(){
echo "我爱编程";
}
public function age(){
echo $this->name .'今年'. $this->age . '岁了';
}
protected function get($key){
return $this->$key;
}
// 根据$key设置值$value
public function set($key, $value){
$this->$key = $value;
}
}
// 子类继承父类
class Son extends Father{
// 重写父类方法
public function get($key){
echo $this->$key;
}
public function what(){
echo parent::like(); // 访问父类方法
}
public function getAge(){
$this->age(); // 调用父类继承来的方法
}
}
// 子类会调用父类构造函数初始化实例
$obj = new Son('sunny', 22, '60kg');
$obj->get('name'); // 子类get方法输出sunny
$obj->what(); // 子类what()方法内调用父类like()方法
$obj->set('age', 33); // 直接调用父类继承来的方法
$obj->getAge(); // 子类getAge()方法调用子类从父类继承来的age()方法
?>
这里需要再介绍一个关键词
final
,加在方法前,则该方法不允许重写,如果加在类前,则该类不允许被继承
PHP 多态
多态通过继承复用代码而实现,可编写出健壮可扩展的代码,减少流程控制语句(if else)的使用
<?php
class Animal{
// 该方法将会在子类中被重写
public function talk(){
echo '动物会叫';
}
}
class Cat extends Animal{
public function talk(){
echo '小猫喵喵叫';
}
}
class Dog extends Animal{
public function talk(){
echo '小狗汪汪叫';
}
}
function talk($obj){
$obj->talk();
}
talk(new Cat()); // 输出小猫喵喵叫
talk(new Dog()); // 小狗汪汪叫
?>