【php】面向对象

来源:互联网 发布:java打印9个直角三角形 编辑:程序博客网 时间:2024/06/06 12:36

    • 传统的面向过程的编程思想
    • 传统的面向对象的编程思想
    • 类和对象
      • 抽象类
      • 抽象方法
    • 重载
      • 重载在通常的面向对象语言中的含义
      • 重载在php语言中的含义
        • 属性重载
        • 方法重载
    • PHP内置标准类

传统的面向过程的编程思想

1.将要实现的功能描述为一个从开始到结束的连续的“步骤(过程)”。
2.依次逐步完成这些步骤。如果步骤较大,又可以将该步骤再次细分为子步骤,以此类推。
3.程序从头开始执行一直到结尾并得到所需结果。

流程图:

这里写图片描述




传统的面向对象的编程思想

OOP:Object Oriented Program(面向对象编程)

1将要实现的功能描述为一个“对象/物体”完成的任务——现实中也是如此:功能的实现都是依赖于一个实体的“行动/操作/动作”。
2.完成该最终功能的过程中需要实现其它中间功能(过程),则再去调用其它对象(或也可能是自己本身)来实现该中间功能。
3.整个系统的完成(功能的实现)看作是一个一个对象在发挥其各自的“能力”并在内部进行协调有序的调用过程。

流程图:

这里写图片描述




类和对象

对象

万物皆对象;

任何对象,都可以人为“规定”为某种类别。

示例:

<?php//定义一个Person类class Person{    var $name;    //类的一个特征,其实就是“变量”    var $age;    var $edu;}//创建一个新的Person类的对象,并“放入”变量$obj1中(其实就是给变量赋值)$obj1 = new Person();$obj1 -> name ="张真人";    //符号“->”就是表示指代对象的某个特征,这里是给该特征赋值。$obj1 -> age = 18;         //“->”符号就相当于JS中的“.”符号,比如:d1.style.color = "red";$obj1 -> edu = "大学";?>

抽象类

1.一个类可以使用关键字abstract声明为抽象类;抽象类是一个不能实例化的类,只用作其他类的父类。
2.一个类中如果有抽象方法,那么该类必须声明为抽象类。

抽象类是为了方便技术管理而设计。

语法形式:

abstract class 类名{}

抽象方法

1.一个方法可以使用关键字abstract声明为抽象方法;抽象方法只需要声明方法头,不需要大括号部分的方法体。
2.子类继承自一个抽象类,则子类必须实现父类中的所有抽象方法,除非子类也继续作为抽象类。
3.子类实现抽象父类的方法时,访问控制修饰符的范围不能降低,且方法的参数也需一致。

抽象方法也是为了技术管理而设计:要求下级类自行去实现这个方法的“具体做法”;

语法形式:

abstract function 方法名(形参1,形参2,…); //注意,这里有分号。

示例:

重载

重载在“通常的面向对象语言”中的含义

在通常的面向对象语言中,重载是指在一个类或对象中,有多个名字相同但形参不同的方法的现象。

示例:

