面向对象开发的封装和继承总结

来源:互联网 发布:龙信数据北京有限公司 编辑:程序博客网 时间:2024/06/11 04:39
一.面向对象三大基本特征
1.封装:
所谓的封装,也就是把客观的事物封装成抽象的类,并且类可以把自己的数据和方法只让
可信的类或者对象来操作,对不可信的进行信息隐藏
2.继承:
所谓的继承是指可以让某个类型的对象获得另一个类型的对象的属性和方法
3.多态:
所谓多态是指一个类实例的相同方法在不同情形有不同的表现形式


二.封装
1.封装是把对象中的成员属性和成员方法加上访问修饰符,使其尽可能隐藏对象的内部细节,
以达到对成员的访问控制(切记不是拒绝访问)
访问修饰符:
public(公共的):类的内部、类的外部(对象)、子类中都可以访问(通过parent::进行访问)
protected(受保护的):类的内部、子类中可以访问
private(私有的):类的内部可以访问


2.封装相关魔术方法
魔术方法:
__get($name):获取对象中私有成员和受保护的属性或者访问一个不存在的属性时会自动调用
__set($name,$value): 设置对象中对象中私有成员和受保护的属性或者访问一个不存在的属性时会自动调用
__isset($name):检测对象中私有成员和受保护的属性或者访问一个不存在的属性时会自动调用
__unset($name):销毁对象中私有成员和受保护的属性或者访问一个不存在的属性时会自动调用  没有返回值
注意:
上面四个魔术方法只对类中的私有、受保护成员属性有效


三.继承
1.子类只会继承父类的所有public和protected成员属性和方法
子类无法继承父类的private的属性和方法
PHP只支持单继承,不允许多重继承,一个子类只能有一个父类,但一个类可以被多个类继承
子类中新增加的属性和方法是对父类的扩展
继承的关键字:extends
例:
class 子类名 extends 父类名{
...
}
2.子类重写
子类和父类的方法同名,则子类方法重写(覆盖)父类方法
在子类中,可以使用parent访问父类中的被覆盖的方法
例:parent::父类方法名();
如果想把子类继承下来的属性修改的话可以在写一个构造方法,如果构造方法中的属性名跟父类的属性名有一样时
然后把parent::方法名()写到子类构造方法中可以代替你要声明的属性名,如果你要扩展子类的属性还要在构造方法
前面声明一个属性名,然后在构造方法中拿到这个属性名对他进行赋值
3.final关键字
在PHP5中新增加了final关键字,它只能用来修饰类和方法,不能使用final这个关键字来修饰成员属性
final的特性:
使用final关键字标识的类不能被继承,不可能有子类
使用final关键字标识的方法不能被子类覆盖(重写)
4.static关键字(可以重新赋值)
static关键字是用于修饰类的成员属性和成员方法(静态属性和静态方法)
一般将所有的对象都相同的属性和方法设置为静态
类的静态属性和静态方法不用实例化(new)就可以直接使用类名访问
例:类名::$静态属性  类名::静态方法
在类的内部,不能使用this来引用静态变量和静态方法,而需要用self来引用
例:self::$静态属性 self::静态方法
静态方法中不可以使用非静态的属性和方法,不让使用$this
静态属性是共享的,也就是new很多对象也是共用一个属性
5.const关键字
const是一个在类中定义常量的关键字,在PHP中定义常量使用的是define()这个函数
但是在类里面定义常量使用的是const这个关键字
const只能修饰成员属性(常量属性),其访问方式使用类名:常量属性,在方法里面使用self关键字
但不能使用$符号,更不能使用对象来访问
self::常量属性 //类内部访问
类名::常量属性 //类外部访问
6.instanceof关键字
instanceof操作符用于检测当前对象实例化是否属于某个类的类型
例:class Person{ ... ...  }
    class Student extends Person{  ...  ...  }
      $p=new Person();
      s=new Student();
       echo $p instanceof Student;    //结果为false
       echo $s instanceof Student ;   //结果为true
       echo $s instanceof Person;    //结果为true
7.clone关键字
有时候需要根据需求克隆出一个一模一样的对象,而且克隆出来两个对象互不干扰就需要使用
clone关键字
格式:
    $obj = new Class();
    $objectcopy=clone $obj;
 魔术方法:__clone() 当执行clone克隆时会自动调用的方法,  主要用于解决对象中特殊属性的复制操作。
8.__toString魔术方法
__toString()是快速获取对象的字符串表示的最快捷方式,当我们去输出一个对象时
如echo $obj,print $obj,那么会自动调用的此魔术方法。
__toString()方法必须返回一个字符串类型的值 用这个魔术变量给他一个返回值
__toString()不能有参数
9.__call魔术方法
在当试图调用一个对象中不存在的方法时,就会产生错误,PHP提供了__call这个方法来处理这种情况
告诉当事人一个提示
格式:
 __call( string $name , array $arguments )
第一个参数$name表示方法名,
第二参数$arguments表示调用时的参数列表(数组类型)


四.对象串行化
对象也是一种在内存中储存的数据类型,他的寿命通常会随着生成该对象的程序终止而终止
有时候可能将对象的状态保存下来,需要时再将对象恢复,对象通过写出描述自己的状态的值
来记录自己,这个过程称对象的串行化(Serialization)
以下两种情况需要将对象串行化:
对象需要在网络中传输时,将对象串行化成二进制串即可。
对象需要持久保存时,将对象串行化后写入文件或数据库。
串行化和反串行化函数:
serialize() -- 串行化,返回一个包含字节流的字符串 私有的属性不会被串行化 进行串行化可以把这个对象类
转换成字符串储存起来
例:$p1=new Person('李冰冰',160,50,18);
  //把这个对象串行化
  $str=serialize($p1)
  //将字符串写入data.txt
  file_put_contents("data.txt",$str);
unserialize() -- 反串行化,能够重新把字符串变回php原来的对象值。
例:$str=file_get_contents("data.txt");
  //将字符串中的类生成一个对象
  $p1=unserialize($str);
  //echo $p1->name;
  $p1->say();
串行化一个对象将会保存对象的所有属性变量和类名信息,但是不会保存对象的
对象串行化魔术方法
__sleep()
是执行串行化时自动调用的方法。
注意:sleep方法需要返回一个数组,其中数组中的值是需要串行化的属性名
例:function __sleep(){
    return array("串行化的属性名",...)
} 这里写哪些属性名就会串行化哪些属性
__wakeup()
是在执行反串行化时自动调用的方法,可以在反序列化时改变属性的值,即再次初始化。
输出这个对象的时候可以通过这个魔术方法来改变输出的属性值


五.自动加载类
在编写面向对象程序时,常规做法就是每个类保存为一个Php源文件,当在一个PHP文件中
需要调用一个类时很容易就可以找到,然后通过include(或require)把这个文件引入就可以了。
不过有的时候,在项目中文件众多,要一一将所需类的文件include进来,是一个很让人头疼的事。
PHP5提供了一个__autoload()来解决这个问题。当new实例化一个不存在的类时,
则自动调用此函数并将类名作为参数传入此函数。
在定义类的文件名时,需要一个类对应一个同名的php文件:
 Goods.class.php  ,  User.class.php
 例:function __autoload($className){
    include_once  $className.'.class.php' ;
            }
     $goodObj=new Goods();
 声明的方法跟类的名字一样的话会形成构造方法,实例化这个对象的时候会自动读取
原创粉丝点击