您的位置:首页 > 编程语言 > PHP开发

【php】面向对象

2016-07-18 21:21 471 查看
传统的面向过程的编程思想

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

类和对象
抽象类

抽象方法

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

重载在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($属性名):

在对一个对象的不存在的属性进行取值的时候,会自动调用的方法。我们使用该方法来对这种意外进行特别的处理。

该方法可以带一个形参,表示要对之取值的不存在的属性名。

示例:

<?php

class 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方法, 往往可以是我们定义的类,有一种“可方便扩展属性”的特征,使类或对象的属性的操作,变得更为自由和方便。

示例:

<?php

class 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($对象->不存在的属性);


示例:

<?php

class 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()一样
b25b
,不过是调用方法和调用静态方法时的区别。

实例:

//调用对象中不存在的方法。

//如果此方法中带一个参数,则返回参数本身。

//如果此方法中带两个参数,则返回参数的平方和。

//如果此方法中带三个参数,则返回参数的立方和。

<?php

class 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;

?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面向对象PHP