class C{    function f1(){ // };    function f1($p1){ // };    function f1($p1,$p2){ // };}

重载在“php语言”中的含义

在php语言中,重载是指当对一个类或对象使用其未定义的属性或方法的时候,会有一些对应的“处理机制”。

示例:

class A{    public $p1 =1;}$obj1 = new A();$obj1 -> $p1 = 2;echo $obj1 -> $p2;       //出错,未定义!

//php中的重载,就是来应对上面的出错的情况,使代码不出错,而且还能“优雅的处理”;

属性重载

属性重载就是对一个对象不存在的属性进行使用操作的时候,这个类中预先设定好的处理机制。

属性的本质就是变量,变量的操作方式有四种:取值、赋值、判断、销毁。对应的,属性重载为:

1.取值:当对一个对象的不存在的属性进行“取值”的时候,就会自动调用方法:__GET()。
2.赋值:当对一个对象的不存在的属性进行“取值”的时候,就会自动调用方法:__SET()。
3.判断:当对一个对象的不存在的属性进行isset()判断的时候,就会自动调用方法:__isset()。
4.销毁:当对一个对象的不存在的属性进行unset()销毁的时候,就会自动调用方法:__unset()。

以上四个方法,被称为“魔术方法”。

__GET($属性名):

在对一个对象的不存在的属性进行取值的时候,会自动调用的方法。我们使用该方法来对这种意外进行特别的处理。
该方法可以带一个形参,表示要对之取值的不存在的属性名。

示例:

<?phpclass A{    public $p1 = 1;    function __GET($porp_name){        //可以作下列处理:        echo "<br /> 属性{$this->porp_name}不存在!";        return 0;        trigger_error("发生错误,属性不存在",E_USER_ERROR);        die();    }}$obj1 = new A();$obj -> $p2;?>//结果:输出四种不同的处理结果。

__SET(值)

当对一个对象的不存在的属性进行赋值的时候,就会自动调用这个内部的魔术方法;
它有两个形参,分别代表要对不存在的属性进行赋值的时候的“属性名”和“属性值”;
这个方法,结合__GET方法, 往往可以是我们定义的类,有一种“可方便扩展属性”的特征,使类或对象的属性的操作,变得更为自由和方便。

示例:

<?phpclass A{    //定义一个属性,这个属性是为了存储若干个不存在的属性数据。    protected $prop_list = array();    //空数组    //这个方法会在A的对象使用一个不存在的属性进行赋值的时候自动调用。    function __set($p,$v){        $this->prop_list[$p] = $v;    }    function __get($p){        return $this ->prop_list[$p];    }}$obj1 = new A();$obj1 ->p1 =1;$obj1 ->h1 = 10;$obj ->str1 = "LOVE";echo "<br />".$obj1 ->p1.$obj1 ->h1.$obj ->str1;?>//结果:110LOVE

__ISSET($属性名)

当对一个对象不存在的属性进行isset()判断的时候,就会自动调用内部方法:__isset();
用法:
$v1 = isset($对象->不存在的属性);

示例:

<?phpclass A{    //定义一个属性,这个属性是为了存储若干个不存在的属性数据。    protected $prop_list = array();    //空数组    //这个方法会在A的对象使用一个不存在的属性进行赋值的时候自动调用。    function __set($p,$v){        $this->prop_list[$p] = $v;    }    function __get($p){        if(isset($this ->prop_list[$p])){       //是代码更强壮,处理溢出的数据            return $this ->prop_list[$p];        }else{            echo "属性不存在";            }    }    function __isset($prop){        $v1 = isset($this ->prop_list[$prop]);        return $v1;    }}$obj1 = new A();$obj1 ->p1 =1;$obj1 ->h1 = 10;$obj ->str1 = "LOVE";echo "<br />".$obj1 ->p1.$obj1 ->h1.$obj ->str1;echo "<br />".$boj1 -> luanlai;$v1 = isset($obj1->p1);$v2 = isset($obj1->hahaha);echo "<br />";var_dump($v1);echo "<br />";var_dump($v2);?>//结果:110LOVE        属性不存在        bool(true)        bool(false)

__UNSET($属性名)

当对一个对象中不存在的属性进行unset()销毁操作的时候,就会自动调用内部方法:__unset();
——就算没有这个方法,在类中销毁不存在的变量时也不会有语法错误,只不过使用这个方法更安全。

方法重载

当对一个对象不存在的方法进行调用的时候,会自动调用类中的__call()这个魔术方法;

当对一个对象不存在的静态方法进行调用的时候,会自动调用类中的__callstatic()这个魔术方法;

__call($methodName,$argument)

这个方法必须要带两个形参:
methodName:argument: 表示要调用的不存在的方法时,所使用的实参数据。这是一个数组,存储所有的实参。

__callstatic()与__call()一样,不过是调用方法和调用静态方法时的区别。

实例:

//调用对象中不存在的方法。
//如果此方法中带一个参数,则返回参数本身。
//如果此方法中带两个参数,则返回参数的平方和。
//如果此方法中带三个参数,则返回参数的立方和。

<?phpclass A{    function __call($Func_name,$argument){        if($Func_name === 'f1'){            $len = count($argument);            if($len <1 || $len>3){                trigger_error("使用非法的方法!",E_USER_EROOR);            }elseif($len == 1){                return $argument;            }elseif($len == 2){                return $argument[0]*$argument[0]+$argument[1]*$argument[1];            }elseif($len == 3){                $v1 = $argument[0];                $v2 = $argument[1];                $v3 = $argument[2];                return $v1*$v1*$v1+pow($v2,3)+pow($v3,3);            }        }else if($Func_name === 'f2'){        }else if($Func_name === 'f3'){        }    }}$obj1 = new A();$v1 =$obj1 -> f1(2);$v2 =$obj1 -> f1(2,3);$v3 =$obj1 -> f1(3,4,5);echo "$v1,$v2,$v3";?>//结果:2,,13,405




PHP内置标准类

php语言内部,有很多”现成的类”,内置标准类就是其中之一。

内置标准类中什么都没有,只是相当于:class stdclass{},其作用用于存储一些临时的简单的数据,也可以用于类型转换时储存数据。

使用示例:

<?php$obj1 = new stdclass();$obj1 -> pp = 10;$obj1 -> CC = 100;?>
0 0