码迷,mamicode.com
首页 > Web开发 > 详细

PHP面向对象(二)

时间:2019-06-17 23:11:13      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:key   action   输出   命名   必须   执行   fun   错误   ||   

7 多态

多态: 多种形态

多态分俩种: 方法重写和方法加载

7.1 方法重写

子类重写了父类的同名的方法

<?php 
    class Person{
        public function show(){
            echo ‘这是父类<br>‘;
        }
    }
    class Stu extends Person{
        public function show(){
            echo ‘这是子类<br>‘;
        }
    }
    $stu=new Stu;
    $stu->show();
 ?>

 

  1. 子类的方法必须和父类的方法同名

  2. 参数个数要一致

  3. 子类修饰不能比父类更加严格

7.2 方法重载

在同一个类中, 有多个同名的函数, 通过参数的不同来区分不同的方法.

PHP不支持方法重载, 但是PHP可以通过其他方法来模拟方法重载


<?php 
    class Stu{
        public function show(){}
        public function show($num){}
        public function show($num1,$num2){}
    }
 ?>

 

8 私有属性继承和重写

私有属性可以继承但不能重写


<?php 
    class A {
        private $name=‘php‘;
        public function showA(){
            echo $this->name,‘<br>‘;
        }
    }
    class B extends A {
        private $name=‘Java‘;
        public function showB(){
            echo $this->name;
        }
    }
    $obj=new B();
    $obj->showA();
    $obj->showB();
 ?>

 

showA()和showB()中的$this都表示B的对象, B中继承了A的私有属性,所以B中有两个$name.

在showA()中只能访问A中的$name,不能访问B中的$name.

在showB()中只能访问B中的$name, 不能访问A中的$name.


<?php 
    class A {
        protected $name=‘tom‘;
        public function showA(){
            echo $this->name,‘<br>‘;
        }
    }
    class B extends A {
        public $name=‘berry‘;
        public function showB(){
            echo $this->name,‘<br>‘;
        }
    }
    $obj=new B();
    $obj->showA();
    $obj->showB();
 ?>

 

B中将A的$name重写, 所以$obj中只有一个$name,($name=‘berry

‘), 不管$this在哪个方法中访问,就只能访问这个$name.


<?php 
    class A {
        private $name=‘tom‘;
        public function showA(){
            echo $this->name,‘<br>‘;
        }
    }
    class B extends A {
        public $name=‘berry‘;
        public function showB(){
            echo $this->name,‘<br>‘;
        }
    }
    $obj=new B();
    $obj->showA();
    $obj->showB();
 ?>

 

$obj中有两个$name, 一个是私有的,一个是公有的,

在showA()中既能访问私有的$name,也能访问公有的$name,但是私有的比公有的权限高, 所以输出tom.

在showB()中不能访问私有的$name,只能访问公有的$name,所以输出berry.

9 方法修饰符

方法修饰符有: static final abstract

9.1 static 静态

  1. static修饰的属性叫静态属性, static修饰的方法叫静态方法

  2. 静态成员加载类的时候分配空间, 程序执行完毕后销毁

  3. 静态成员在内存中就一份

  4. 调用方法 类名::属性 类名::方法名()

<?php 
    class Person{
        //修饰符之间没有顺序
        public static $add=‘北京‘;
        static public function show(){
            echo ‘这是一个静态的方法<br>‘;
        }
    }
    echo Person::$add,‘<br>‘;
    Person::show();
 ?>

 

9.1.1 统计在线人数

self表示所在类的类名, 使用self降低耦合性


<?php 
    class Stu{
        private static $num=0;
        function __construct(){
            self::$num++;
        }
        function __destruct(){
            self::$num--;
        }
        function show(){
            echo ‘总人数是:‘.self::$num,‘<br>‘;
        }
    }
    $stu1=new Stu;
    $stu2=new Stu;
    $stu3=new Stu;
    $stu4=new Stu;
    $stu5=new Stu;
    $stu1->show();
    unset($stu2);
    unset($stu4);
    $stu3->show();
 ?>

 

9.1.2 静态成员的继承

<?php 
    class Person{
        public static $add=‘中国‘;
        public static function show(){
            echo ‘这是人类<br>‘;
        }
    }
    class Stu extends Person{
    }
    echo Stu::$add,‘<br>‘;
    Stu::show();
 ?>

 

