面向对象

2018-04-18  本文已影响0人  始于原子

类成员的定义

成员属性的定义

// 非静态成员属性的定义
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)多态的特性, 指的就是重写的特性,一种方法可以有多种实现方式。

上一篇 下一篇

猜你喜欢

热点阅读