一、封装
修饰符表现了其封装性:
a.public 表示全局的。类内部、类外部、子类都可以使用
b.protected 表示受保护的,只有本类和子类可以使用
c.private 表示私有的,只能在本类中使用
小结:
1这三个修饰符作用于类的属性和方法
2类的方法如果不写修饰符,默认是public
3但是属性不写修饰符会报语法错误
4私有的和受保护的想要在外部使用可以像在java中定义get/set方法,在get/set方法中还能给访问设置权限[用判断的方法:例如
public function getFee(){
if($this->name=="张三"){
return self::$fee;
}else{
return $this->name."不能访问";
}
}
}
]
5private和protected的访问还有一种方法(魔术方法):
__set/__get方法
function __set($pro_name,$pro_val){
$this->pro_name=$pro_val;
}
function __get($pro_name){
if(isset($pro_name)){
return $this->pro_name;
}else{
return null;
}
}
//只能在外部才能设值
二、继承
<?php
class Student{//父类(在这个区域可以访问到public和protected和private做修饰符的变量和属性)
public $name;
protected $age=20;
private $grade=100;
function __construct(){
echo "父类构造方法<br/>";
}
public function showInfo(){
echo "父类可以访问||名字:".$this->name."||年龄:".$this->age."||成绩:".$this->grade."<br/>";
}
protected function showInfo2(){
echo "efesfafsaf<br/>";
}
}
class Pupil extends Student{//子类(在这个区域可以访问到public和protected做修饰符的变量和属性)
function __construct(){
Student::__construct();//1.显示的调用父类的构造方法
parent::showInfo2();//调用父类的成员方法
echo "子类构造方法<br/>";
}
public function testing(){
echo "子类可以访问||名字:".$this->name."和年龄".$this->age."<br/>";
echo "小学生考试<br/>";
}
}
class Graduate extends Student{//子类(在这个区域可以访问到public和protected做修饰符的变量和属性)
function __construct(){
parent::__construct();
//2.显示的调用父类的构造方法
Student::showInfo2();
echo "子类构造方法<br/>";
}
public function testing(){
echo "子类可以访问||名字:".$this->name."和年龄".$this->age."<br/>";
echo "研究生考试<br/>";
}
}
/*
$stu1=new Pupil();//是一个外部区域,在这个区域只能访问到public做修饰符的变量和属性
$stu1->name="zhang";
echo "外部可以访问||名字:".$stu1->name."<br/>";
$stu1->showInfo();
$stu1->testing();
*/
$stu2=new Graduate();
$stu2->name="li";
$stu2->showInfo();
$stu2->testing();
?>
继承小结:
1.实现代码的复用性。
2.extends只能继承public修饰符的变量和方法
3.在创建(new)子类时,默认情况下不会自动去调用父类的构造方法,这个和java不一样
如果在创建子类对象是没有写构造方法,但是父类有构造方法,那么就会去调用父类的构造方法,但是子类如果定义了构造方法,父类的构造方法就不会被调用
方法重载5中通过魔术方法来实现重载的效果
<?php
class Test{
function test1($p){
echo "接收一个参数:".$p[0]."<br/>";
}
function test2($p){
echo "接收两个参数:";
for($i=0;$i<count($p);$i++){
echo $p[$i]." ";
}
}
/***
$a是想要调用的方法名字
$p是传的参数的数组
*/
function __call($a,$p){//系统自己调用该方法
if($a=="test"){
if(count($p)==1){
$this->test1($p);
}else if(count($p)==2){
$this->test2($p);
}
}else{
echo "没有定义该方法";
}
}
}
$test=new Test();
$test->test("nihoa");//test和__call方法中的$a=="test"的test一致,该test可以自己定义
$test->test("世界","你好");
?>
方法的重写/方法覆盖(override)
方法的重写是为了解决同一种事物,有相同的行为,但是具体实现不同而出现的。比如:动物都可以叫,但是各种动物的叫法不一样,这时就需要方法重写了。
方法的重写必须有父类和子类的关系下才有重写。因为方法重写,是重写父类的方法。
方法名一样,参数个数一样