9.1.3 静态延时绑定

static 表示当前对象所属的类


<?php 
    class Person{
        public static $type=‘人类‘;
        public function show1() {
            echo self::$type,‘<br>‘;     //人类
            echo static::$type,‘<br>‘;  //学生   延时绑定
        }
    }
    class Student extends Person {
    public static $type=‘学生‘;
    public function show2() {
?
        echo self::$type,‘<br>‘;    //学生
        echo static::$type,‘<br>‘;          //学生
        }
    }
    $obj=new Student();
    $obj->show1();
    $obj->show2();
 ?>

 

9.1.4 总结
  1. static在内存中就一份, 在类加载的时候分配空间

  2. 如果有多个修饰符, 修饰符之间是没有顺序的

  3. self表示所在类的类名

  4. static表示当前对象所属的类

  5. static有两个作用, 第一表示静态, 第二表示类名

9.2 final 最终

final修饰的方法不能被重写

final修饰的类不能被继承

作用

如果一个类确认不被继承, 一个方法确定不会被重写,用final修饰可以提高执行效率.

如果一个方法不允许被其他类重写,可以用final修饰.

9.3 abstract 抽象

  1. abstract修饰的方法是抽象方法, 修饰的类是抽象类

  2. 只有方法的声明, 没有方法的实现称为抽象方法

  3. 一个类中只要有一个方法是抽象方法, 这个类必须是抽象类

  4. 抽象类的特点是不能被实例化

  5. 子类继承了抽象类, 就必须重新实现父类的所有的抽象方法, 否则不允许实例化

  6. 类中没有抽象方法也可以声明为抽象类. 用来阻止类的实例化


<?php 
    //抽象类
    abstract class Person{
        //抽象方法
        public abstract function setInfo();
        public function getInfo(){
            echo ‘获取信息<br>‘;
        }
    }
    class Student extends Person {
        //重写实现父类的抽象方法
        public function setInfo() {
            echo ‘重新实现父类的抽象方法<br>‘;
        }
    }
    $stu=new Student;
    $stu->setInfo();        //重新实现父类的抽象方法
    $stu->getInfo();        //获取信息
 ?>

 

抽象类的作用

  1. 定义命名的规范

  2. 阻止实例化, 如果一个类中所有的方法都是静态方法,这时候没有必要去实例化,可以通过abstract来阻止来的实例化。

10 类常量 & 接口

10.1 类常量

类常量是const常量


<?php 
    class Stu{
        const add=‘地址不详‘;
        //7.1版本后支持修饰符
        // public const add=‘地址不详‘;
    }
    echo Stu::add;
 ?>

 

define常量和conset常量区别

const常量可以做类成员, define常量不可以做类成员

常量和静态的属性的区别

相同点: 都在加载类的时候分配空间

不同的: 常量的值不可以更改, 静态属性的值可以更改

10.2 接口

  1. 如果一个类中所有的方法都是抽象方法, 那么这个抽象类可以声明成接口

  2. 接口是一个特殊的抽象类, 接口中只能有抽象方法和常量

  3. 接口中的抽象方法只能是public, 可以省略, 默认是public

  4. 通过implements关键字来实现接口

  5. 不能使用abstract和final来修饰接口中的抽象方法


<?php 
    //声明接口
    interface IPerson{
        const ADD=‘中国‘;
        function fun1();
        function fun2();
    } 
    //接口实现
    class Stu implements IPerson{
        public function fun1(){
?
        }
        public function fun2(){
?
        }
    }
    // 访问接口中的常量
    echo IPerson::ADD;
 ?>

 

10.3 接口的多重实现

类不允许多重继承, 但是接口允许多重实现.


<?php
interface IPic1{
function fun1();
}
interface IPic2{
function fun2();
}
class Stu implements IPic1,IPic2{
public function fun1(){}
public function fun2(){}
}
?>
  1. 在接口的多重实现中, 如果有同名的方法, 只要实现一次即可

  2. 类可以继承的同时实现接口


class Student extends Person implements IPIc1,IPic2{}

 

11 匿名 & 方法绑定

11.1 匿名

PHP7.0 以上支持


