PHP 军规 500 条 v1.0

PHP 军规 500 条 v1.0

说明:

  1. 最近复习 PHP,看之前写的笔记,总结了一些知识点,说成 军规 听着高大上.
  2. 实际没有 500 条, 大概 450 条左右, 考虑到随后可能会增删, 说成 500 条凑个整.
  3. 这些内容主要是基于 PHP 5.4 进行总结的,版本不同,得到的结果可能也不同.
  4. 为了看着整齐,编号从 1001 开始的, 1001 就是第 1 条
  5. 内容肯定有不少错误,疏漏,请大家指正.

1001~ PHP即“超文本预处理器”,是一种通用开源脚本语言。

1002~ PHP是在服务器端执行的脚本语言

1003~ 标准格式: <?php 开头, 以 ?>结尾, 如果是纯PHP代码,可以不写结束标记 ?>

1004~ PHP与HTML代码混合在一起时,PHP开始与结束标记必须写

1005~ 用PHP标记包装的代码,客户端不会执行

1006~ 单行注释 // 或 #

1007~ 多行注释 /* */

1008~ 关键字: 也叫关键词,是系统内置的具有特殊功能的字符. 如: if, for, while 等.

1009~ 变量名,函数名,类名,对象名等不可与关键字重复.

1010~ 关键字大小写不敏感,建议小写

1011~ 基本数据类型分 3 类:标量,复合,特殊

1012~ 标量类型:不可分割,最基本的单元.

1013~ 标量类型有 4 种:整型,浮点,字符,布尔.

1014~ 复合类型有 2 种:数组,对象

1015~ 特殊类型有 3 种: null 和 资源类型.

1016~ 定义变量时,如果不给初值,则值为 null

1017~ 建议给变量初始值,如: 空字符串 ‘’

1018~ null 可以初始化任何变量

1019~ echo 虽然可以加 ( ) 但它是语法结构,不是函数.

1020~ echo 不能用在 = 右边.

1021~ echo ‘
’; 表示换行

1022~ 布尔值真: true, 布尔值假: false

1023~ echo 值, 显示为 1

1024~ echo 值, 显示为空白

1025~ 正数(整数和小数)为真, 负数(整数和小数)为真.

1026~ 0, 0.0, -0, -0.0, 字符 ‘0’, 只要为零,就是假

1027~ 空字符串为假,非空字符串为真

1028~ null 为假

1029~ 空数组为假

1030~ 在单引号之间使用单引号,需要使用转义字符 ’

1031~ 被双引号包裹的字符串可以解析变量,以及转义字符

1032~ 双引号不能解析常量.

1033~ 在双引号中使用单引号,要成对使用

1034~ 反之,在单引号中使用双引号,也要成对使用

1035~ heredoc 结构适用于大段的文本, 可以解析变量,但是一般不这么做.

1036~ 同样, nowdoc 结构适也用于大段的文本

1037~ 变量是存放数据的容器.变量的值可以修改,变量可以被删除.

1038~ 字面量也叫直接量.用来初始化变量或常量

1039~ abc, 123 都是字面量, 不允许写在 = 的左边.

1040~ 小驼峰 $myName = ‘Tom’; 首个单词小写,之后的单词首字母大写.一般用于给变量和函数命名.

1041~ 大驼峰 $HisName = ‘Jim’; 每个单词的首字母都大写,常用于给类命名.

1042~ 变量名只能包含字母,下划线,数字

1043~ 变量名大小写敏感, $catname, $CATNAME, $caTnaMe 被认为是不同的变量

1044~ 变量名不能用数字开头,不能使用特殊字符. 可以用单个下划线开头

1045~ 双下划线开头的一般是系统内置的魔术方法. 因此, 变量名不建议用双下划线开头.

1046~ 可变变量:一个变量的名字是另外一个变量的值, 这就是可变变量.

1047~ PHP是一种弱类型的语言,各种变量类型可以自动相互转化

1048~ $num1 = $num2 是值传递, 两者相互独立, 各不干扰.

1049~ KaTeX parse error: Expected 'EOF', got '&' at position 8: var4 = &̲var3; 是引用传递, 一个变量的值发生了变化, 另一个也随之变化.

1050~ 全局变量:在函数外部创建,所以也叫:外部变量

1051~ 全局变量在当前页面任何地方都可以使用,在函数内部使用时,需要使用 global 声明

1052~ 在定义 1 个全局变量 $var 后,它会自动成为全局变量数组 $GLOBALS[] 中的一个键: $GLOBALS[‘var’]

1053~ 这个键 $GLOBALS[‘var’], 它对应的值就是 $var 的值.

1054~ 局部变量:函数内部创建,所以也叫内部变量,只在函数内部可用.

1055~ 静态变量:函数内部创建,只在函数内部可用,使用 static 定义.

1056~ 静态变量的值可一直使用.

