PHP

PHP是什么?

PHP:(1)超文本预处理器语言

(2)html的内嵌式语言:在html中可以嵌入php代码、在php代码中也可以放入html代码

(3)常用的网站编程语言 语言融合c语言 java语言 perl语言...

      (面向过程、面向对象连接mysql)

PHP优势?

(1)开放源代码 免费的 跨平台性强 效率高 

(2)快捷性 图像处理功能

PHP环境安装

第一步  双击xampp  看到如下界面

 

 

第二步点击next

 

 

第三步点击next

 

 

第四步 在非C盘里创建文件夹 名字任取 但是不要用中文 

 

 

第五步 选中自己创建的文件夹作为安装目录

 

 

第六步  点击next  看到如下页面

 

 

第七步 弹出网页  直接关闭

 

 

第八步 点击next

 

 

第九步 点击finish

 

 

 

   

看到如下界面:

 

 

点击start

 

      

不想使用点击stop 关闭

Xampp目录

 

 

站点目录:

站点目录是用来存放我们的资源的目录,使用xampp我们可以将我们的PHP代码放到htdocs下面运行

PHP入门程序

了解:http://localhost/demo.php,正常访问一个程序 http://ip地址:端口/项目,xampp中apache的默认80端口默认不用写 ,但是一旦改变了端口号,就需要写

入门程序

第一步:创建一个txt文档并将这个txt改为php文件  只需将后缀名改为.php就可以

 

 

并在文件中输入以下代码

 

 

第二步:在浏览器中输入http://localhost/demo.php 就会打印出对应的文件中的内容

 

 

开发工具的使用

开发工具

开发工具有很多,到底选择那一个呢?

推荐使用PhpStorm,但是配置比较麻烦

NptePad++ 就是一个记事本,但是功能也很啊,可以安装插件

Hbuilder 这个是考1+Xweb证书的开发工具   前端的开发工具

开发工具和站点的结合

站点是一个目录  目录存储的是PHP文件

开发工具是方便我们代码的书写

我们使用开发工具打开站点目录,然后对站点目录下的文件进行编写

 

 

Hbuilder安装PHP插件

(1)在xampp的安装路径下,在htdocs文件夹下新建项目phpinfo(即为一个文件夹)

 

 

(2)打开Hbuilder软件,选择“文件”–“打开目录”

 

 

       选择刚刚创建的phpinfo文件

 

 

(4)HBuilder上安装支持PHP的插件,点击“工具”–“插件安装”–选择安装“Aptana php”插件

 

 

选择第一个,然后选中选择,选择安装即可,安装完成后,完成后按照提示重启HBuilder软件

(5)配置HBuilder外置服务器(本文的关键所在哦)

选择”运行”--> 选择”浏览器运行”-->选择”设置WEB服务器”

 

   

选择“外置服务器”–“新建

 

 

