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() );