类成员的定义
成员属性的定义
// 非静态成员属性的定义
public $属性名[=属性值];
var $属性名[=属性值]; // 老版本定义
// 静态成员属性的定义
public static $属性名[=属性值];
// 类常量
const 常量名 = 常量值;
成员方法的定义
// 非静态成员方法的定义
public function 方法名([形参列表]){
# code
}
// 静态成员方法的定义
public static function 方法名([形参列表]){
# code
}
类成员的使用
# 实例化类
$obj = new ClassName();
// 类的外部调用非静态成员
$obj -> 属性名;
$obj -> 方法名();
// 类的外部调用静态成员(使用范围解析操作符)
$obj::属性名;
$obj::方法名();
// 类的外部调用类常量
$obj::常量名;
// 类的内部调用非静态方法
$this->属性名;
$this->方法名();
// 类的内部调用静态方法
ClassName::$属性名;
ClassName::方法名();
// 类的内部调用常量
ClassName::常量名;
构造方法
PHP不负责定义这个构造方法,只负责调用构造方法
当使用new关键字实例化这个类的对象的时候,该类的构造方法就会被PHP自动调用执行一次
class ClassName extends AnotherClass
{
function __construct(argument)
{
# code...
}
}
析构方法
PHP不负责定义析构方法,只负责调用析构方法
当对象被销毁时(手动销毁和程序执行完毕自动销毁),析构方法会被PHP自动调用执行一次
析构方法不支持传递参数
class ClassName extends AnotherClass
{
function __destruct()
{
# code...
}
}
对象的值传递和引用传递
对象的引用传递
原理:对象的引用传递将会使$obj变量和$obj2变量指向同一个变量值空间
class ClassName
{
public $name = 'zjlsp';
}
$obj = new ClassName(); // 实例化类
$obj2 = &$obj; // 对象的引用传递
$obj2-> name = 'zjlsp2';
var_dump($obj->name); // $obj的属性也随之改变
对象的值传递
原理:对象的值传递将会就地复制一份变量的值空间。$obj变量和$obj2变量指向的是两个不同的值空间,但是他们值空间所指向的对象空间却是同一个;所以导致最终改变任何一方的值,也将会影响到另外一方的值
class ClassName
{
public $name = 'zjlsp';
}
$obj = new ClassName(); // 实例化类
$obj2 = $obj;
$obj2-> name = 'zjlsp2';
var_dump($obj->name); // $obj的属性也随之改变
对象的克隆
$obj = new ClassName();
$obj2 = clone $obj;
自动加载
什么时候使用到这个类,就什么时候加载这个类文件的操作策略!
// 自动加载函数
function __autoload($className){
# code
}
// 自定义自动加载函数
function zdjz($className){
# code
}
spl_autoload_register('zdjz');
// 自定义自动加载非静态方法和静态方法
class ClassName
{
public static function f1($className){
# code...
}
public function f2($className)
{
# code...
}
}
spl_autoload_register(array('ClassName','f1'));
spl_autoload_register(ClassName::f1); // 自定义自动加载静态方法
$obj = new ClassName();
spl_autoload_register(array($obj,'f1')); // 自定义自动加载静态方法
如果我们使用了自定义的自动加载,那么,默认的自动加载函数将会失效,如果还想继续使用默认的自动加载,就必须再将默认的自动加载注册一次
可以注册多个自定义自动加载
关键字
// self专门用来在本类的内部代替本类的类名的
self::$属性名;
// parent关键字其实就是专门在子类中代替父类的类名的
parent::$属性名;
访问限定修饰符
标识符 | 描述 | 作用域 |
---|---|---|
public |
公共的 | 表示在类的内部,类的外部和类的继承链中都能直接访问 |
protected |
受保护的 | 表示在类的内部和继承链中能被直接访问 |
private |
私有的 | 表示只能在本类的内部被直接访问 |
最终类和最终方法
被final申明的类将不能被继承
final class ClassName
{
final public function fName(){
}
}
抽象类
包括:1)普通类的所有成员;2)抽象方法;
抽象类不能够被直接实例化为对象,但是抽象类中的静态成员和类常量都能够正常使用
抽象类如果被普通类所继承,那么抽象类中的抽象方法必须全部被实现
抽象类还可以被抽象类所继承,如果被抽象类所继承,那么被继承的那个抽象类中其抽象方法可以不被实现
abstract class 类名{
// 抽象类成员
abstract function 抽象方法名(){
}
}
接口类
包括:1)接口常量;2)接口抽象方法
接口如果被普通类所实现,那么,接口中的所有接口抽象方法都要被全部实现
接口还可以被抽象类所实现,如果被抽象类实现,那么接口中的接口抽象方法可以不被实现
接口中的接口抽象方法只能是public类型
interface 接口名{
// 接口成员
}
// 接口可以被多实现:使用implements关键字来实现接口
class ClassName implements inter1,inter2{
}
静态延时绑定
静态延时绑定是PHP5.3之后才出现的特性
class A {
function f1(){
echo static::$var1;
}
}
class B extends A
{
public static $var1 = '我是类B';
}
class C extends A
{
public static $var1 = '我是类C';
}
$b = new B();
$b -> f1(); // 我是类B
$c = new C();
$c -> f1(); // 我是类C
重载
PHP访问一个不存在的成员时,默认的处理方式为:报一个NOTICE级别的错误,并且返回NULL值
PHP访问一个非公有的成员,默认的处理方式为:直接报致命的错误,阻止程序继续执行
属性的重载(非静态)
class ClassName {
// 当获取一个不可访问的(非静态)成员属性值时,进行自定义的处理
function __get($name){
# code...
}
// 当设置一个不可访问的(非静态)成员属性时,进行自定义的处理
function __set($name){
# code...
}
// 当删除一个不可访问的(非静态)成员属性值时,进行自定义的处理
function __unset($name){
# code...
}
// 当判断一个不可访问的(非静态)成员属性是否存在时,进行自定义的处理
function __isset($name){
# code...
}
}
方法的重载
class ClassName {
// 当访问一个不可访问的(非静态)成员方法时,进行自定义处理
function __call($name){
# code...
}
// 当访问一个不可访问的(静态)成员方法时,进行自定义处理*(本身必须是静态方法)
static function __callstatic($name){
# code...
}
}
面向对象的三大特性
1)封装的特性, 将特定的功能打包成一个类。
2)继承的特性, 指的就是extends语法特性。
3)多态的特性, 指的就是重写的特性,一种方法可以有多种实现方式。
网友评论