韩顺平php视频笔记71 面向对象编程的三大特征2 访问修饰符 继承

php提供了三种访问控制符号.

有三种

1. public  表示全局,可以在本类,类外部,子类 中使用

2. protected 表示受到保护, 可以在本类子类中使用

3. private 表示私有只能在本类使用 

 

这三个控制修饰符号可以对 属性 和 方法修饰

1. 如果一个方法没有访问修饰符,则默认是public 

2. 属性 必须指定访问修饰符

 

☞ 方法之间可以互相调用但是需要使用 $this引用

function test11(){

$this->test12();

}

protected function test12(){

echo "test12 hello";

}

 

举例说明:

class Person{

public $name;

protected  $age;

private  $salary;

 

function __construct($name,$age,$salary){

$this->name=$name;

$this->age=$age;

$this->salary=$salary;

}

 

//成员方法

function showInfo(){

//这里说明在本类中可以使用 public protected private 修饰的变量.

echo $this->name."||".$this->age."||".$this->salary;

 

}

 

}

 

//创建一个人

$p1=new Person("孙悟空",30,1000);

 

echo $p1->name; //可以

echo $p1->age;//报错

echo $p1->salary;//报错.

 

我们现在就想去访问protected 变量或者 private 变量通常的做法是提供 public 函数去访问 这些变量形式是 

public function setXxx($val){

}

public function getXxx(){

}

public function showInfo(){

}

 

public protected private 可以修饰属性和方法

 

 

(1) 查看 薪水 (private )

//获取这个人的薪水

public function getSalary($user,$pass){

if($user=="shunping" && $pass="123"){

return $this->salary;

}else{

return "sorry,你无法看";

}

}

(2) 修改人的年龄

 

提供了两个函数.

//修改年龄,对输入的值,进行校验.

public function setAge($age){

if($age>1 && $age<120){

 

$this->age=$age;

}else {

echo "年龄范围不对";

}

 

}

 

//查看年龄

public function getAge(){

return $this->age;

}

 

还有一种形式通过 一对 __set  和 __get方法来操作我们的变量,不推荐.


class A{

private $n1;

private $n2;

private $n3;

 

//使用__set 方法来管理所有的属性

public function __set($pro_name,$pro_val){

$this->pro_name=$pro_val;

}

 

//使用__get 可以获取所有的属性值

public function  __get($pro_name){

if(isset($pro_name)){

return $this->pro_name;

}else{

return null;

}

}

 

}

 

$a1=new A();

$a1->n1="hello";

echo $a1->n1;

$a1->n2=890;

echo "||".$a1->n2;

 

不推荐的理由:1给人的感觉:破坏了封装性2对所有属性都统一操作,无法对某些属性进行单独限制

 

可以直接写一个方法来操作private,protected变量

class Peron{

protected n1;

private $n2;

function showInfo($n1){

       $this->n1=$n1;

echo $this->n1.”||”$this->n2;

}

}


-------------------------------------------------------------------------------------------------------------------------------------

继承:---php与java一样都是单重继承,可以通过a entends b,b extends c来实现多次继承(多重继承可能导致重名的方法)

继承可以提高代码的复用性

为什么需要继承

 

//应用场景 开发一套学生管理系统(Pupil, Graduate , ...)

 

//小学生类

class Pupil{

public $name;

protected $age;

protected $grade;

public function showInfo(){

echo $this->name."||".$this->age;

}

 

public function tesing(){

echo " 小学生考试..";

}

 

}

 

//研究生类

class Graduate{

public $name;

protected $age;

protected $grade;

public function showInfo(){

echo $this->name."||".$this->age;

}

 

public function tesing(){

echo "研究生考试..";

}

}

 

从上面的代码我们看出,代码的复用性不高,同时也会让管理代码成本增高.

è 解决之道(继承);

 

现在我们使用继承对上面的代码,进行改写.

 

代码:

 

//应用场景 开发一套学生管理系统(Pupil, Graduate , ...)

//父类

class Stu{

public $name;

protected $age;

protected $grade;

public function showInfo(){

echo $this->name;

}

 

}

//子类

class Pupil extends Stu{

public function testing(){

echo " 小学生考试..";

}

 

}

 

class Graduate extends Stu{

public function testing(){

echo "研究生考试..";

}

}

 

//创建学生

$stu1=new Pupil();

$stu1->name="小明";

$stu1->testing();

$stu1->showInfo();

//创建一个研究生

$stu2=new Graduate();

$stu2->name="老明";

$stu2->testing();

$stu2->showInfo();

 

☞ 从上面的代码我们可以看出:

所谓继承就是 一个子类 通过 extends  父类  把父类的 (public / protected)属性和(public / protected)方法继承下来.

 

继承的基本语法是:

 

class 类名 extends 父类名{

//在写自己需要的属性和方法.

}




1. 父类的 public  protected 的属性和方法被继承. private 的属性和方法没有被继承.

2. 一个类只能继承一个父类,(直接继承).如果你希望继承多个类的属性和方法,则使用多层继承

class A{

public $n1=90;

}

class B extends A{

public $n2="hello";

}

 

class C extends B{

}

 

$c=new C();

 

echo $c->n1;

3. 当创建子类对象的时候,默认情况下,不会自动调用父类的构造方法.//注意与java区别

class A{

public $n1=90;

//构造方法

public function __construct(){

echo "A __construct";

}

}

 

class B extends A{

function __construct(){

echo "B __construct";

}

 

}

 

//创建B对象实例

 

$b=new B();

4. 如果我们希望去调用父类的 构造方法,或者其它的方法(public /  protected) ,可以这样处理 (了解)

4.1 类名::方法名()  4.2 parent::方法名()

举例 

class A{

public $n1=90;

//构造方法

public function __construct(){

echo "A __construct";

}

 

}

 

class B extends A{

function __construct(){

echo "B __construct";

//显式的调用父类的方法

//A::__construct();

parent::__construct();

}

 

}

 

//创建B对象实例

 

$b=new B();

 

5. 当一个子类的方法和父类的方法完全一样(public protected), 我们称为 方法的覆盖 (方法重写)

找错:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值