1057~ 超全局变量:也叫预定义变量,全部都是数组,由系统自动生成,直接调用即可.

1058~ 用户无法自己创建超全局变量.

1059~ 超全局变量可以穿透作用域,在函数内外都可直接调用,无需 global 声明.

1060~ 超全局不是跨脚本,它还是在脚本内部起作用.

1061~ 定义常量 define(‘PI’, 3.14)

1062~ 常量名: PI, 常量值: 3.14

1063~ 调用常量,直接用 PI, 不要在 PI 前面加 $

1064~ 一元运算符,需要一个操作数,

1065~ 常见一元操作符: 自增运算符 ++, 自减运算符 --, i + + 等 同 于 + + i++ 等同于 ++ i++++i, 等同于 $i = $i + 1

1066~ 二元运算符,需要两个操作数,如 20 + 30

1067~ 三元运算符只有一个,格式:表达式1 ? 表达式2 : 表达式3

1068~ 如果表达式1为真,执行表达式2, 如果表达式1为假, 执行表达式3

1069~ 字符串运算符,只有一个, 就是点号 . 用于字符串之间的连接.

1070~ 算术运算符: + - * / % ,分别念作: 加, 减, 乘, 除, 模(也叫取余符号)

1071~ 取余符号 % 的作用就是取出余数, 如 5 % 3 商 1 余数是 2 , echo 5 % 3, 就显示 2

1072~ 如果 % 两边都是小数, 如 7.9 % 3.6, 它会扔掉小数部分, 只计算整数部分 7 % 3 商 2 余 1.

1073~ 如果 % 两边有整数和小数的话, 它也是扔掉小数部分,只用整数部分进行运算.

1074~ 赋值运算符: = += -= *=

1075~ $a += $b 等同于 $a = $a + $b

1076~ 赋值运算符是等号和算术运算符的组合.所以也叫:组合运算符

1077~ 比较运算符: > < >= <= != 比大小, 结果为布尔值. != 不等于

1078~ 逻辑运算符: 且 &, 或 |

1079~ x == y 等于, 如果 x 等于 y,则返回 true,否则返回 false

1080~ 0.5 == ‘0.5’ 为真

1081~ x === y 绝对等于,如果 x 等于 y,且它们类型相同,则返回 true

1082~ 0.5 === ‘0.5’ 为假, 1.2 === 1.2 为真.

1083~ x !== y 不绝对等于,如果 x 不等于 y,或它们类型不相同,则返回 true, 1.6 !== ‘1.6’ 为真

1084~ 表达式,代码中的任何部分都可以看作是表达式.

1085~ 表达式的左边为前面,右边为后面.左边是开头,右边是结尾.

1086~ 表达式的官方定义:任何有值的东西

1087~ 字面量表达式 10, ‘php’

1088~ 变量,常量表达式 $name PI

1089~ 赋值表达式 $userName = ‘Tom’;

1090~ 比较表达式 $b > $a, (15>10 && 20>19)

1091~ 函数表达式 $name = getName(‘Tom’);

