语法
PHP[Hypertext Preprocessor [ˈhaɪpərtekst] [,priː'prəʊsesə] 海坡泰克斯 普瑞泼瑟瑟]:超文本预处理程序
通用开源脚本语言 运行在服务端
XML风格<?php ?> 短风格 ?> ASP风格 脚本风格
PHP严格区分大小写 每行PHP语句必须以分号结尾
注释 //注释 #注释 /* 注释 */
变量
$x="Hello world!";
全局变量 局部变量
local本地的 局部作用域 仅能在函数内部访问 优先级最高
global总体的 全局作用域 global 关键字用于函数内访问全局变量global $x,$y;
static静态的 静态作用域 函数执行完成时局部变量不被删除
parameter参数 函数参数作用域 通过调用代码将值传递给函数的局部变量
可变变量$$x = 'world';
超全局变量 在全部作用域中始终可用的内置变量
$GLOBALS引用全局作用域中可用的全部变量$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
$_SERVER服务器和执行环境信息 报头、路径和脚本位置的信息
$_GET通过 URL 参数传递给当前脚本的变量的数组
$_POST通过 HTTP POST 方法传递给当前脚本的变量的数组。
$_FILES通过 HTTP POST 方式上传到当前脚本的项目的数组。
$_REQUEST表单提交的数据 默认情况下包含了$_GET,$_POST 和 $_COOKIE的数组。
$_SESSION当前脚本可用 SESSION 变量的数组。
$_COOKIE通过 HTTP Cookies 方式传递给当前脚本的变量的数组。
$_ENV环境变量 通过环境方式传递给当前脚本的变量的数组。
按值传递$a=&$b;
常量
define("名称",值,case_insensitive 默认FALSE TRUE大小写不敏感)
常量值被定义后,在脚本的其他任何地方都不能被改变
可以使用 const 关键字在类定义的外部定义常量
get_defined_constants(categorize=FALSE)以关联数组形式获取所有常量 包括内置、扩展或自定义categorize 决定是否分类。默认不分类
constant("名称")返回一个常量的值
PHP_EOL换行符
魔术常量 php预定义常量
__LINE__文件中的当前行号
__FILE__文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名
__DIR__文件所在的目录 如果用在被包括文件中,则返回被包括的文件所在的目录
__FUNCTION__函数名称 自 PHP 5 起本常量返回该函数被定义时的名字
__CLASS__类的名称 自 PHP 5 起本常量返回该类被定义时的名字
__METHOD__类的方法名 返回该方法被定义时的名字
__NAMESPACE__当前命名空间的名称(大小写敏感)。这个常量是在编译时定义的
输出方式
echo print 语言结构 可以不用加括号 有多个参数的时候,不能使用括号
定界符EOF heredoc 在命令行shell和程序语言里定义一个字符串的方法 结束标识必须顶格独自占一行必须后接分号 结束标识与开始标识一致 特殊字符不需转义
数据类型
标量boolean/bool(布尔型) integer/int(整型) float/double(浮点型) string(字符串)
复合array(数组) object(对象)
特殊resource(资源) NULL(NULL)
伪类mixed number callback
转义符\\ 反斜线 \n 换行 \r 回车 \t 水平制表符 \f 换页(走纸) \" 双引号(") \' 单引号(')
运算符+(加) -(减) *(乘) /(除) %(模 除法的余数) and/&&(与) or/||(或) xor(异或) !(非)
优先级 一、二、三、赋值 算术、位、比较、位、逻辑
运算符
三元运算符
true返回2 false返回3 (expr1) ? (expr2) : (expr3)
true返回2 false返回3 (expr2) ?: (expr3)
存在返回2 不存在null返回3 (expr2) ?? (expr3)
组合比较符x<=>y x大于y返回1 等于返回0 x小于y返回-1
位运算符&与 |或 ^异或 ~取反 <>右移实际应用中可以做用户权限的应用 只能用整形数据
错误抑制符@
条件语句
if (条件) { 条件成立时要执行的代码 } else if(条件表达式) { 条件成立时要执行的代码 } else { 条件成立时要执行的代码 }
switch(表达式) { case 值: break; default: break; }
循环结构
break跳出语句的执行 continue跳过本次循环而进行下一次
for(expr1;expr2;expr3){ 执行代码 }
while (条件) { 执行代码 }
do { 执行代码 } while (条件);
foreach($arr as $k=>$v) { 执行代码 }
数组
数值数组 关联数组 多维数组$arr=array()=[];
函数 function
functionName([参数名称[=值][,...]]) { 执行代码 }
变量函数 将变量名称赋予字符类型变量$str = "substr"; echo $str("abcdef",2);
递归函数 Recursive 函数调用自身
用户定义的函数和语言关键字对大小写不敏感
命名空间 namespace
定义代码在MyProject命名空间中namespace MyProject;
将全局的非命名空间中的代码与命名空间中的代码组合在一起,只能使用大括号形式的语法
子命名空间 命名空间的名字可以使用分层次的方式定义namespace MyProject\Sub\Level;
命名空间使用
非限定名称,或不包含前缀的类名称$a=new foo(); foo::staticmethod();
限定名称,或包含前缀的名称$a = new subnamespace\foo(); subnamespace\foo::staticmethod();
完全限定名称,或包含了全局前缀操作符的名称 $a = new \currentnamespace\foo(); \currentnamespace\foo::staticmethod();
别名&导入 类名称使用别名,或为命名空间名称使用别名
别名是通过操作符use来实现的
导入操作只影响非限定名称和限定名称。完全限定名称由于是确定的,故不受导入的影响
后备全局函数/常量 在命名空间中访问全局类 对于函数和常量来说,如果当前命名空间中不存在该函数或常量,PHP 会退而使用全局空间中的函数或常量
全局空间 如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间 在名称前加上前缀 \ 表示该名称是全局空间中的名称$f = \fopen(...);
命名空间的顺序
对完全限定名称的函数,类和常量的调用在编译时解析
所有的非限定名称和限定名称(非完全限定名称)根据当前的导入规则在编译时进行转换
在命名空间内部,所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称
非限定类名根据当前的导入规则在编译时转换(用全名代替短的导入名称)
在命名空间内部(例如A\B),对非限定名称的函数调用是在运行时解析的
在命名空间(例如A\B)内部对非限定名称或限定名称类(非完全限定名称)的调用是在运行时解析的
面向对象
构造函数 void __construct ([ mixed $args [, $... ]] ) 在创建对象时初始化对象 new之后执行
析构函数 void __destruct ( void ) 当对象结束其生命周期时,系统自动执行析构函数 new之后执行
魔术方法 直接为私有属性赋值的操作,会自动调用魔术方法进行赋值$p1->name="张三";
__set()设置私有属性值
__get()获取私有属性值
__isset()检测私有属性值是否被设定
__unset()删除私有属性
继承 extends继承一个类 不支持多继承
重载 函数或者方法有同样的名称,但是参数列表不相同的情形 父类方法的访问 父类名称::被重载方法名();
方法重写 父类继承的方法不能满足子类的需求 子类对其进行改写
访问控制 封装关键字public(公有) protected(受保护) private(私有 子类不可用)
抽象类abstract类有一个方法是被声明为抽象的 类就必须被声明为抽象的
定义为抽象的类不能被实例化
被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法
接口interface可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容 接口中定义的所有方法都必须是公有
要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法
类可以实现多个接口,用逗号来分隔多个接口的名称
范例 class Template implements iTemplate
静态 关键字 Static
声明类属性或方法为 static(静态),就可以不实例化类而直接访问
静态属性不可以由对象通过 -> 操作符来访问
伪变量$this在静态方法中不可用
使用 self 在本类内调用self::foo();
范例echo Foo::$my_static; echo $foo->staticValue()
关键字 Final 如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承
调用父类构造方法 子类构造方法不能自动调用父类的构造方法 要调用的话parent::__construct()
文件上传
POST 必须设置表单的enctype="multipart/form-data"属性
PHP配置文件中文件上传相关的选项
file_uploads = on/off控制是否可以通过HTTP进行文件上传
upload_max_filesize = 2M控制文件上传的最大字节数
upload_tmp_dir = string控制临时目录
正则表达式
元字符
+匹配前面的子表达式一次或多次
匹配前面的子表达式零次或多次
.匹配除换行符
\n 之外的任何单字符
?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符
|指明两项之间的一个选择
{n}匹配确定的 n 次
{n,}至少匹配n 次
{n,m}最少匹配 n 次且最多匹配 m 次修饰符* /i 区分大小写 /g 全局匹配 /m 多行匹配 /s 特殊字符圆点 . 中包含换行符 \n
圆括号是取多个,圆括号将括号里面的内容作为一组 圆括号还表示组 表示反向引用
方括号是取一个 方括号里面的|选择符号没有意义
设计模式 *
工厂模式
简单工厂模式
工厂方法模式
抽象工厂模式
建造者模式
单例模式
注册模式
适配器模式
策略模式
观察者模式
原型模式
门面模式
MVC 模式
访问者模式