传统的面向过程的编程思想
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()一样,不过是调用方法和调用静态方法时的区别。
实例:
//调用对象中不存在的方法。
//如果此方法中带一个参数,则返回参数本身。
//如果此方法中带两个参数,则返回参数的平方和。
//如果此方法中带三个参数,则返回参数的立方和。
<?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;
?>