1092~ 三元运算符表达式 isset( n a m e ? name? name?name:null;

1093~ 代码块: 用符号(一般是大括号包裹的一行或多行代码)

1094~ 函数: 具有一定功能的代码块.

1095~ 函数的调用机制,是以文件为基础运行的.

1096~ 函数名前面不写 $, 函数名后面必须写 (

1097~ 函数名不区分大小写, showName( ) 和 ShowName( )被认为是同一个函数.

1098~ 由于变量名是严格区分大小写的,为了保持一致,建议函数名和变量的命名一样,也采用驼峰法.

1099~ 函数的参数个数可以为 0 个, 1 个或多个

1100~ 函数一般都会有 return 语句,用以返回函数运算的结果

1101~ 函数里面也可以没有 return

1102~ 函数的结尾不要加分号 ;

1103~ 函数 A 可以调用本页面的任意另外一个函数 B , 而不用关心 A 和 B 在本页面的先后顺序.

1104~ 函数内部还可以定义函数,这样的函数叫做内部函数,只在函数内部起作用.

1105~ 在函数内部调用外部的函数,不需要 global 声明.

1106~ 外部函数默认的作用域是全局的.也就是在本页面的任何地方都可以调用外部的函数.

1107~ 形参:形式参数,定义函数时的参数为形参

1108~ 实参:实际参数,在调用函数时,传递给函数的参数为实参.

1109~ 函数传参方式1:值传递,把变量的值复制一份,传递给函数,变量本身的值不改变

1110~ 传参方式2:引用传递,形参是实参的引用,两者指向同一块内存,形参的值+1,实参的值也随之+1.

1111~ 默认参数:有默认值的参数,一般写在函数的最右边.

1112~ 函数从左到右依次接收参数,如果把默认参数写在左边,先接受的参数就会覆盖默认值.

1113~ 可变参数:可以接收任意多个参数.定义函数时,只定义 1 个参数,调用时,可以接收 3 个, 5 个, 10 个.

1114~ 可变函数: 也叫"变量函数",一个变量的值是另一个函数的名字.

1115~ 如果可变函数中存在内部函数,则调用可变函数时会报错.

1116~ 匿名函数: 没有名称或者名称可以动态设置的函数.也叫函数表达式.

1117~ 匿名函数是把函数赋值给一个变量,所以它和可变函数基本是一回事.

1118~ 闭包函数: 就是在一个函数内部,引入了一个匿名函数

1119~ 回调函数: 在一个函数里面,接收另外一个函数当作自己的参数使用.

1120~ 回调函数也可以接收普通的参数.

1121~ 回调函数中接收的函数类型的参数会被优先执行,哪怕它是最后一个被接收的参数.

1122~ 文件包含:也叫 文件引入, 关键词: require 和 include

1123~ require ‘fun1.php’; 在本文件引入 fun1.php,然后在本文件中即可调用 fun1.php中的函数

1124~ require 一般放在文件的开头,如果引入失败,程序就停止运行.

1125~ include ‘fun2.php’; 也是引入文件,如果引入失败,会给出警告,但是程序还会继续运行.

1126~ require_once, include_once 确保只引入一次.

1127~ require,include 后面的参数(文件名,可以放在括号里,也可以直接写出,没有区别.

1128~ 数组: 是有序的元素序列,PHP中的数组实际上是一个有序映射

1129~ 索引数组,键名是整数,如果不是,则会自动转换,整数从0开始.

1130~ 关联数组,键名是字符串

1131~ 一维数组,就是普通的数组,使用最广泛

1132~ 二维数组,数组中的元素还是数组,也就是一个数组里面还有子数组

1133~ 多维数组,多层数组的嵌套,一般不建议嵌套多层数组.

1134~ 判断:对表达式进行判断,判断后,对判断结果做出响应,

1135~ 不同的判断结果会有不同的响应结果,也就是分支.

1136~ 单分支: if(判断{…}

1137~ 双分支: if(…{…}else{…}

1138~ 多分支: 顺次进行判断, if(…{…}elseif{…}elseif{…}else{…}

1139~ 多分支: switch case

1140~ 循环: 重复执行一段代码.

1141~ for 循环: for(循环初始化; 判断条件; 循环增量{循环体}

1142~ for($i=0; $i<5; $i++{…}

1143~ while 循环: while(判断{循环体, 循环增量}

1144~ do while 循环

1145~ foreach 数组循环: foreach(数组名 as 变量1 => 变量2{循环体}

1146~ 面向对象(OOP是一种思想,而不是技术.

1147~ 类是生成对象的模板,对象是类的一个实例

1148~ 类是蛋糕模子,对象是用蛋糕模子做出来的蛋糕.

1149~ 类名可以小写,但是强烈建议大写.

1150~ 创建类: class 类名{…} 类名前面不要写 $

1151~ 类名可以是一个变量名,这是之前学过的可变变量

1152~ 类里面定义的变量叫:成员变量,也叫成员属性,简称 属性

1153~ 类里面定义的函数叫:成员函数,也叫成员方法,简称 方法

1154~ 常用访问控制符 public, private, protected

1155~ 属性的声明必须以访问控制符或以 static 开头

1156~ 如果属性以 static 开头, 默认是 public 属性

1157~ 访问控制符只能用在类里面,用在类外边会报错.

1158~ 访问控制符可以和 static 连用, 如 public static

1159~ public公共属性,外部可以访问

1160~ private私有属性,只允许类中的方法调用

1161~ protected受保护的,仅允许本类或子类访问

1162~ 和属性一样,方法一般也用访问控制符开头 public,private,protected. 如果不写,默认 public

1163~ 强烈建议给所有的属性和方法写上访问控制符.

1164~ $this 代表当前对象, 指向符 -> 指向当前对象的属性

1165~ 在类的内部访问自己的属性或方法,必须使用 $this, 在类的外部,使用对象名-> 访问.

1166~ 创建对象的过程,就是类的实例化

1167~ 创建对象 $obj = new Demo(;

1168~ $obj就是类Demo的实例. 这里的小括号 ( 根据情况,可写,可不写.

1169~ 对象的复制: $obj2 = $obj 这个类似但不同于引用传递, $obj2 和 $obj 指向同一个对象标识符.

1170~ 对象的克隆: $obj2 = clone $obj 这个是值传递, $obj2 和 $obj 相互独立,各不影响.

1171~ 克隆对象与重新 new 一个对象的效果完全相同. 但是 clone 创建对象的效率比 new 高.

1172~ 本体和克隆体相互独立,互不干扰,互不影响. clone 创建对象的效率比 new 高.

1173~ class_exists(‘类名’ 判断该类是否存在

1174~ method_exists($对象名,‘方法名’ 判断对象是否拥有此方法

1175~ property_exists($对象名, ‘属性名’ 判断对象是否拥有此属性

1176~ 常量:常量是存放数据的容器,一旦定义,无法修改,不能取消,不能删除.

1177~ 常量具有全局作用域,且穿透函数,可在函数内部使用.

1178~ 常量可以小写,但强烈建议全部大写,用下划线连接单词.

1179~ 类常量: 在类中定义的常量.

1180~ 类常量具备普通常量的性质.但又有自己的特点.

1181~ 类常量用 const 关键字定义. const PI = 3.14

1182~ const 前面不能用 public/protected/private 修饰

1183~ 类常量默认权限 public

1184~ 在类外部访问类常量: ‘类名::常量名’, ‘接口名::常量名’,

1185~ 在类内部访问类常量: ‘类名::常量名’, ‘self::常量名’

1186~ 一个常量是属于一个类的,而不是属于某个对象的.

1187~ 类常量可以被子类继承

1188~ 类常量的值不能是对象,可以是数组,整数,小数,字符串,布尔值,null(没意义

1189~ 如果是 php 5.5.12版本, 类常量的值是数组会报错. php 5.5.38则不会报错.

1190~ 静态属性是类本身的属性,它不依赖对象.一个静态属性可以被多个对象共享.

1191~ 静态属性在类的内部访问,可使用 类名::$静态属性名 或者是 self::$静态属性名(推荐

1192~ 静态属性在类的外部访问,使用 类名::$静态属性名

1193~ 静态属性也受到访问控制符的控制,如果在类的外部访问,必须是 public

1194~ 可以在类外边使用 static 定义静态变量.

1195~ selff:: 和 $this-> 的使用方式不同, :: 是范围解析符,而 -> 是对象操作符

1196~ self 指向类, $this 指向对象

1197~ 类里面的方法可以分为静态方法和非静态方法(普通方法

1198~ 普通方法必须要让对象来调用,类调用普通方法会报错.

1199~ 普通方法可以访问静态属性和普通属性.

1200~ 普通方法可以调用静态方法和普通方法.

1201~ 静态方法只能访问静态属性,只能调用静态方法.

1202~ 静态方法,属于类本身的方法,它不属于哪一个对象,因此需要类来调用.

1203~ 可以在静态方法中实现别的类的对象,然后通过这个对象调用普通属性和方法.

1204~ 由于静态方法只能访问静态属性,所以静态方法接收的参数,必须是静态的.

1205~ 如果在类外边使用 static function 会报错

1206~ 类调用静态方法(类的方法: 可以

1207~ 类调用普通方法(对象的方法: 不行,会报错 Fatal error.

1208~ 对象调用静态方法(类的方法: 可以,能运行,但是不推荐,因为会引发警告信息.

1209~ 对象调用普通方法(对象的方法: 可以

1210~ 静态属性和方法属于, 普通属性和方法属于对象

1211~ 用调用静态方法.用对象调用普通方法.各调用各的.

1212~ 常量是数据的容器,一旦被创建,不可修改,不可删除.

1213~ 常量名可以小写,但是强烈建议所有字母全部大写

1214~ 常量名前面不要写 $, 会报错.

1215~ 在定义常量时,必须给常量赋值.常量只能被赋值一次,随后不可以再赋值.

1216~ 常量具有全局作用域,并且穿透函数,函数内部也可以用.

1217~ 如果在函数内部创建常量,则该常量只能在函数内部使用.

1218~ 定义常量: define(函数, define(‘常量名’, 表达式

1219~ define(‘PI’, 3.14 常量名是 PI, 常量的值是 3.14

1220~ 双引号不会解析常量.只会把它当作普通字符串对待.

1221~ 如果直接调用一个字符串, 如 echo(PI; 那么 PI 会被当作一个常量看待.

1222~ 常量无法在类里面使用.类里面的常量叫做:类常量.

1223~ 在类里面创建的常量叫做:类常量,使用关键字 const 定义.

1224~ 类常量具备常量的大部分特点.

1225~ 不要在 const 关键字前面写 public/protected/private, 会引发 Parse error 语法错误.

1226~ 系统会自动给类常量分配 public 权限.

1227~ 类常量只能用于类里面,不能用于函数中.

1228~ 在类内部访问: ‘类名::常量名’, ‘self::常量名’ (推荐

1229~ 在类外部访问类常量: ‘类名::常量名’ 或 ‘接口名::常量名’,

1230~ 在类外部访问类常量,也可以使用 '对象名::常量名

1231~ 类常量属于类本身,而不属于某一个对象.这一点和静态属性类似.

1232~ 类常量可以被子类继承.

1233~ 类常量的值不能是对象,可以是数组,整数,小数,字符串,布尔值,null(没意义

1234~ 构造方法:在创建对象时候可以被自动调用的方法.也叫构造函数

1235~ 构造方法的固定写法: function __construct 不可更改

1236~ 构造方法前面可以加上访问控制符,一般是 public

1237~ 构造函数默认的访问修饰符是 public

1238~ 如果将构造函数的权限改成 protected 或 private,在类外边 new 一个类就会报错.

1239~ 构造方法以双下划线开头,所以它也是个魔术方法

1240~ 构造方法没有 return ,写了 return 不报错, 但是也不起任何作用,无意义.

1241~ 创建对象时,系统会自动调用构造函数, 不要手动调用, 不报错, 但是无意义.

1242~ 构造函数不会创建对象,它的作用是:初始化属性(成员变量

1243~ 构造函数可以初始化静态属性,但是一般不这么做.

1244~ 在一个类中,有且只有一个构造函数.定义多个就会报错.

1245~ 如果把类名当做构造函数的名字也不会报错,但这是 php4 时代的旧方式,现在不推荐使用.

1246~ 默认构造函数: 如果我们不写构造函数的话,系统会自动写一个构造函数

1247~ 默认构造方法如右: public function __construct({} 就是一个空的函数,里面啥都没有.

1248~ 如果自己写了构造函数,原来默认的构造函数就被覆盖了. 这也叫做 ‘复写构造方法’

1249~ 在创建对象时,可以传入参数,这些参数会被构造函数自动接收.

1250~ 传入参数的顺序和数量与构造方法中定义参数的顺序和数量是一致的.

1251~ 当访问属性时会自动调用构造函数.

1252~ php 文件执行后,所有数据会被自动销毁,

1253~ 如果想在文件执行完毕之前,就把某个对象干掉,需要用析构函数.

1254~ 析构函数是在对象销毁前,被系统自动调用的.

1255~ 析构方法也是魔术方法,它也是在满足一定条件时被自动调用的.

1256~ 析构函数不是销毁对象本身,而是在对象销毁前,销毁对象所创建的资源,比如:数据库链接.

1257~ $obj = null 并不能销毁 $obj 之前创建的资源,如: MySQL 连接. 因此需要析构函数

1258~ 如果在代码中写出了析构函数,就会自动覆盖掉默认的析构函数.

1259~ 析构函数不接收参数,你给它参数会报错.

1260~ 如果对效率没有特别高的要求, 一般不用析构函数

1261~ 如果不确定后面代码是否还会使用资源,那么建议不要用析构函数.

1262~ php具有垃圾自动回收机制

1263~ 当一个对象没有任何引用指向它的时候,它就会成为一个垃圾对象, php将启用垃圾回收器将对象销毁.

1264~ 当文件执行完毕,php也会启用垃圾回收机制.

1265~ 每个内存对象都分配一个计数器, 当内存对象被变量引用时, 计数器+1,当变量引用撤掉后,计数器-1,

1266~ 当计数器=0时,表明内存对象没有被使用, 系统将销毁该内存对象垃圾回收完成.

1267~ 魔术方法:当满足一定条件时被调用的函数,这些函数都是系统内置的,且以双下划线 __ 开头

1268~ 魔术方法,它不叫魔术函数,说明这些方法都是在类内部使用的.

1269~ 魔术方法都是系统提供的,它们的名字都是固定的,不能修改,程序员直接使用即可.

1270~ 由于所有的魔术方法名字,都是以 __ 开头的, 为了避免混淆,程序员自定义的函数不要用 __ 开头

1271~ 魔术方法是在满足某个条件的时候,由系统自动调用的.构造函数和析构函数都是魔术方法.

1272~ 对象在访问属性和调用方法的时候经常会触发类内部的魔术方法.

1273~ 当程序员去使用不可访问的属性时,系统就会调用 __get( 方法.

1274~ 当程序员去给不可访问的属性直接赋值,系统就会调用 __set( 方法

1275~ 当对不可访问的属性进行了 isset( 对 象 名 − > 属 性 , e m p t y ( 对象名->属性, empty( >,empty(对象名->属性操作,会触发 __isset( 方法

1276~ 当对不可访问的属性进行了 unset($对象名->属性操作, 会触发 __isset( 方法.

1277~ 当调用了不存在的属性/方法,或者调用了protected,private属性/方法,就会触发 __call( 方法

1278~ 当使用一个未定义的类的时候,就会触发 __autoload( 函数.

1279~ 也可以使用 __autoload( 自动加载类

1280~ 当使用 clone( 复制对象的时候,会自动触发 __clone( 方法

1281~ 如果不想对象被复制,可以复写 __clone( 方法,将其访问控制符改为 private __clone(

1282~ 单例模式:出于某种考虑,如:提高 MySQL 的效率.一个类只允许有一个对象.

1283~ OOP 编程的三大特征: 封装,继承,多态.

1284~ 多态性是指:相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。

1285~ 而不同的对象,收到同一消息将可以产生不同的结果,这种现象称为多态性。

1286~ 多态就是’多种状态’,就是指在面向对象中,对象(类在不同情况下的多种态度.

1287~ php 手册里面没有明确说 ‘多态’, 但是在实际上可以体现出来.php天生就是多态语言

1288~ php 可以根据传入的对象类型不同,调用对应该对象的方法.

1289~ 你传给他父类,就调用父类的方法,传的是子类就调用子类的方法.

1290~ 由于PHP天生就是多态,所以对于多态提及较少. 一般说的最多的是:封装和继承.

1291~ 抽象并不是三大特征,但它是面向对象中一种非常重要的思想.

1292~ 将一类实物共有的属性和行为提取出来,形成一个类.这种解决问题的方法就是 ‘抽象’.

1293~ 对象的封装,主要是指对象属性的封装,封装后的属性对外部是不可见的,不允许在外部直接访问.

1294~ 封装的基本概念1:把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,

1295~ 封装的基本概念2:程序的其他部分只有通过被授权的操作(成员方法才能对数据进行操作.

1296~ 访问控制修饰符的范围大小 public > protected > private

1297~ pubic 公共的,访问范围: 类外部,子类中,本类中

1298~ protected 受限的,访问范围: 子类中,本类中

1299~ private 私有的,访问范围: 只能在本类中访问

1300~ 上面的访问范围对静态属性,静态方法,普通属性和普通方法都起作用.

1301~ 对象封装使用 private,意思是:私有的,自用的.

1302~ 关键字: var, 在 php4 中使用, 等同于 public. 现在已经基本不用了.但是用了也不报错.

1303~ 成员方法(包含静态成员方法前面不写访问控制修饰符的话,默认是 public

1304~ 可使用 public 权限的方法将封装的对象的属性值返回.

1305~ 继承的关键字是 extends 意思是扩展,也就是在原有类的基础上,扩展功能.

1306~ class B extends A{} , B 继承了 A, 儿子继承父亲,所以 A 是父类, B 是子类

1307~ class C extends B{} , C 继承了 B, C 是子类, B 是父类. C 是 A 的扩展类

1308~ 父类 --> 子类 --> 扩展类. 注意:这里不叫 ‘孙类’, 叫扩展类.

1309~ 继承父类后,子类自动获取了父类的成员属性和成员方法

1310~ 在父类中的属性,继承后,它在子类里面属性不变

1311~ PHP只能单继承,不能多继承.

1312~ 子类可以继承父类中 public 和 protected的属性和方法

1313~ 子类不能继承父类中 private的属性和方法

1314~ 子类可以继承父类的静态属性,静态方法,类常量

1315~ 方法的调用:$this->方法名(;如果子类中有该方法,则调用子类中的方法,否则调用父类的

1316~ parent::方法名(,始终调用的是父类中的方法。

1317~ 变量的调用:$this->变量名;如果子类中有该变量,则调用子类中的,否则调用父类的.

1318~ 重写 override 也叫:复写,覆盖.

1319~ 如果子类中的方法名和父类中的方法名一样,且参数的个数一样.那么就可以说:子类重写了父类的方法.

1320~ 子类中和父类同名的方法,参数的个数也必须和父类中的一致.否则报错

1321~ 如果父类方法的参数使用了类型约束,那么在子类的方法中,参数的类型要和父类的一致.

1322~ php 的参数类型限制只有两种,数组类型和对象类型

1323~ 重写之后,需要使用 $this-> 来调用重写后的方法.

1324~ 如果还想调用被重写的父类方法,要用 parent::方法名(

1325~ public 和 protected 属性可以被重写,private 属性不能被重写

1326~ parent::静态属性名.能访问父类的静态属性

1327~ 子类重写父类的属性和方法,不会影响到父类.

1328~ 子类重写方法时,其访问权限必须比原来更宽.

1329~ 访问控制修饰符的权限由宽到窄: public(最宽 > protected > private(最窄

1330~ 抽象类: 使用 abstract 声明,它的侧重点是在设计,提供一种规范,让别的类来继承它.

1331~ 抽象类不能实例化,只能被子类继承.

1332~ 抽象方法使用 abstract 声明.

1333~ 抽象类中可以没有抽象方法.

1334~ 抽象类中可以有普通方法,静态方法,属性,静态属性,类常量.

1335~ 属性,类常量不能使用 abstract 声明.

1336~ 不能使用 abstract 声明静态属性或静态方法.

1337~ 只要一个类中有一个抽象方法,那么这个类就必须是抽象类

1338~ 抽象方法可以有参数,但是不能有方法体,也就是不能有 { }, 哪怕 { } 里面啥都不写也不行.

1339~ 可以使用 ‘抽象类名::属性/方法名字’ 来调用静态属性和静态方法.

1340~ 如果一个类继承了抽象类,则必须实现抽象类中的所有抽象方法,除非自己也是抽象类

1341~ ‘实现’ 就是 ‘重写’ 的意思,哪怕只是给父类的方法加上一个空的 { } 也算是实现了抽象方法.

1342~ 抽象类是一种防错机制.我在抽象类里面定义的抽象方法,你必须在类里面全部实现,少一个就报错.

1343~ 接口使用关键字: interface 定义.

1344~ 接口是更加抽象的抽象类,它里面所有的方法都不可以有方法体.

1345~ 接口体现了程序设计的多态和高内聚低耦合的设计思路.

1346~ 高内聚:模块化,一个模块一个功能.

1347~ 低耦合:类和类之间相对独立.修改了一个类,不影响另一个类.

1348~ 接口就是公开的,对外的,所以接口里面所有的方法都必须是 public.

1349~ 接口中的所有方法必须是 public,如果不写 public, 默认就是 public

1350~ 接口命名规则:和类名类似,用大驼峰,然后在最前面加一个小写 i, 如 iMyInterface

1351~ 在规范的代码中,如果一个类的名字前面有一个 i, 那么它应该就是接口.

1352~ 接口中的所有方法都是抽象方法,所以不需要用 abstract 修饰, 用的话显的多余,并且会报错.

1353~ 接口中的方法可以接收参数,但是不能有方法体.这一点和抽象类是一致的.

1354~ 接口不能实例化,只能被 implements 或 extends

1355~ 接口能继承另一个接口,也可以继承多个接口(用逗号隔开.但是接口不能实现另一个接口.

1356~ 接口不能继承类

1357~ 类不能继承接口,类只能实现接口. 并且,类必须实现接口中的所有方法.

1358~ 一个类可以实现多个接口,接口之间用逗号隔开.这个类必须实现所有接口中的所有方法.

1359~ 接口中不允许有静态方法.不允许有静态属性,不允许有普通属性.

1360~ 接口中可以有属性,但必须是类常量, 默认是 public, 但是不能显式修饰(不能手写 public

1361~ php 是单继承的语言,一个类只能有一个父类.

1362~ 继承是层级式的,修改一个类就会影响到其他的.而接口就比较灵活,它只会影响实现它的类

1363~ 接口是对继承的补充.它可以扩展一个类的功能.

1364~ static 关键字,除了定义静态属性和静态方法之外,还可以实现延迟静态绑定的功能.

1365~ parent绑定父类,self绑定本类,他们和类的绑定是在编辑阶段进行的.

1366~ 所谓在编辑阶段绑定,意思就是写完代码后就立即绑定了,这种绑定是固定的,不变的.

1367~ static 也可以和类绑定,但不是立即绑定, 它是:延时绑定

1368~ 所谓延时绑定:意思是在编辑阶段先不绑定,而是延时到代码运行的时候,谁调用它,它就绑定谁.

1369~ 并且 static 只能绑定静态方法和静态属性.所以叫做:延迟静态绑定.

1370~ static:: 可以调用类的静态方法,有延迟静态绑定效果

1371~ static:: 可以调用类的静态属性,有延迟静态绑定效果

1372~ static:: 可以调用类的非静态方法,但是没有延迟静态绑定效果;

1373~ static:: 不能调用非静态属性.

1374~ 如果不想某个方法被子类重写,可将该方法修饰为 final 方法

1375~ 如果不想某个类被继承,可将该类修饰为 final 类

1376~ final 不能修饰成员属性

1377~ final 方法不能被重写,但是可以被继承

1378~ 一般来说,final 类里面不会出现 final 方法.因为类都不能被继承了,方法肯定也不能被重写了.

1379~ final 类可以实例化.

1380~ 对象的遍历是指对某个对象的属性进行遍历.

1381~ 在使用 foreache 循环的时候,系统会自动用 $key, $val 去对应对象中的 ‘属性’ 和 ‘值’

1382~ 对象的遍历,一般是遍历的公共属性 public

1383~ 对于 protected 和 private,在类的外部是不能直接访问的,可在类的内部定义public函数进行遍历.

1384~ 内置标准类stdClass:系统内置的类,不需要程序员创建,直接使用即可.standard class 缩写为 stdClass

1385~ 把一些数据以对象属性的方式存储,但又不想新建一个类,就可以使用内置标准类

1386~ 把某个数据类型强行转换成对象类型,那么这个对象是内置标准类的实例.

1387~ 把一个数组转成对象,这个对象就是内置标准类的对象.

1388~ 数组转对象,使用关键字 object

1389~ a r r = ( o b j e c t arr = (object arr=(objectobjArr; 将数组 $arr 转换成内置标准类的对象 $objArr

1390~ 先 $num = 20; 然后 n u m = ( o b j e c t num = (object num=(objectobjNum; 将整数 20 转换成内置标准类的对象 $objNum;

1391~ 自定义一个 Cat 类, 然后 n u m = ( C a t num = (Cat num=(CatobjNum 报错, 不允许转换成自定义的类,只能转成内置标准类

1392~ 对象可以转换成数组.

1393~ 对象转换成数组时,只能保存普通属性

1394~ 对象转换成数组时,不能保存静态属性,不能保存静态方法,不能保存普通方法,但是也不报错.

1395~ 对象转换成数组后,可以通过 var_dump 看到受限的和私有的属性,但是不能访问

1396~ 对象没有实体,程序运行完就消失了,想保存它就需要序列化.

1397~ 序列化:将对象转换成字符串,然后保存到文件中.有时也叫做: freeze 冷冻

1398~ 反序列化:将一个序列化的字符串,重新恢复成对应的对象.

1399~ 对象序列化利于对象的保存和传输

1400~ 对象序列化可以让多个文件共享对象.

1401~ 将序列化后的对象保存到文件中,然后可以在不同的时间段操作该对象.

1402~ 序列化函数:serialize(, 反序列化函数:unserialize(

1403~ serialize(会触发魔术方法 __sleep(. 可以在 __sleep( 里面设置哪些属性需要序列化

1404~ unserialize(会触发魔术方法 __wakeup(. 可以在 __wakeup( 里面初始化或修改属性.

1405~ trait 类, 也叫:方法集.

1406~ 创建 trait 类使用关键字 trait

1407~ 可以在类中使用关键字 use 引入 trait 类中的方法为本类的对象所用

1408~ trait类可以有属性,但是不能有类常量.

1409~ trait类不能实例化,只能被其他类 use, 然后被其他类的对象调用.注意:是被对象调用,不能被类调用.

1410~ trait类可以嵌套,但是不能重复引入.

1411~ 之前我们是从父类继承属性和方法,现在也可以从trait类中使用trait类中的属性和方法

1412~ 如果父类和trait类中的属性和方法重名了怎么办?系统默认会使用trait类中的属性和方法

1413~ 这是因为trait类中的属性和方法的优先级高于父类.

1414~ trait类会覆盖掉父类中的同名属性和方法.

1415~ 如果trait类和父类中的属性和方法重名了,可以修改trait类或父类中重名的方法,属性

1416~ 如果不想修改重名的属性,方法,可以使用别名 as

1417~ 如果子类中的方法和trait类的方法同名,子类会覆盖trait类中重名的方法

1418~ 同一类中,同名方法访问的优先级: 子类(最高 > trait类 > 父类(最低

1419~ 方法A insteadof 方法B, 使用方法 A 替换掉方法 B,注意:是替换不是覆盖, 方法 B 还在

1420~ 方法B as 方法C, 把方法B当作方法C, 也就是给 方法B 取个别名叫:方法C

1421~ 反射类,也叫:反射机制,反射API

1422~ 反射类的简单理解:给你一个对象,根据这个对象可以得到它有哪些方法,属于哪个类.

1423~ 反射类在开发框架时使用较多.

1424~ 同一个脚本中函数、类、常量不允许重名。

1425~ 但有时候引入的外部php文件中的类和方法,可能和当前php文件中的类和方法重名.

1426~ 为了避免以上的问题,需要用到命名空间技术.

1427~ 命名空间针对php脚本中的函数,常量,类成员(属性,方法

1428~ 命名空间使用 namespace 声明.

1429~ namespace 必须放在代码块的首行,前面不能有别的代码

1430~ namespace 以下都是属于同一个命名空间,直到出现另一个 namespace

1431~ 命名空间是可以分层的,就像是目录中的子目录,可以在一个空间中创建子空间.

1432~ 为了学习方便,上面所有的命名空间都写在一个脚本文件里面.而在实际开发的过程中,

1433~ 在实际的开发中,应该是一个文件只使用一个命名空间.

1434~ 查看当前命名空间: echo .NAMESPACE ;

1435~ 不指定命名空间时,使用的是非限定名称的命名空间

1436~ 默认使用的是离本行代码最近的命名空间

1437~ 使用反斜杠 \ 访问命名空间,这种叫做:完全限定名称的命名空间

1438~ 在实际开发中,多数情况是引入其它空间的类,

1439~ 所以PHP允许在一个命名空间里面使用 use 来引入其他空间的类成员(方法,属性.

1440~ 定位到类,并给它取个别名叫做: ACat, use \spaceCat_A\Cat as ACat;

1441~ 上面的代码是定位到当前空间中的类,这里仅仅是类的快捷方式,并不是引入类

1442~ 命名空间是可以分层的,就像是目录中的子目录,可以在一个空间中创建子空间.

1443~ 使用 use 可以简化导入时的代码

1444~ 使用 use 导入 spaceCat 空间中的函数: use function spaceCat\calc;

1445~ 在导入后,使用 calc 就是调用 spaceCat\calc

1446~ 使用 use 导入 spaceCat 空间中的函数,并给它起个别名叫 calcNew

1447~ use function spaceCat\calc as calcNew;

1448~ 注意:这个别名并没有覆盖原来的名字,所以 calc 和 calcNew 都可以用.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值