php面向对象三大特征

一、封装

修饰符表现了其封装性:

    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]."&nbsp;";
}

}
/***
$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)

方法的重写是为了解决同一种事物,有相同的行为,但是具体实现不同而出现的。比如:动物都可以叫,但是各种动物的叫法不一样,这时就需要方法重写了。

方法的重写必须有父类和子类的关系下才有重写。因为方法重写,是重写父类的方法。

方法名一样,参数个数一样

posted on 2014-05-22 17:31  smile小红帽  阅读(547)  评论(0编辑  收藏  举报