有关类和对象的相关知识

类的自动加载

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

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

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,只能遍历“看得到”的属性——代码所在范围可访问。

在外面遍历:

可见,此时protected和private属性都没有遍历出来。

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

一个思考题:如果只需要某对象中的部分数据?比如:只要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加上类型约束

再来举个数组例子:

php有关类和对象的相关知识1的更多相关文章

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

    与类有关的魔术常量: __CLASS__,:获取其所在的类的类名. __METHOD__:获取其所在的方法的方法名. class A{ function f1(){ echo __CLASS__: / ...

  2. 类、对象(java基础知识六)

    1.Java约定俗成 java约定俗成 1,类名接口名 一个单词首字母大写,多个单词每个单词首字母都大写 2,方法名和变量名 一个单词全部小写,多个单词从第二个单词首字母大写 建议:如果能用英语尽量用 ...

  3. jQuery对象和DOM对象的相关知识

    所谓的DOM就是Document Object Model(文档对象模型)的缩写,或许是我水平低的缘故,感觉就是HTML的标记元素嘛,所以作者画了下面的图: 像这样的元素,就是所谓的DOM对象,获取值 ...

  4. 学习笔记——Java类和对象

    今天学习了Java的类和对象的相关知识,由于Java面向对象的编程的思想和C++几乎一样,所以需要更多的关注Java的一些不同之处. 1.类 1.1 在类这一块,除了基本的成员变量,成员方法,构造函数 ...

  5. Java_类和对象(完美总结)_转载_覆盖和隐藏的区别,覆盖就不能使用了,而隐藏提供全局方法名或者全局变量名还可以使用

    转载自海子:http://www.cnblogs.com/dolphin0520/p/3803432.html Java:类与继承 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封 ...

  6. C++类和对象(一)&&实现offsetof宏&&this指针

    一.目录 1.对象的相关知识 2.类的定义 3.类的实例化 4.类对象模型 5.模拟实现offsetof宏 6.this指针 二.正文 1.对象的相关知识 C语言是面向过程的,关注的是过程,分析求解问 ...

  7. php 类和对象

    ⾯向对象是⼀种编程范式,它将对象作为程序的基本单元,将程序和数据封装起来, 以此来提⾼程序的重⽤性.灵活性和可扩展性. ⽬前很多语⾔都⽀持⾯向对象编程,既然对象对象是⼀种范式,其实这就和具体的编程语⾔ ...

  8. python 类,对象

    声明类 ''' class 类名: '类的文档字符串' 类体 ''' #我们创建一个类 class Data: pass 声明类 class Person: #定义一个人类 role = 'perso ...

  9. python面向对象——类和对象

    一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程(流水线式) 优点:极大的降低了程序的复杂度 缺点:应用场景固定住了,可扩展性差 2.函数式编程 特点: a ...

随机推荐

  1. LOJ2327 「清华集训 2017」福若格斯 【不平等博弈】

    题目链接:LOJ 对于这道题,我们要分3步来做它. 什么是 Surreal Number 及如何解决博弈问题. 如何用 Surreal Number 解决这道题. 推出结论之后如何计数 首先看看这篇文 ...

  2. golang-复习1

    结构体: 是一种数据类型 type Person struct{  //l类型定义,地位等价与 int byte boo string ……通常放在全局位置 name string sex byte ...

  3. Django基础(1)-虚拟环境的安装及配置

    virtualenv介绍 (1)做什么的?virtualenv是用于创建独立的python环境,使得多个python应用彼此独立: (2)优点: a)使不同应用开发环境独立 b)环境升级不影响其他应用 ...

  4. 谈谈对Spring的理解

    转载自:  https://blog.csdn.net/qq_41701956/article/details/90453716 Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而 ...

  5. ZR#1015

    ZR#1015 解法: 我们需要求得, $ g_i $ 表示长度为的最长不下降子序列个数. 设 $ f_{i,j} $ 表示统计第前$ i $ 个数字,得到最长不下降子序列末端为 $ j $ . 显然 ...

  6. Java中判断数组是否为空

    一维数组// 一维数组: int[] arrayif(array == null || array.length == 0)    return true; 二维数组//二维数组: int[][] a ...

  7. mysql使用replace和on duplicate key update区别

    实际业务使用中,有时候会遇到插入数据库,但是如果某个属性(比如:主键)存在,就做更新.通常有两种方式:1.replace into  2.on duplicate key update 但是在使用过程 ...

  8. StringBuffer & StringBuilder的区别

    StringBuffer是线程安全的,内部有锁.所以比StringBuilder慢一点. 在单线程生成字符串的情况下,优先使用StringBuilder. 这就是为啥有时候IntelliJ Idea会 ...

  9. pip安装各种模块

    date: 2019-08-20   19:27:09 pip install requests pip install xpinyin pip install redis

  10. 谷歌官方 构建您的第一个应用 Kotlin版

    https://developer.android.google.cn/training/basics/firstapp MainActivity.kt package com.example.myf ...