php有关类和对象的相关知识1

有关类和对象的相关知识

类的自动加载

类的自动加载是指,在外面的页面中,并不需要去“引入”(包含)类文件,但是程序会在需要一个类的时候就自动去“动态加载”该类

什么叫做“需要一个类”?通常是这样的情况:

1,创建一个对象的时候(new

2,直接使用一个类名(操作静态或静态方法)

做法非常简单:

做法1:使用__autoload魔术函数。

即,“当程序需要一个类”的时候,就会去调用该函数:该函数我们需要自己去定义并在其中写好加载类文件的通用语句:

做法2:使用spl_autoload_register函数

该函数的作用是:用它“注册”(声明)多个可以用来代替__autoload函数作用的函数,语法如下:

spl_autoload_regist(“函数名1”);

spl_autoload_regist(“函数名2”);

.........

自然,其后也得去定义这些函数,并且这些函数的作用跟__autoload一样,不过此时就可以应对“更多的情形”——比如类文件分布在不同的目录中。

对象的复制(克隆)clone

浅克隆:

只能克隆对象中的“非对象非资源”数据:

但,如果对象中的属性存储的是“对象”类型,则就可以看到克隆不完全的情形,如下:

结果显示为:

可见,修改了o1中的b1数据,发现o2种的b1数据也跟着改变了——克隆不完全。

我们可以使用“深克隆”来解决:

深克隆:

php中,默认克隆是浅克隆

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

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

则刚才的代码,改进如下:

结果为:

对象遍历

对象也可以可以使用foreach语句进行遍历,有两点注意:

1,只能遍历属性。

2,只能遍历“看得到”的属性——代码所在范围可访问。

在外面遍历:

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

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

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

PHP内置标准类

可见该类内部没有定义任何属性。

但我们还是可以使用该类的属性——不存在的属性。

将数据转换为对象

转换基本语法:(目标类型)数据;

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

数组转换为对象:数组的键名当作属性名,值为对应值

但通常,如果数数字下标,则其对应属性 并不方便操作(->)

所以通常就适合于纯字符下标的数组。

null转换为对象:空对象;

结果为:

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

类型约束:

什么事类约束?

其他很多语言中,类型约束是语法上的要求,即定义一个变量的时候,必须指定类型,并以后也只能存储该类型数据——这种是强类型语言的一个特点。比如:

int  n1 = 1; //int类型变量

float  f1 ; //float类型变量

bool  function  getConcat( string  s1, string  s2){。。。。} //两个形参是string,返回值也是bool

php是弱类型语言,其特点是无需为变量指定类型,而且在其后也可以存储任何类型。

但:

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

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

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

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

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

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

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

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

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

再来举个数组例子:

 

posted @ 2018-10-18 10:10  收起你的小情绪  阅读(159)  评论(0编辑  收藏  举报