【原】php面向对象(读书笔记)

发表于2014-09-14 18:08  |  次阅读  |  0条评论  |   作者:siru90

一、面向对象特点:
封装:封装性,也可以称为信息隐藏,就是将一个类的使用和实现分开,只保留有限的接口(方法)与外部联系。对于用到该类的开发人员,只要知道这个类该如何使用即可,而不用去关心这个类是如何实现的。

继承:派生类(子类)自动继承一个或多个基类(父类)中的属性与方法,并可以重写或添加新的属性或方法。继承可以分为单继承和多继承,php目前只支持单继承,也就是一个子类有且只有一个父类

多态: 一般来说,多态主要是存在两种类型:编译时的多态和运行时的多态。
1 编译时的多态主要是通过函数重载来实现的。所谓函数重载是指保持函数名不变,主要通过更改函数形参的个数以及形参的类型来定义出多个同名函数来实现对多种类型数据的逻辑处理。这种类型的多态关系是编译器在编译阶段就已经在函数调用的地方确定的,因而运行过程中速度较快,但功能比较局限。

2 运行时的多态在不同的语言中拥有不同的实现方案。C++通过虚函数的晚捆绑来实现,而Java通过面向接口编程和面向抽象编程来实现动态调用相应的函数实现。但归根结点,这些语言都是通过将多种特殊实现的类抽象为一个泛化类来实现运行多态。 

实例讲解:假设在员工类的定义中有一个“签到”行为。对于职员员工而言,这个行为可能具体为使用时钟来打卡。对于其他类型的员工而言,列如“程序员”,签到可能通过网络来进行。 
<?php
class employee
{
 
public function qiandao()
{
echo  "this is qiandao";
}
}
class customEmployee extends employee
{
 
public function qiandao()
{
echo  "custom..."; //这是普通职员签到行为
}
}
 
class netEmployee extends employee
{
 
public function qiandao() //这是网络职员签到行为
{
echo  "network...";
}
}
 
function qd($obj){//定义处理方法
if($obj instanceof employee){
$obj->qiandao();
}else{
echo "Error: 对象错误!";
}
}
qd(new customEmployee());
qd(new netEmployee());
 
?>

二、类的权限修饰符
1)public(共有成员)
使用关键字public作为修饰符,不仅可以在类体内被调用,可以被子类和类的对象所调用。
2)private(私有成员)
被private修饰的变量和方法,只能在所属类的内部被调用和修改,不可以在类体外和类的子类中所访问。
3)protected(保护成员)
被protected修饰的类成员,可以在本类和子类中调用,其他地方则不可以被调用。
4) static
不是所有的变量(方法)都要通过创建对象来调用,还可以通过给变量(方法)加上static关键字来直接调用。
调用格式:
关键字::静态成员
关键字可以是如下两种
self:在类内部调用静态成员时所用。
静态成员所在的类名:在类外调用类内部的静态成员时所用。
注意:在静态方法中,只能调用静态变量,而不能调用普通变量,而普通方法则可以调用静态变量。静态方法传参是可用的
使用静态成员,除了可以不需要实例化对象,另一个作用就是在对象被销毁后,仍然保存被修改的静态数据,以便下次继续使用。
实例:
<?php
class Book{
static $num = 0;
function showMe()
{
echo "您是第".self::$num."位访客";
self::$num++;
}
}
$book1 = new Book();
$book1->showMe();
echo "<br/>";
$book2 = new Book();
$book2->showMe();
?>
显示结果:
您是第0位访客
您是第1位访客

说明:静态成员不需要实例化对象,当类第一次被加载时就已经分配了内存空间,所以直接调用静态成员的速度要快一些。但如果静态成员声明过多,空间一直被占用,反而会影响系统的功能。

5)final
final中文含义是最终的,最后的,被关键字final修饰过的类和方法就是“最终的类和方法”
也就是说,用final修饰的类不能被继承,用final修饰的方法不能被重写。

常量:
用来表示不会改变的值,对于从该类实例化的任何对象来说,常量值,在这些对象的整个生命周期中都保持不变。
const PI = '3.1415926';
 
三、抽象类
抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。抽象类使用abstract关键字类声明
格式为:abstract className{}
抽象类和普通类的区别在于:抽象类至少要包含一个抽象方法。抽象方法没有方法体,其功能的实现只能在子类中完成。抽象方法也是使用abstract关键字类修饰,格式为:abstract function funName();
抽象方法需要由子类来重写实现。

四、接口的使用
php只支持单继承,若想实现多继承,就要用到接口,php可以实现多个接口
接口类通过interface关键字类声明,并且类中只能包含为实现的方法和一些成员变量。
格式如下:
inerface className{
function funName1();
function funName2();
}
注意:不要用public以外的关键字来修饰接口中的类成员,对于方法,不写关键字也可以,这是由接口类自身的天性决定的。
子类通过implements关键字类实现接口,要实现多个接口,在每个接口之间使用逗号“,”链接。而且所有未实现的方法需要在子类中全部实现,否则php会报错。


五、子类调用父类中成员
Class Book{
var $name = "hello";
public function read()
{
echo 'read';
}
}
 
class SunBook extends Book
{
public function read()
{
parent::read(); //调用父类的方法
echo "<br/>";
echo $this->name; //调用父类的属性
}
}
 
$book = new SunBook();
$book->read();

六、方法的重写和重载
重写:子类重写了父类的同名方法。
重载:存在多个同名方法,但参数类型\个数不同,传不同的参数,调用不同的方法,但在php中不允许存在多个同名方法。
//在PHP中模拟重载的方法 一
class Calc {   
    public function area() {   
        // 判断一个调用area时,得到的参数个数   
        $args = func_get_args();   
        if(count($args) == 1) {   
            return 3.14 * $args[0] * $args[0];   
        } else if(count($args) == 2) {   
            return $args[0] * $args[1];   
        } else {   
            return '未知图形';   
        }   
    }   
}   
$calc = new Calc();   
// 计算圆的页面   
echo $calc->area(10),'<br />';   
// 计算矩形的面积   
echo $calc->area(5,8); 

七、使用$this变量访问方法和属性
php面向对象的编程方式中,在对象中的方法执行时会自动定义一个$this变量,这个变量表示对对象本身的引用。使用$this变量可以引用该对象的其他方法和属性,并使用-> 作为连接符,如下所示:
$this->属性;  //注意属性名前没有"$"
$this->方法
本站关键字:sunny90 web开发 数据库 移动开发 服务器 Nginx Mysql PHP
Copyright © sunny90版权所有 power by sunny90.com  
湘ICP备14012284号-1,粤公网安备 44030602000307号