码迷,mamicode.com
首页 > 其他好文 > 详细

有关类的相关知识 面向对象的三大特性!!!!

时间:2018-06-07 19:29:59      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:连接方式   索引数组   ted   标准   魔法   运行   int   UNC   存在   

面向对象的三大特性

封装:当一些属性不想被直接操作的时候,可以把属性私有化,并提供一个公有化方法,来对这个属性进行封装;

继承:子类继承父类,子类可以有父类的所有东西,包括属性和方法;

多态:在一个类中,不同的对象调用相同的方法,由于对于这个方法的重写得到的结果不一样就是多态

类的自动加载

在需要一个类的时候,自动获取类名,并引入文件;

1.使用__autoload这个魔法函数 并告诉他文件在哪

技术分享图片

2.使用spl_autoload_register这个函数 定义多个类的连接方式

技术分享图片

克隆 clone  默认是浅克隆

1.浅克隆

  浅克隆是指在运行克隆函数的时候,克隆的不完全,在克隆时如果被克隆类有对象中储存的是"对象"类型的话,就会形成浅克隆,并不是一个独立的个体

技术分享图片

技术分享图片

b2的两个值相同,因为b2中的值是一个对象,所有就会成为浅克隆

深克隆:

要想实现深克隆(一个对象的所有属性数据都彻底实现了“复制”),就需要对该对象类使用魔术方法:

__clone(),并在里面来实现深度克隆——人为去复制浅克隆复制不了数据。

技术分享图片

 技术分享图片

对象遍历

对象的变量通过foreach来遍历,

1.只能遍历属性

2.只能遍历看得到的属性,也就是不是私有的

 在外面遍历:

技术分享图片

可见,此时protectedprivate属性都没有遍历出来。

如果需要全部遍历,则改造为:

技术分享图片

如果只需要某对象中的部分数据?比如:只要a1,a2这个两个属性的数据?

技术分享图片

PHP内置标准类 stdclass

在你需要一个类的时候直接实例化一个对象,而实例化对象的这个类名就是stdclass

然后想用什么属性直接定义就可以了;

 

将数据转换为对象  object

1.对象转换为对象:没有变化;

2.数组转换为对象:数组的键名当作属性名,值为对应值;一般情况下都是关联数组,因为索引数组转的意义不大

3.null转换为对象:空对象

技术分享图片

结果为:

技术分享图片

4.其他标量数据转换为对象:属性名为固定的“scalar”,值为该变量的值

技术分享图片

类型约束:

强类型语音中如java、c中。定义变量或方法时都会指定返回值是什么数据类型的如字符串,整形等等。。。

php的较新的语法中,在某些特定场合,针对某些特定类型,也可以进行语法约束。

特定场合:函数(或方法)的形参变量

特定类型:对象类型(类名), 接口类型(接口名), 数组类型(array), 函数类型(callable

可以对函数(或方法)的参数设定必须使用的类型。只能对对象,接口,数组和函数进行约束,如下所示:

l function f1(类名 $p1){....}:要求该参数只能使用该类的对象;

l function f1(接口名 $p1){....}:要求该参数只能使用实现该接口的对象;

l function f1(array $p1){....}:要求该参数只能使用数组;

l function f1(callable $p1){....}:要求该参数只能是一个函数或方法,此时称之为回调函数(方法)

技术分享图片

同样的代码,对f1加上类型约束

 技术分享图片

再来举个数组例子:

 技术分享图片

与类有关的魔术常量:

 

__CLASS__,:获取其所在的类的类名。

__METHOD__:获取其所在的方法的方法名。

class  A{

  function  f1(){

    echo __CLASS__ //输出“A

    echo __METHOD__//输出“f1

    //注意:get_class()也可以得到类名,但其必须有个“对象”

    }

}

技术分享图片

数据(变量)序列化/反序列化

1.序列化就是数据转字符串,

2.反序列化就是字符串转数据

其他魔术方法

 

1.__sleep():序列化时会自动调用

2.__wakeup():反序列化时会自动调用

3.__tostring():把对象当做字符串来处理时会调用

4.__invoke():把对象当做方法来处理时会调用

一些有关类和对象的系统函数和运算符

class_exists(), :判断某个类是否存在(定义过)

interface_exists(), :判断接口是否存在

get_class():获取某个对象的“所属类名”

get_parent_class(), :获取某个对象的“所属父类的类名”

get_class_methods(), :获取一个类的所有方法,返回一个索引数组,就是这些方法的名字。

get_class_vars(), :获取一个类的所有属性,返回一个数组,下标为属性名,值为属性值。

get_declared_classes():获得所有声明过的类(含系统中的类)

is_object():判断是否对象

get_object_vars():获得对象的所有属性,返回一个数组,下标为属性名,值为属性值

 

两个特定语法场景的辨析:

对象向下传递特性;

当一个对象($o1) 调用一个实例方法,然后,在该实例方法(f1)中又去“静态”调用另一个类的方法(f2),则在方法f2中,会自动获得在方法f1中的那个$this对象。

技术分享图片

对比:

技术分享图片

static后期静态绑定特性:

技术分享图片

可见static3个不同含义的语法:

函数中的静态变量:

function  f1(){

static $v1 = 1;

}

类中的静态成员:

class A{

  static  $v1 = 1;

  static  function f1(){}

}

方法中的动态指代“当前类”:

class A{

  function f1(){

    static::f2();//static此时指代调用f1这个方法的类(或对象的类)

    self::f2(); //self这里永远指代当前A这个类。

  }

}

有关类的相关知识 面向对象的三大特性!!!!

标签:连接方式   索引数组   ted   标准   魔法   运行   int   UNC   存在   

原文地址:https://www.cnblogs.com/baobaoa/p/9151898.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!