[关闭]
@javalaw2010 2015-08-18T09:04:33.000000Z 字数 2138 阅读 1299

PHP基础补充1.3

PHP web




面向对象

1.四个魔术方法_set(),_get(),_isset(),_unset()

_set()要求有两个参数,第一个为要设置属性的名称,第二个为要设置属性的值。
_set()会被自动调用,看上去就像属性没有被封装一样

比如:

  1. $person->name = '张三'; //_set()会被自动调用

_get()要求一个参数,为需要获取的属性的名称,它也会被自动调用。
_isset()unset()会在外部调用isset()unset()时被自动调用。

注意:为了防止魔术方法在外部被调用,应当使用private修饰符修饰魔术方法

2.在子类中重写的方法的权限不能低于父类被覆盖的方法的权限

3.final

final加在类或类中方法前,不能修饰成员属性
使用final修饰的类为最终版本,不能被继承
使用final修饰的成员方法,在子类中不能被覆盖

4.static

外部访问方式:

类名::静态成员属性名;
类名::静态成员方法名();

内部访问方式:

self::静态成员属性名;
self::静态成员方法名();

注意:在静态方法中只能访问静态成员

5.单例设计模式

  1. <?php
  2. class DB{
  3. private static $obj = null;
  4. private function _construct(){ //使用private封装构造函数,无法在外部实例化
  5. //do something
  6. }
  7. static function getInstance(){
  8. if(is_null(self::$obj)){
  9. self::$obj = new self(); //在内部实例化自身
  10. return self::$obj;
  11. }
  12. }
  13. $db = DB::getInstance();

6.const

使用const声明的常量名称前不需要$符号
通过对象名称访问常量是不允许

7.常用的魔术方法_clone(),_toString(),_call(),_autoload()

_clone()不需要任何的参数,自动包含$this$that$this副本对象的引用,$that原本对象的引用

  1. $p1 = $p2;//这不是克隆,而是多复制出一个对象的引用
  2. $p1 = clone $p2; //自动调用_clone()

_toString()要求一定要有一个字符串作为返回值,

  1. class TestClass{
  2. private $foo;
  3. function _construct($foo){
  4. this->$foo = $foo;
  5. }
  6. function _toString(){
  7. return this->$foo;
  8. }
  9. $obj = new TestClass('hello');
  10. echo $obj;//自动调用_toString()函数

_call()当调用对象中不存在的方法时,自动调用_call(),_call()需要两个参数,第一个是不存在方法的名称字符串,第二个是调用不存在方法时的参数数组。

_autoload()是一个全局函数,用来自动加载类,当你尝试使用一个没有组织到的类时,php会寻找该函数,并将类名作为作为参数来调用它;

  1. function _autoload($className){
  2. include(strtolower($className).".class.php");
  3. }

对象串行化

1.对象串行化的场景

对象需要在网络中传输时,将对象串行化成二进制串后在网罗传输
对象需要持久保存时,将对象串行化后写入文件或是数据库中

2.使用serialize()来串行化一个对象,使用unserialize()来反串行化

  1. $person_string = serialize($peson); //串行化
  2. $person = unserialize($person_string);//反串行化

3._sleep()_wakeup()

在串行化的时候,会自动调用_sleep()_sleep()不需要任何参数,但他需要返回一个数组,数组中包含需要串行化的属性。
在反串行化的时候,自动调用_wakeup(),你可以在其中为变量重新赋值。


抽象类和接口

抽象类

有抽象方法的类就是抽象类,抽象类和抽象方法都需要用abstract修饰
抽象类当中的成员方法和成员属性,都不能用private修饰

接口

接口是一种特殊的抽象类,接口中声明的所有方法都必须是抽象方法,只能使用const关键字声明为常量的成员属性
接口中的成员都必须拥有public权限的访问属性
接口之间可以使用extends关键字实现继承
类继承接口时需要使用implements实现

可以在继承一个类的同时实现多个接口,方式如下:

  1. class 类名 extends 父类名 implements 接口1,接口2,{
  2. //实现所有接口中的抽象方法
  3. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注