填写名称和URL地址(http://localhost:80),此处80是我安装xampp时默认的端口

 

 

回到“web服务器”–把PHP类文件选为你刚刚新建的外置服务器

 

 

 

 

 

 

这样,外置服务器就基本配置好了

(6)新建php文件进行测试

在刚刚的phpinfo里新建PHP文件,

 

 

 写入代码

 

 

 打开运行这样,外置服务器就基本配置好了

(6)新建php文件进行测试
在刚刚的phpinfo里新建PHP文件

 

 

 

写入代码

 

 

打开“运行”–“运行配置”

 

 

找到左侧“PHP Page Web”右键单击选择“新建”

 

 

 

 运行后,会得到以下结果

 

 

至此我们能进行PHP的开发了

php基础语法

php的定界符

方式一:标准方式

  默认就是标准方式

 

 

方式二:短标记风格

默认:php是不开始短标记风格的,需要修改配置文件才能开始短标记风格

方式三:asp风格

在php7之前是支持的,现在不支持

方式四:script风格

在php7之前是支持的,现在不支持

php运行原理

我们通过地址输入相应的url地址取访问资源

资源:

   静态资源:图片 文档 视频  音频 html等等

   动态资源:php文件

(1)  当我们请求静态资源时,资源会立马给我们返回给你,显示在浏览器上

(2)  当我们请求动态资源时,资源会先执行加载并且进行计算,将计算结果返回给我们,显示在浏览器上

变量

php中定义变量的方式和java中非常类似

Java中定义变量的方式:定义一个整数类型的年龄age

  int age = 20

php中定义变量

  $age = 20;

方式 $变量名 = 变量值

 

 

注意事项:

(1)在php中变量必须以$开头,定义一个变量age,写法$age

(2)变量首字母不能以数字开头

(3)变量是区分大小写的,大写就大写,小写就小写

(4)变量不能使用特殊符号,>,&,<,下划线是可以使用的,变量不能出现中文

(5)见名知意  要取有含义的名字  最好是它的英文单词

  首字母小写 如果这个变量是由多个单词组成,除了第一个单词的首字母小写,剩下单词的首字母大写

userName

以上1-4条必须遵守,不遵守,代码运行报错

5条可以不遵守,尽量遵守,因为是规范

注释

和java注释一样

单行注释

 // 单行注释

 #  当行注释

多行注释

 /*多行注释*/

数据类型

 一个数据有2部分组成  类型+值

  年龄18岁 类型 整数  值 18

  身高170.5 类型 小数  值 170.5

(1)PHP的数据类型和java类似的 

(2)定义变量的时候,无需指定数据类型,PHP会根据数值的类型自动进行判断这个数据的类型

类型的查看

 

 

整数(int)

 

 

布尔类型(boolean)

 布尔类型对应的值: 只有2种  true 和false

 

 

echo var_dump($isSucess);

浮点类型(小数)

170.5

 

 

2个浮点数不能比较相等

 

 

原因:

在java,javaScript中,2个浮点数都不能比较相等的

浮点类型涉及到精度问题:

  浮点类型 0.58 实际值 0.580000000000000001

  浮点类型 0.58 实际值 0.579999999999999999

 

 

字符串类型

一个人的名字: zhangsan

在java中 表示一个字符串: 是一对双引号  “zhangsan”

          表示一个字符: 一对单引号  ‘a’

在Php中不管是单引号还是双引号都表示字符串

 

 

区别:

单引号: 推荐使用单引号

   单引号里面是什么,内容就是什么

   没有检查工作

   效率高

双引号:

   如果里面包含变量,会对变量进行解析(替换成值)

   有一个检查工作:看看是否含有变量

   效率低

 

 

数据类型的判定

PHP给了我们很多函数用来判定数据类型 这些函数都有一个共同的特征

(1)    返回值是一个布尔类型  结果  要么是true  要么是false

(2)    函数名称都是以is_类型的名称

     判断是否是整数 is_int

     判断是否是布尔 is_bool

 

 

is_int 判断是否是整形

is_bool 判断是否为布尔类型

is_float 判断是否为浮点类型

is_string 判断是否为字符串类型

is_array 判断是否为数组

is_object 判断是否为对象

is_null 判断是否为空

is_resource 判断是否为资源

is_numeric 判断是否为数值类型

is_callable 判断是否为函数

布尔类型的自动转换

这个自动转换我们不需要去记忆,平时在写代码的过程中尽量去避免这些问题

下面的情况是布尔值判断时自动进行类型转换

1 整形的0为假 其他的整形为真

 

 

2 浮点0.0为假 小数点后只要有一位非0的值结果就为真

 

 

3 空字符串为假 只要里面有一个空格都为真

4 字符串的0也看作为假 其他的都为真

5 空数组也将其看作为假 只要里面有一个值都为真

6 空也为假(null)

7 未声明成功的资源也为假

可变变量

可以用一个变量的变量值作为另一个变量的变量名

 

 

运算符

算数运算符

+  -  *  /  %

和java中运算符有什么区别

在java中5/2 = 2

在PHP中5/2 =2.5

 

 

案例 给定一个三位数  求它的个位+十位
+百位之和

153  3+5+1 = 9

 

 

赋值运算符

=

+=:a+=b 等价于a=a+b;

-=  /=  *=  %=

关系运算符

>  <  <=  >=  ==  !=  ===   !==

==: 等于  只是比较值  不比较值的类型

!= : 不等于  只是比较值  不比较值的类型

===: 等于  只有值和值的类型都相等  结果才是相等的

!==: 不等于  只要值和值的类型之中有一个不相等的 结果就为true

 

 

逻辑运算符

与 同时  &&  and 当&&前后的表达式的值都为true时,结果才为true,在运算过程中 当遇到第一个表达式的值为false 后面的表达式就不会运行了

或 或者  ||  or  当||前后有一个表达式的结果为true,结果就是true,遇到第一个表达式的结果为true,后面的表达式就不执行了

非 反  !

 

 

and 和 or的优先级小于=

 

 

三元运算符

语法:

  表达式?AA:BB

当表达式的结果为true时 执行AA

当表达式的结果为false时 执行BB

 

 

选择结构

程序有3大结构

顺序结构:代码从上到下执行

选择结构:判定 有多个分支

循环结构:重复做某件事情

选择结构的基本语法

写法和java基本上是保持一致的

If(关系运算符表达式){

  当关系运算符表达式的结果为true,执行这里面的代码

}else{

  当关系运算符表达式的结果为false时.执行这里面的代码

If(关系运算符表达式A){

  当关系运算符表达式A的结果为true,执行这里面的代码,后面中else if中的判断就不执行了

  当关系运算符表达式A的结果为false时,执行下面的esleif中的判断

}else if(关系运算符表达式B){

当关系运算符表达式B的结果为true,执行这里面的代码,后面中else if中的判断就不执行了

  当关系运算符表达式B的结果为false时,执行下面的esleif中的判断

}else if(关系运算符表达式C){

当关系运算符表达式C的结果为true,执行这里面的代码,后面中else if中的判断就不执行了

  当关系运算符表达式C的结果为false时,执行下面的esleif中的判断

}…else{

  当上述的所有关系运算符表达式都不成立时,执行else中的代码

}

 

 

switch的使用

当选择分支比较多的时候,我们建议使用switch来实现,能够减少判断的次数,效率更高

语法:

switch(表达式){

   case value1:

       代码;

       break;

   case value2:

       代码;

       break;

  …….

   default:

   代码

}

执行流程:表达式的值和case后面的值进行比较,相同的时候执行对应case中的代码,如果都没有比对上,执行default中的代码

 

 

循环结构

生活中我们有了选择,我们程序中就有了选择结构,正因为生活中有了循环,我们的程序中也就有了循环结构

while循环

循环肯定不是无休止的执行下去,肯定有执行的次数,一般我们通过一个变量控制循环的次数

语法:

 while(关系运算符){

    当关系运算符的结果为true时,执行循环体中的代码

}

 

 

案例:计算1-100的和(while实现)

 

 

案例:打印100-999之间的

水仙花数一定是一个三位数,个个位数的立方 相加得于本身

 

 

 

 

一个屋子里有一群人,如果3个人一桌多2个,5个人一桌多4个,7个人一桌

6个,9个人一桌多8个,11个人一桌正好坐满,请问这个屋有多少人?

 

 

For循环

For(初始条件;结束条件;步长){

                   如果结束条件为true,接着循环

}

 

 

do..while

基本不用了

只有在特殊的场景下才能用到

 

 

 

 

while和do…while的区别

while先判断在执行,可能一次都不执行

do..while先执行在判断,至少执行一次

goto语法

go:去  to:那里

 

 

 

 

 函数

为什么要有函数?

找出所有的水仙花数(100-999),怎么去判定一个数是水仙花数假设我们有专门的一个人专门帮你去判定一个书是否为水仙花,找出所有水仙花

      数字100、101、102、103、104…999让这个人去判定一下

      函数的思想从大局出发,忽略了细节,细节以后在考虑

函数的好处:可以更好地和其他的小伙伴协作

函数的定义

声明:

Function函数名(参数1,参数2){

     函数体

}

调用:

      函数名()

案例:给2个数,找出两个数较大的数

 

 

注意:

(1)函数的命名和变量的命名是一样的,但是函数的命名是不区分大小写的

(2)见名思意,一定要有意义的名字

(3)如果函数有返回值,使用return进行返回

函数的理解(本质)

(1)一个函数就是一个功能,这个功能是最基础的功能,不能在被拆分了

问题:找出所有水仙花数

            判断一个数是否为水仙花数是一个函数

(2)函数可以理解为一个黑盒子,黑盒子具有一定的功能,我们不关心这个功能怎么实现,只关心2方面,

第一方面:输入参数(原材料)

第二个方面:输出(结果)

判定一个数是否为水仙花数是一个函数

      输入:一个数字

      输出:是否为水仙花数

      找出两个数中最大的数

           输入:两个数

           输出:最大的数

案例:定义一个函数,判断一个数是否为水仙花数

      函数名字 shuixian

 

 

变量的作用域

域:地方,在程序中,一个大括号就是一个域

Undefined variable(变量未定义):变量没有定义的意思

局部变量

定义在函数内部,称为局部变量

局部变量只能在定义 域 里面使用,超出这个域该变量无效。

全局变量

定义在函数外部的,称为全局变量。

全局变量不能在函数内部使用(和java不一样)。

Global $a :关键字内部访问外部语句

 

 

静态变量

对于局部变量来说,函数调用完之后,变量的值就会被删除

Static(静止):通过关键字static来修饰变量,然后将它的值存储下来,并且说该变量的周期天地同寿(一直存在 和你的php文件一样)

变量的值,使用的是前一次调用之后的值

 

 

函数的引用

是将公共的代码放在一个php文件中,哪里需要这个函数,那么就直接引入这个php文件就还可以了

Include

 

 

 

 

Require

 

 

 

 

 Inalude和require的区别

                   如果导入的文件不存在 

                            Inalude:报错,但是后续代码会接着运行

            Require:报错,后续代码全部都不执行,引入的是非常重要的文件

XX_once 和 XX的区别:

         带once,在导入文件的时候会判断,判断之前是否已经加载过了,如果已经加载过了,就不加载了

         不带once,不去判断,直接加载,容易报错。重复加载会报错。

         推荐使用带once

回调函数

生活中的例子:

         老师:给你20块钱,你帮我去食堂买份饭回来;(老师是主动)

         学生:买饭去了……..人多。。。需要半个小时。。(学生是被动)

         老师:不会一直等你。。半个小时老师在开会。。

                            半个小时过去了。。。

         学生:回来了,主动,联系老师,老师饭回来了。(学生是主动)

         老师:感谢感谢,开始吃饭(老师是被动)

 

         学生再买饭的过程中,老师去干其他的事情了,没有浪费时间,提高了效率。

回调:学生回来后主动去练习老师,联系(调用)老师

程序中的例子:

 

 

 

 

注意点:

1、  回调函数的本质,将函数作为参数来传递;参数不是普通的值,是一大段能执行的代码,可以通过调用的方式,去执行这一大段代码。

2、  Is_callable,判定传递过来的参数是否为函数

变量函数

 

 

匿名函数

函数的作用:提高代码的复用率,可以调用多次

函数:函数名,参数,返回值 组成

 

匿名函数:没有名字的函数,本代码只能用一次,代码比较简洁高效。

 

 

 

默认参数函数

某一个参数没有传递值的时候,使用默认值

注意:有默认值的参数 放在 参数的后面

 

 

系统函数

PHP内部定义了很多的函数(功能),我们需要知道PHP提供了什么

站在巨人的肩膀上你就能就看得更远

数学函数

四舍五入(round)、随机的(rand)、天花板(ceil)、地板(floor)、开方、平方、立方、sin、最大值、最小值

 

 

地区与时间

 

 

时间转成时间戳

 

 

数组

数组是什么,它有什么作用

变量可以存储一个值,当我们再次给这个变量存储数据的时候原有的值将会被覆盖

         变量就是一个容器,这个容器只能存储一个值

         一个宿舍就是一个房间

数组可以存储多个数值

         数组是多个容器连接在一起了,每个容器都可以存储值。

         一栋宿舍有很多个房间

         一栋宿舍:每个宿舍含有宿舍编号,通过这个“编号”去区分那个房间

         一个数组:里面每一个元素,通过去区分里面的“编号”去区分每一个元素

                   编号(下标):0;1;2;3;4……;

数组的定义

range函数创建

range(开始,结束,步长)步长是可选的

         第一个元素:开始值A

第二个元素:开始值A+步长

 

 

数组就是一栋宿舍,通过宿舍号(下标)去找元素

使用range创建列表,他的下标是:0,1,2,3,4……

array方式创建

试用array函数创建数组:

它默认情况下的下标(0,1,2,3,4….)

可以自定义下表,但是下标不能重复

 

 

字符串用作下标是没有问题的

数组的基本操作

数组的访问

数组是一栋宿舍,在操纵数组里面的元素之前,必须要确定元素的位置(下标)

通过数组下标来实 现数组的访问

 

 

数组中元素的赋值与修改

通过下标确定里边的某一个元素,可以使用重新赋值的方式进行修改

 

 

数组的遍历

遍历:将数组里的元素一个一个拿出来

统计元素 个数(count)

 

 

For循环

数组下标是连续的

Foreach循环

数组下标是不连续的

Foreach(数组 as &变量)会将数组里面的值一个一个的拿出来给变量

 

 

List函数个each函数

 

 

数组的打印

echo:只输出字符串//(不算数组的打印)

peint_r:可以输出任何类型

                   如果输出的普通类型的话,直接输出值

                   如果输出的是数组的话,会按照数组的顺序将元素一个一个的数出

Var_dump:输出类型和值

 

 

数组的常用函数

 

 

队列和栈

队列:先进先出

栈:先进后出

队列和栈都是一种数据结构,我们可以使用数组去实现这种结构

 

 

 

 

数组的排序

 

 

面向对象

什么是面向对象

老师A让学生B帮忙去去1403教室去打印实验报告

 

面向过程:以过程为中心

(1)       老师A对B说:你走路去1403教室

(2)       老师A对B说:你把U盘拿出来,给打印店

(3)       老师A对B说:你把钱给打印店

(4)       老师A对B说:拿回实验报告

(5)       老师A对B说:你走路回来

 

面向对象:以对象为中心

(1)       把B创建出来

具备:走路能力,给U盘能力,付钱,走回来的能力

(2)       老师A让B对象去打印报告

有两个对象,老师 和 学生,他们分工明确

面向对象的基本概念

对象

一切皆对象,看到的万事万物都是对象

电脑,手机,水杯

对象是由两部分组成:

         静态的属性:描述这个对象 名词

                   手机:颜色,屏幕,摄像头,价格,尺寸,品牌

                   狗:大小,颜色,品种

         动态的方法:能干嘛 动词

                   手机:打游戏,发短信,打电话

                   狗:叫唤,陪主人玩

具有相同属性对象的 抽象

学生对象A B C他们都有共同的属性 => 学生类

狗对象A B C他们都有共同的属性 => 狗类

老师对象A B C他们都有共同的属性 => 老师类

 

可以通过类 去创建 对象

类:可以理解为模型(模板),通过这个模板创建出很多具体产品(对象)

抽象

抽象:忽略非重点,抽出我们关注的东西(属性)

学生:身高,体重,学号,年龄,血型,成绩….

学生的成绩管理系统:学号,成绩

学生的健康档案管理系统:身高,体重,年龄,血型

类和对象的定义

类的定义

         属性(成员变量):在类的内部定义的变量

         方法(成员方法):在类的内部定义的方法

 

类例:人类(Person)

         属性:名字 性别 身高

         方法:玩游戏 学习

 

 

实例化对象(创建对象)

         可以通过 类 去 实例化(创建)对象

         一个类可以通过创建多个对象,各个对象之间是相互独立的,他们有自己独立的内存空间

         使用new关键字:new类名();

 

         属性的访问:

                   对象的名称->属性的名称

         方法的访问

                   对象的名称->方法的名称();

 

 

注意:

(1)       类名首字母大写,如果多个单词用驼峰(大驼峰)

狗类(Dog)商品详情;ProductDetall

(2)       属性的命名和变量的命名是一样的,小写字母开头,如果多个单词使用用驼峰(小驼峰)

(3)       函数的命名 和 变量的命名是一样的

案例:定义一个狗的类

         属性:名字 类别type 性别

         行为:叫shout

 

 

构造函数 和 析构函数

构造函数

在创建对象的时候被调用

作用:对象属性初始化

构造函数只能有一个

注意:默认的情况下php会自动生成一个无参的构造函数,当我们自己写了构造函数之后默认的就没有了

析构函数

在对象消亡的时候被调用(死亡)

作用:善后工作,内存的消除 释放

析构函数会被系统自动调用。主程序完成的时候,会销毁所有的对象。

 

 

$this伪变量

This:当前对象

在普通函数中,调用,this就是谁

在构造函数中,this表示将要创造的那个对象

 

 

面向对象基本特征

封装

给你对象一个边界,对象内部的东西不允许你看到,对象里面的属性与方法 封装在类的内部,不对外公开。

         电脑显示器:

                   只留下:电源线,信号线,一些按钮,都是对外公开的。

                   内部有什么元器件,怎么工作的,不用关心

         好处:更简单,更安全

对于对象来讲,怎么去实现内部的属性不让外部访问???通过权限关键字去控制。

         对于不想公开的属性或者方法,使用关键字声明是私有的就好了

         Public:(公有的),可以使用var

                   对外公开,任何地方都可以访问

         Private:(私有的)

                   不对外公开,外部不能访问,只有类的内部可以访问

                   如果不想让外部访问,设置私有属性就可以了

 

 

 

Protected:(保护的)

         不对外公开但可以被继承

 

 

继承

什么是继承

         武侠:张无忌 继承 张三丰的武功

         宫廷里: xx 继承 皇位

         你和隔壁老王好像啊,你就继承了隔壁老王的基因

        

继承:后代允许去使用前辈已经拥有的,拿过来直接用,站在巨人的肩膀上才能看的更远

 

在程序的世界里代码也有继承,有对象(类)A继承于对象B(类)那么B对象就拥有了A对象的属性和方法(功能)

         被继承的对象A:父亲,parent

         继承的对象B:子类

 

 

注意:

(1)       Calss A extends B,A继承于B

(2)       Php单继承,只有一个爹

(3)       父亲的私有(private)属性不能被继承,私有属性不允许尾部访问

需求:不能被外部访问,但是可以被继承,父类使用:protected

(4)       Protected:(保护的)

            不对外公开,外部不能访问,但可以被继承

重写

如果子类的方法名称 和 父类 方法名称是一样的: 子类 重写 父类的方法

         在调用过程中:

 

 

 

重载

在一个类中,方法的名称相同,但是参数不同(参数的个数,参数的类型)

PHP是一种弱类型的语言,函数对于这个参数的的类型要求不是很高,天然的重载,

方式一:参数的类型

         天然的支持

方式二:参数的个数

 

 

final

final:最终,灭绝

如果说一个 类 或者 方法 被final 四u是,那么这个类和方法不能被继承

 

 

多态

相同的消息,不同的对象,做出的反应是不一样的

生活中:

         枪声响起:

                   跳水运动员:跳

                   跑步运动员:跑

         “小心肝”

                   对象对你说:你有机会。。。。

                   医生对你说:多半是废了

 

 

常量

变量的值是会变化的,常量的值是不会变化的

         场景:填写学生的信息,我们的期望,性别:男 和 女

                   实际:男 女 男性 女性

在编写的时候,不让搞你填写,直接选择

(1)       使用const关键字来定义

(2)       常量所有字符串都大写,多个单词用下划线分割

 

静态(static)

 

 

(1)       静态属性不属于任何一个对象,属于类

比如:班级班费,不属于任何一个学生,属于班级

(2)       静态属性的访问,通过类名访问

类名:名字  或 self::名字

(3)       多个对象读取 静态属性的时候,会在前一次操作的基础上进行。

::操作符

(1)       Parent:: 可以调用父类的属性,方法和常量

(2)       类名:: 调用本类中的静态属性、静态方法、静态常量

(3)       Self:: 它的作用和 类名::是一样的

特殊的类

抽象类

抽象类

如果一个类中,包含抽象方法,那么这个类:抽象类

抽象类需要使用abstract关键字进行修饰

抽象方法

任何形状都有用面积

         圆形:Π*r平方

正方形:长*宽

三角形:底*高/2

定义一个方法,只有声明,没有实现(这个方法没有办法实现)

该方法需要使用关键字abstract进行修饰

抽象类作用

抽象类一般都是 某类的 父类

继承于 抽象类的 这个类,必须实现抽象类型里面的抽象方法

约束:你是我的的后代,必须实现我的方法:谁继承谁实现里面的方法

 

 

接口(interface)

如果一个类的所有方法都是抽象方法,所有方法前面都加上abstract

这个时候可以考虑都不写,换一个方式,使用interface来修饰

(1)       接口interface,里面的所有方法都是抽象方法

(2)       继承(extends)类(class),只能继承于一个类

实现(implements)接口(interface),一个类可以实现多个接口

(3)       类class和接口interface是平级

 

 

对象的使用

引用和克隆

你要给你对象钱:

(1)       给现金

对象花了多少,你没啥感觉,花完就没了

独立--------------值传递

(2)       你把银行卡 副卡 给他

她把钱花了,你的钱就少了吧

你往银行里存钱,你对象能花的钱就更多了

你们相当于绑在一起了——————引用

 

 

总结:

(1)       在php中,基本的类型,一般的赋值,都是值传递。如果需要用到引用

的话,加上&  $c = &$a;

(2)       对于类的对象来说,进行赋值默认就是引用,如果希望赋值以后,两个对象

独立,2个对象没啥关系,使用clone(克隆)关键字

                   使用clone之后,会复制 原来对象里面的所有属性,复制一份,占用两份内存。和你之间的那个对象没有关系。

对象的比较

==:

         比较的值

         比较:比较的值

===:

         比较值 和 类型

         比较:比较的是内存空间

对象的普通赋值之后,本质就是引用,引用的话,他们的内存地址就是一样的

 

 

对象类型检测

Instanceof 可以判断一个对象 属于 哪个类

总结:

父类A,子类的B继承于A

         如果这个对象 是 子类B的对象,B的类型也属于A

         后代的对象 类型 属于 祖宗

子类对象 可以 赋值给 父亲对象

 

 

魔术方法

在我们php中以两个__开头的方法,都称为魔术方法

__construct():构造

__destruct():析构函数

__set()和__get()

就是java里的set 和get 方法

私有属性外部不能去访问,可以通过__set()和__get()访问

在php的类中,只需要写一个就好了,不需要每个属性去创建set 和get

 

__call()

当你调用的方法不存在的时候,可以使用__call()进行处理

__toString()

Java里的toString一样的

将对象转成字符

打印这个对象的时候,会自动调用该方法

posted @ 2021-04-27 13:56  小闫爱前端  阅读(182)  评论(1)    收藏  举报