面向对象

类成员的定义

成员属性的定义

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • // 三大特性封装:隐藏内部是吸纳,仅开发接口。继承:一个对象的成员被另一个对象所使用。语法上体现为代码的共用。多...
    老夫不才阅读 834评论 0 1
  • 面向对象笔记 一、 对象在内存中的存放方法以及被调用过程 class文件首先被加载到方法区中的class文件内容区...
    VictorBXv阅读 460评论 0 2
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,934评论 6 13
  • java继承 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。 继承就是子类继...
    863cda997e42阅读 661评论 0 1
  • 也是有这样的爱人吧 根本不能给你力量 也无法帮助你指明人生的方向 两个人遇到一点小小挫折就双双感到挫败 躲在不起眼...
    关耳的关阅读 135评论 0 1