<?php 
    $stu=new class{
        public $name=‘tom‘;
        public function __construct(){
            echo ‘构造函数<br>‘;
        }
    };
    echo $stu->name;
 ?>

 

如果类只被实例化一次就可以使用匿名类

好处, 在执行过程中, 类不占用空间

11.2 方法绑定

PHP7.0 以上支持

将方法绑定到对象上, 并调用


闭包->call(对象):

在PHP中匿名函数称为闭包

<?php 
    $lang=‘en‘;
    //
    class Stu{
    }
    //匿名函数
    if($lang==‘ch‘){
        $fun=function(){
            echo ‘我是一名学生‘;
        };
    }else{
        $fun=function(){
            echo ‘I am a student‘;
        };
    }
    //绑定
    $stu=new Stu;
    $fun->call($stu);
 ?>

 

12 异常处理

集中处理在代码块中发生的异常

在代码块中发生了异常直接抛出, 代码块不处理异常, 将异常集中起来一起处理.

12.2 关键字


try: 监测代码块
catch: 捕获异常
throw: 抛出异常
finally: 无论有无异常都会执行,可以省略
Exception: 异常类

语法结构


try{
    //检测代码
}catch(Exception $ex){
    //捕获异常
}
finally{
    //不论是否有异常, 都要执行, finally可以省略
}

 

抛出异常后, try块终止执行, 执行权限交给catch块

<?php 
    if (isset($_POST[‘button‘])) {
        try{
            $age=$_POST[‘age‘];
            if($age==‘‘)
                // 抛出异常
                throw new Exception(‘年龄不能为空‘,1000);
            if(!is_numeric($age))
                throw new  Exception("年龄必须是数字", 1001);
            if(!($age>10 && $age<=30))
                throw new Exception(‘年龄必须在10~30之间‘, 1002);
            echo ‘您的年龄合适‘;      
        }catch(Exception $ex){  //捕获异常
            echo ‘错误信息:‘.$ex->getMessage(),‘<br>‘;
            echo ‘错误码:‘.$ex->getCode(),‘<br>‘;
            echo ‘文件地址:‘.$ex->getFile(),‘<br>‘;
            echo ‘错误行号:‘.$ex->getLine(),‘<br>‘;
        }
        finally{//不管是否有异常,finally都要执行
            echo ‘关闭数据库连接‘;
        }
?
    }
 ?>
 <form method="post" action="">
    年龄: <input type="text" name="age"><br>
    <input type="submit" name="button" value="提交">
 </form>

 

12.3 自定义异常

场景: 如何实现异常的分类处理? 比如异常有三个级别异常对应三种处理方式

自定义三种异常即可

所有异常类的父类是Exception, Exception中的方法不允许重写

<?php
//自定义空异常类
class MyNullException extends Exception {
}
//自定义类型异常
class MyTypeException extends Exception {
}
//自定义范围异常
class MyRangeException extends Exception {
}
//逻辑代码
if(isset($_POST[‘button‘])) {
    try{
        $name=$_POST[‘name‘];
        $age=$_POST[‘age‘];
        if($name==‘‘)
            throw new MyNullException(‘姓名不能为空‘);
        if($age==‘‘)
            throw new MyNullException(‘年龄不能为空‘);
        if(!is_numeric($age))
            throw new MyTypeException(‘年龄不是数字‘);
        if($age<10 || $age>30)
            throw new MyRangeException(‘年龄必须在10-30之间‘);
        echo ‘姓名:‘.$name,‘<br>‘;
        echo ‘年龄:‘.$age;
    }catch(MyNullException $ex){
        echo $ex->getMessage(),‘<br>‘;
        echo ‘错误记录在日志中‘;
    }catch(MyTypeException $ex){
        echo $ex->getMessage(),‘<br>‘;
        echo ‘发送电子邮件‘;
    }catch(MyRangeException $ex){
        echo $ex->getMessage(),‘<br>‘;
        echo ‘给管理员打电话‘;
    }
?
}
?>
<form method="post" action="">
    姓名: <input type="text" name="name"> <br />
    年龄: <input type="text" name="age"> <br />
    <input type="submit" name="button" value="提交">
</form>

 

PHP面向对象(二)

标签:key   action   输出   命名   必须   执行   fun   错误   ||   

原文地址:https://www.cnblogs.com/wjw9/p/11042723.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!