6.7-1php类相关

1. 声明变量不需要任何关键字修饰,但在类中声明成员属性时,变量前一定要有关键字,

例如public ,private ,static等,如果不需要一定的意义,则用“var ” ,

一旦有其他关键字修饰就需要去掉“var”

 

2. this

访问对象中的成员必须通过对象的引用,如

$person1 -> name ;

$person1 -> run();

用$this 访问对象内部的函数和属性

 

3.构造方法

每创建一个对象,构造方法就会自动调用一次。"__construct ( ) " ,如果没有,则搜索与类同名的构造方法

 

function __construct ( [ parameters ] ) {

  

}

作用:即使类声明没有参数 ,也可在构造函数中设置。

 

 4. 对象被销毁前自动运行

function _destruct ( parameter ) {

}

 

5.私有成员

关键字:private

加上后不能在对象外部访问该变量,如需访问,需要设置公有函数接口,如果不声明,默认就是public

private $name;

public get_name ( ){ return $this->name ;}

 

6. __set() , __get() , __isset() , __unset()

和__construct() , __destruct()同类的魔术方法,

如__set() ,用于设置private 属性值时自动调用的方法。

 

 6.1

__set ( $propertyName , $propertyValue ) {} ,设置了魔术方法__set ()后,就可以直接为私有属性赋值了,自动调用__set() 方法

 

 6.2

 __get( $propertyName){}

 可获取私有属性,并设置条件,运行$person->name 时自动调用。设置条件:

if ( $propertyName == "sex" ) return "保密";

 

6.3

__isset( $propertyName ) , __unset ( $propertyName )

设置特殊情况,不允许访问属性。

设置特殊情况,不允许删除属性。

 

 7-10.5继承性

1.访问类型控制

 

 

 2.子类重载父类的方法

用parent:: functionName () 来调用被覆盖父类方法。

 

8:10.6一些关键字

 

1. final 关键字

-使用final标识的类,不能被继承

-在类中使用final标识的成员方法,在子类中不能被覆盖

2. static 关键字

声明静态成员属性,则属性是属于所有类的,

static $count ;

在类内:使用  self:: $count   来使用

在类外:使用  类名::$count   来使用

 

静态方法只能访问静态变量,因为在类加载完成后,静态方法就可以访问了,而此时对象不一定存在,非静态成员也就不一定存在,

this关键字不可使用,而且即使对象创建了,静态方法也不知道访问哪一个对象的成员变量。

 

9:  10.6.3  单态设计模式

 

只能创建一个对象的类,

1. 声明__construct () 为private,把默认的创建方法new禁止,

2. 创建一个静态成员来判断类是否已经创建过对象,

//只能使用静态方法getInstance()来获取DB的对象

 

10.6.4 const关键字

 

用与将类中的成员变量定义为常量,与static变量一样,

通过类名或在成员方法中使用self关键字访问

 

 10.6.5 instanceof 关键字

 

确定一个对象是类的实例、类的子类,还是实现了某个接口

 

 10.6.6 克隆对象

 

 有时需要建立对象的一个副本,改变原来的对象不影响副本,

用new重新创建对象再重新赋值,比较麻烦,可以用clone关键字复制出完全相同的实例,

不再需要重新赋值

 

10.6.7 __toString () 快速获取对象的某些字符串

 

$p = new Person () 是一个对象的引用。直接用echo输出$p会提示错误

 

如果在类中添加了__toString ()方法则可以直接返回某些字符。

function __toString () { return $this-> foo ; }

 

10.6.8 __call() 方法的引用

 

如果尝试调用对象中不存在的方法,会出现系统报错。可以添加一个__call()方法,

调用不存在的方法时就会自动调用该方法,程序继续执行。

 

10.6.9 自动加载类

 

使用全局类__autoload() ,当尝试使用一个没有添加的类时,php自动调用该方法,

添加参数名文件,

function __autoload ( $className ){

  include  ( strtolower ( $className ) . ".class.php" ) ;

}

$obj = new user () ;                  // user类不存在则自动调用__autoload() 函数,将类名user作为参数传入。

 

10.6.10

对象串行化

1.

对象的寿命通常随着生成该对象的程序的终止而终止,有时需要将对象的状态保存下来,

保存为二进制字符,需要时再恢复。

 

$person_string = serialize ( $person );

file_put_contents ( "file.txt" , $person_string ) ;

---

 

$person_string = file_get_contents ( " file.txt " ) ;

$person = unserialize ( $person_string ) ;

$person -> say ();

 

2.__sleep() 、wakeup() 函数

 

串行化与恢复时自动调用的两个函数。

 

_sleep () 函数返回一个数组,包含需要串行化的成员,没有包含的成员在串行化时会被忽略

 

function __sleep (){

  $arr = array ( "name","age" );

  return $arr;

}

function __wakeup () {

  $this -> age = 40 ;

}

没有参数也没有返回,在重新唤醒时,为新对象的$age 重新赋值。

 

10.7.1 抽象类

 

只要声明类时有一个方法是抽象方法,那么这个类就是抽象类。抽象类也要使用abstract关键字修饰

abstract class person {

abstract function say();

}

 

抽象类不能实例化,用于继承,子类继承抽象类后,就必须将所有抽象方法实现,

否则子类还是抽象类。

 

 

 

10.7.2 接口。

 

解决单继承问题。 接口是一种特殊的抽象类:接口中声明的方法全是抽象方法。

而且不能在接口中声明变量,只能使用const 声明常量。

接口使用interface标识。

通过类继承接口时需要使用implements 关键字实现,而不是extends,

如果使用抽象类实现接口中的部分方法,也需要使用implements关键字。

 

可以用抽象类实现接口的部分方法,但要实例化,还需要抽象类有子类把他的所有抽象方法实现。

 

可以继承多个接口,但必须把所有抽象方法全部实现才能创建实例,可以同时继承一个父类

 

class 类名 extends 父类 implements 接口1,接口2 ,...,{

  //实现所有方法

}

 

10.7.3 实现多态

定义一个usb接口,每个usb设备都必须有这个方法

 

interface usb {

  function run ();

}

 

class ukey implements usb {

  function run {

    echo "ukey run";  

  }

}

 

class umouse implements usb {

  function run {

    echo "umouse run";

  }

}

 

class Computer {

  function useUsb ( $ device ){

    $device->run();  

  }

}

 

$computer = new Computer ;

 

computer->useUsb( new usbkey() );

computer->useUsb( new umouse() );

 

posted @ 2017-06-08 21:00  John_leaf  阅读(208)  评论(0编辑  收藏  举报