PHP
2021-07-16 13:42:13 43 举报
AI智能生成
PHP是一种广泛使用的服务器端脚本语言,以其简单易学、功能强大而受到广大开发者的喜爱。在Web开发中,PHP可以用于生成动态网页内容,处理表单数据,与数据库进行交互等。PHP支持多种数据库系统,如MySQL、PostgreSQL等,使得开发者能够轻松地将数据存储和检索功能集成到自己的应用程序中。此外,PHP还提供了丰富的内置函数和类库,如文件操作、字符串处理、日期时间处理等,方便开发者快速实现各种功能。总之,PHP作为一种强大且灵活的编程语言,为Web开发带来了极大的便利和效率。
作者其他创作
大纲/内容
入门指引
是什么?
PHP(全称:PHP:HypertextPreprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言。
PHP脚本在服务器上执行。
PHP可免费下载使用。
PHP脚本在服务器上执行。
PHP可免费下载使用。
能做什么?
PHP脚本主要用于以下三个领域:
◦服务端脚本。 PHP解析器(CGI或者服务器模块)、web服务器和web浏览器。需要在运行web服务器时,安装并配置PHP,然后,可以用web浏览器来访问PHP程序的输出,即浏览服务端的PHP页面。
◦命令行脚本。 可以编写一段PHP脚本,仅仅只需要PHP解析器来执行。这种用法对于依赖cron(Unix或者Linux环境)或者TaskScheduler(Windows环境)的日常运行的脚本来说是理想的选择。
◦编写桌面应用程序。 可以利用PHP-GTK来编写这些程序。用这种方法,还可以编写跨平台的应用程序。PHP-GTK是PHP的一个扩展,在通常发布的PHP包中并不包含它。
◦服务端脚本。 PHP解析器(CGI或者服务器模块)、web服务器和web浏览器。需要在运行web服务器时,安装并配置PHP,然后,可以用web浏览器来访问PHP程序的输出,即浏览服务端的PHP页面。
◦命令行脚本。 可以编写一段PHP脚本,仅仅只需要PHP解析器来执行。这种用法对于依赖cron(Unix或者Linux环境)或者TaskScheduler(Windows环境)的日常运行的脚本来说是理想的选择。
◦编写桌面应用程序。 可以利用PHP-GTK来编写这些程序。用这种方法,还可以编写跨平台的应用程序。PHP-GTK是PHP的一个扩展,在通常发布的PHP包中并不包含它。
安装与配置
windows安装
下载windows安装包,解压,设置环境变量
linux安装
编译安装, 具体步骤: https://www.jianshu.com/p/b5448b719f98
php.ini
具体请看官方文档 :
PHPManual › 附录 › php.ini配置
PHPManual › 附录 › php.ini配置
php-fpm.conf
从源代码编译
编译PHP时需要--enable-fpm配置选项来激活FPM支持。
以下为FPM编译的具体配置参数(全部为可选参数):
◦--with-fpm-user-设置FPM运行的用户身份(默认-nobody)
◦--with-fpm-group-设置FPM运行时的用户组(默认-nobody)
◦--with-fpm-systemd-启用systemd集成(默认-no)
编译PHP时需要--enable-fpm配置选项来激活FPM支持。
以下为FPM编译的具体配置参数(全部为可选参数):
◦--with-fpm-user-设置FPM运行的用户身份(默认-nobody)
◦--with-fpm-group-设置FPM运行时的用户组(默认-nobody)
◦--with-fpm-systemd-启用systemd集成(默认-no)
pecl扩展安装
用phpize编译共享PECL扩展库
$cdextname
$phpize
$./configure
$make
#makeinstall
$phpize
$./configure
$make
#makeinstall
基础语法
PHP脚本可以放在文档中的任何位置。
PHP脚本以<?php开始,以?>结束:
PHP文件的默认文件扩展名是".php"。
注释: // /**/ # 三种
PHP脚本以<?php开始,以?>结束:
PHP文件的默认文件扩展名是".php"。
注释: // /**/ # 三种
变量
变量是用于存储信息的"容器":
PHP变量规则:
变量以$符号开始,后面跟着变量的名称
变量名必须以字母或者下划线字符开始
变量名只能包含字母数字字符以及下划线(A-z、0-9和_)
变量名不能包含空格
变量名是区分大小写的($y和$Y是两个不同的变量)
PHP语句和PHP变量都是区分大小写的。
PHP变量规则:
变量以$符号开始,后面跟着变量的名称
变量名必须以字母或者下划线字符开始
变量名只能包含字母数字字符以及下划线(A-z、0-9和_)
变量名不能包含空格
变量名是区分大小写的($y和$Y是两个不同的变量)
PHP语句和PHP变量都是区分大小写的。
常量
判断常量是否设置:defined
defined(string$constant_name):bool
参数constant_name常量的名称。
返回值如果名称constant_name的常量已定义,返回true;未定义则返回false。
参数constant_name常量的名称。
返回值如果名称constant_name的常量已定义,返回true;未定义则返回false。
设置常量:define
booldefine(string$name,mixed$value[,bool$case_insensitive=false])
该函数有三个参数:
name:必选参数,常量名称,即标志符。
value:必选参数,常量的值。
case_insensitive:可选参数,如果设置为TRUE,该常量则大小写不敏感。默认是大小写敏感的。
该函数有三个参数:
name:必选参数,常量名称,即标志符。
value:必选参数,常量的值。
case_insensitive:可选参数,如果设置为TRUE,该常量则大小写不敏感。默认是大小写敏感的。
预定义常量
具体请看官方文档:
PHPManual›保留字列表›预定义常量
PHPManual›保留字列表›预定义常量
超全局变量
超全局变量是在全部作用域中始终可用的内置变量
$GLOBALS
•$_SERVER
•$_GET
•$_POST
•$_FILES
•$_COOKIE
•$_SESSION
•$_REQUEST
•$_ENV
$GLOBALS
•$_SERVER
•$_GET
•$_POST
•$_FILES
•$_COOKIE
•$_SESSION
•$_REQUEST
•$_ENV
魔术常量
__LINE__文件中的当前行号。
__FILE__文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
__DIR__文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
它等价于dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。
__FUNCTION__当前函数的名称。匿名函数则为{closure}。
__CLASS__当前类的名称。类名包括其被声明的作用域(例如Foo\Bar)。
当用在trait方法中时,__CLASS__是调用trait方法的类的名字。
__TRAIT__Trait的名字。Trait名包括其被声明的作用域(例如Foo\Bar)。
__METHOD__类的方法名。
__NAMESPACE__当前命名空间的名称。
ClassName::class完整的类名。
__FILE__文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
__DIR__文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
它等价于dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。
__FUNCTION__当前函数的名称。匿名函数则为{closure}。
__CLASS__当前类的名称。类名包括其被声明的作用域(例如Foo\Bar)。
当用在trait方法中时,__CLASS__是调用trait方法的类的名字。
__TRAIT__Trait的名字。Trait名包括其被声明的作用域(例如Foo\Bar)。
__METHOD__类的方法名。
__NAMESPACE__当前命名空间的名称。
ClassName::class完整的类名。
数据类型
Boolean布尔类型
boolean表达了真值,可以为true或false。
Integer整型
整型值int可以使用十进制,十六进制,八进制或二进制表示,前面可以加上可选的符号(-或者+)。可以用负运算符来表示一个负的int。
要使用八进制表达,数字前必须加上0(零)。要使用十六进制表达,数字前必须加上0x。要使用二进制表达,数字前必须加上0b。
整型数int的字长和平台有关,尽管通常最大值是大约二十亿(32位有符号)。64位平台下的最大值通常是大约9E18。PHP不支持无符号的int。int值的字长可以用常量PHP_INT_SIZE来表示,最大值可以用常量PHP_INT_MAX来表示,最小值可以用常量PHP_INT_MIN表示。
整数溢出:如果给定的一个数超出了int的范围,将会被解释为float。同样如果执行的运算结果超出了int范围,也会返回float。
转换为整型:要明确地将一个值转换为int,用(int)或(integer)强制转换。不过大多数情况下都不需要强制转换,因为当运算符,函数或流程控制需要一个int参数时,值会自动转换。还可以通过函数intval()来将一个值转换成int整型。
要使用八进制表达,数字前必须加上0(零)。要使用十六进制表达,数字前必须加上0x。要使用二进制表达,数字前必须加上0b。
整型数int的字长和平台有关,尽管通常最大值是大约二十亿(32位有符号)。64位平台下的最大值通常是大约9E18。PHP不支持无符号的int。int值的字长可以用常量PHP_INT_SIZE来表示,最大值可以用常量PHP_INT_MAX来表示,最小值可以用常量PHP_INT_MIN表示。
整数溢出:如果给定的一个数超出了int的范围,将会被解释为float。同样如果执行的运算结果超出了int范围,也会返回float。
转换为整型:要明确地将一个值转换为int,用(int)或(integer)强制转换。不过大多数情况下都不需要强制转换,因为当运算符,函数或流程控制需要一个int参数时,值会自动转换。还可以通过函数intval()来将一个值转换成int整型。
Float浮点型
浮点型(也叫浮点数float,双精度数double或实数real)
String字符串
一个字符串string就是由一系列的字符组成,其中每个字符等同于一个字节。
这意味着PHP只能支持256的字符集,因此不支持Unicode。
一个字符串可以用4种方式表达:
◦单引号
◦双引号
◦heredoc语法结构
◦nowdoc语法结构
这意味着PHP只能支持256的字符集,因此不支持Unicode。
一个字符串可以用4种方式表达:
◦单引号
◦双引号
◦heredoc语法结构
◦nowdoc语法结构
Array数组
PHP中的数组实际上是一个有序映射。
映射是一种把values关联到keys的类型。
key可以是integer或者string。value可以是任意类型。
映射是一种把values关联到keys的类型。
key可以是integer或者string。value可以是任意类型。
Object对象
Resource资源类型
NULL 类型
Callback/Callable类型
类型声明
PHPManual › 类型 › 类型声明
运算符
•位运算符
•比较运算符
•错误控制运算符
•执行运算符
•递增/递减运算符
•逻辑运算符
•字符串运算符
•数组运算符
•类型运算符
•运算符优先级
•算术运算符
+ - * / %
•赋值运算符
=
•位运算符
•比较运算符
•错误控制运算符
•执行运算符
•递增/递减运算符
•逻辑运算符
•字符串运算符
•数组运算符
•类型运算符
算数运算符
松散比较:使用两个等号==比较,只比较值,不比较类型。
严格比较:用三个等号===比较,除了比较值,也比较类型。
流程控制
•if else elseif •流程控制的替代语法
•switch •match
•while •do-while
•for •foreach
•declare
•declare
•break •continue •return •goto
•require•include•require_once•include_once
函数
•用户自定义函数
PHPManual›函数›用户自定义函数
call_user_func()
call_user_func_array
call_user_func()
call_user_func_array
•函数的参数
PHPManual›函数›函数的参数
PHP支持按值传递参数(默认),
通过引用传递参数以及默认参数。
也支持可变长度参数列表和命名参数。
PHP支持按值传递参数(默认),
通过引用传递参数以及默认参数。
也支持可变长度参数列表和命名参数。
•返回值
PHPManual›函数›返回值
如果省略了return,则返回值为null。
函数不能返回多个值,但可以通过返回一个数组来得到类似的效果。
从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用运算符&:
如果省略了return,则返回值为null。
函数不能返回多个值,但可以通过返回一个数组来得到类似的效果。
从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用运算符&:
•可变函数
PHPManual›函数›可变函数
•内部(内置)函数
PHPManual › 函数 › 内部(内置)函数
•匿名函数
PHPManual › 函数 › 匿名函数
匿名函数目前是通过Closure类来实现的。
匿名函数目前是通过Closure类来实现的。
•箭头函数
PHPManual › 函数 › 箭头函数
箭头函数是PHP7.4的新语法,是一种更简洁的匿名函数写法。
匿名函数和箭头函数都是Closure类的实现。
箭头函数的基本语法为fn(argument_list)=>expr。
箭头函数支持与匿名函数相同的功能,只是其父作用域的变量总是自动的。
箭头函数是PHP7.4的新语法,是一种更简洁的匿名函数写法。
匿名函数和箭头函数都是Closure类的实现。
箭头函数的基本语法为fn(argument_list)=>expr。
箭头函数支持与匿名函数相同的功能,只是其父作用域的变量总是自动的。
预定义接口
PHPManual › 语言参考 › 预定义接口
•遍历
•迭代器
•聚合式迭代器
•Throwable
•数组式访问
•序列化
•Closure
•生成器
•弱引用
•WeakMap
•Stringable
•迭代器
•聚合式迭代器
•Throwable
•数组式访问
•序列化
•Closure
•生成器
•弱引用
•WeakMap
•Stringable
错误&异常处理
预定义异常
PHPManual › 语言参考 › 预定义异常
错误处理
这种Error异常可以像Exception异常一样被第一个匹配的try/catch块所捕获。
如果没有匹配的catch块,则调用异常处理函数(事先通过set_exception_handler()注册)进行处理。
如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(FatalError)。
如果没有匹配的catch块,则调用异常处理函数(事先通过set_exception_handler()注册)进行处理。
如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(FatalError)。
Error类并非继承自Exception类,所以不能用catch(Exception$e){...}来捕获Error。
你可以用catch(Error$e){...},或者通过注册异常处理函数(set_exception_handler())来捕获Error。
你可以用catch(Error$e){...},或者通过注册异常处理函数(set_exception_handler())来捕获Error。
结束脚本回调
register_shutdown_function
注册一个callback,它会在脚本执行完成或者exit()后被调用。
注册一个callback,它会在脚本执行完成或者exit()后被调用。
面向对象OOP
命名空间
基本概念
从广义上来说,命名空间是一种封装事物的方法。
主要解决的问题:
在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:
1.用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
2.为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
PHP命名空间提供了一种将相关的类、函数和常量组合到一起的途径。
1.用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
2.为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
PHP命名空间提供了一种将相关的类、函数和常量组合到一起的途径。
使用命名空间
命名空间通过关键字namespace来声明。
PHP支持两种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__魔术常量和namespace关键字。
常量__NAMESPACE__的值是包含当前命名空间名称的字符串。
在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。
常量__NAMESPACE__的值是包含当前命名空间名称的字符串。
在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。
所有支持命名空间的PHP版本支持三种别名或导入方式:为类名称使用别名、为接口使用别名或为命名空间名称使用别名。 class as xxx
在PHP中,别名是通过操作符use来实现的.
基本概念
class
每个类的定义都以关键字class开头,后面跟着类名,后面跟着一对花括号,里面包含有类的属性与方法的定义。
类名可以是任何非PHP保留字的合法标签。一个合法类名以字母或下划线开头,后面跟着若干字母,数字或下划线。
一个类可以包含有属于自己的常量,变量(称为"属性")以及函数(称为"方法")。
当一个方法在类定义内部被调用时,有一个可用的伪变量$this。$this是一个到当前对象的引用。
new
要创建一个类的实例,必须使用new关键字。
如果在new之后跟着的是一个包含有类名的字符串string,则该类的一个实例被创建。如果该类属于一个命名空间,则必须使用其完整名称。
在类定义内部,可以用 new self 和 new parent 创建新对象。
属性和方法
类的属性和方法存在于不同的"命名空间"中,这意味着同一个类的属性和方法可以使用同样的名字。
在类中访问属性和调用方法使用同样的操作符,具体是访问一个属性还是调用一个方法,取决于你的上下文,即用法是变量访问还是函数调用。
在类中访问属性和调用方法使用同样的操作符,具体是访问一个属性还是调用一个方法,取决于你的上下文,即用法是变量访问还是函数调用。
属性
类的变量成员叫做"属性",或者叫"字段"、"特征",在本文档统一称为"属性"。属性声明是由关键字public,protected或者private开头,然后跟一个普通的变量声明来组成。属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指PHP脚本在编译阶段时就可以得到其值,而不依赖于运行时的信息才能求值。
在类的成员方法里面,可以用->(对象运算符):$this->property(其中property是该属性名)这种方式来访问非静态属性。静态属性则是用::(双冒号):self::$property来访问。
类常量: const
const constant = '常量值';
在类中始终保持不变的值定义为常量。
在定义和使用常量的时候不需要使用$符号。
常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。
接口(interface)中也可以定义常量。更多示例见文档中的接口部分。
自PHP5.3.0起,可以用一个变量来动态调用类。但该变量的值不能为关键字(如self,parent或static)。
在类中始终保持不变的值定义为常量。
在定义和使用常量的时候不需要使用$符号。
常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。
接口(interface)中也可以定义常量。更多示例见文档中的接口部分。
自PHP5.3.0起,可以用一个变量来动态调用类。但该变量的值不能为关键字(如self,parent或static)。
类的自动加载
spl_autoload_register()函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载。
通过注册自动加载器,脚本引擎在PHP出错失败前有了最后一个机会加载所需的类。
通过注册自动加载器,脚本引擎在PHP出错失败前有了最后一个机会加载所需的类。
自动加载不可用于PHP的CLI交互模式。
构造函数和析构函数
构造函数
PHP允许开发者在一个类中定义一个方法作为构造函数。
具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。
具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。
Note : 如果子类中定义了构造函数则不会隐式调用其父类的构造函数。
要执行父类的构造函数,需要在子类的构造函数中调用parent::__construct()。
如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为private的话)。
要执行父类的构造函数,需要在子类的构造函数中调用parent::__construct()。
如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为private的话)。
新代码中要使用__construct()。
构造器属性提升
当构造器参数带访问控制(visibilitymodifier)时,PHP会同时把它当作对象属性和构造器参数,并赋值到属性。构造器可以是空的,或者包含其他语句。参数值赋值到相应属性后执行正文中额外的代码语句。
并非所有参数都需要提升。可以混合提升或不提升参数作为属性,也不需要按顺序。提升后的参数不影响构造器内代码调用。
并非所有参数都需要提升。可以混合提升或不提升参数作为属性,也不需要按顺序。提升后的参数不影响构造器内代码调用。
Note: 对象属性的类型不能为callable以避免为引擎带来混淆。因此提升的参数也不能是callable。其他任意类型声明是允许的。
Note: 放在构造器提升参数里的属性会同时复制为属性和参数。
Note: 放在构造器提升参数里的属性会同时复制为属性和参数。
Static创造方法
在PHP中每个class只能有一个构造器。然而有些情况下,需要用不同的输入实现不同的方式构造对象。这种情况下推荐使用static方法包装构造。
可以设置构造器为private或protected,防止自行额外调用。这时只有static方法可以实例化一个类。由于它们位于同一个定义的class因此可以访问私有方法,也不需要在同一个对象实例中。当然构造器不一定要设置为private,是否合理取决于实际情况。
三个static方法展示了对象以不同方式的实例化方式。
•fromBasicData()把所需的全部参数传入构造器,创建对象并返回结果。
•fromJson()接受JSON字符串,,预处理成构造器所需的格式,然后返回新的对象。
•fromXml()接受XML字符串并解析,然后创建一个单纯的对象。由于参数都是可选的,使得可以忽略所有参数去调用构造器。然后为对象的属性赋值后返回结果。
在以上三个例子中,static关键词会被翻译成代码所在类的类名。这个例子中是Product。
•fromBasicData()把所需的全部参数传入构造器,创建对象并返回结果。
•fromJson()接受JSON字符串,,预处理成构造器所需的格式,然后返回新的对象。
•fromXml()接受XML字符串并解析,然后创建一个单纯的对象。由于参数都是可选的,使得可以忽略所有参数去调用构造器。然后为对象的属性赋值后返回结果。
在以上三个例子中,static关键词会被翻译成代码所在类的类名。这个例子中是Product。
析构函数
PHP5引入了析构函数的概念,这类似于其它面向对象的语言,如C++。
析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用parent::__destruct()。此外也和构造函数一样,子类如果自己没有定义析构函数则会继承父类的。
析构函数即使在使用exit()终止脚本运行时也会被调用。在析构函数中调用exit()将会中止其余关闭操作的运行。
Note : 析构函数在脚本关闭时调用,此时所有的HTTP头信息已经发出。脚本关闭时的工作目录有可能和在SAPI(如apache)中时不同。
Note : 试图在析构函数(在脚本终止时被调用)中抛出一个异常会导致致命错误。
Note : 试图在析构函数(在脚本终止时被调用)中抛出一个异常会导致致命错误。
封装
概念
对属性或方法的访问控制,通过在前面添加关键字public(公有),protected(保护)或private(私有)来实现的。
被定义为公有的类成员可以在任何地方被访问。
被定义为受保护的类成员则可以被其自身以及其子类和父类访问。
被定义为私有的类成员则只能被其定义所在的类访问。
被定义为公有的类成员可以在任何地方被访问。
被定义为受保护的类成员则可以被其自身以及其子类和父类访问。
被定义为私有的类成员则只能被其定义所在的类访问。
属性
类属性必须定义为公有,受保护,私有之一。如果用var定义,则被视为公有。
方法
类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。
常量的控制访问
PHP7.1.0开始,类的常量可以定义为公有、私有或受保护。如果没有设置这些关键字,则该常量默认为公有。
继承 extends
继承已为大家所熟知的一个程序设计特性,PHP的对象模型也使用了继承。继承将会影响到类与类,对象与对象之间的关系。
比如,当扩展一个类,子类就会继承父类所有公有的和受保护的方法。除非子类覆盖了父类的方法,被继承的方法都会保留其原有功能。
继承对于功能的设计和抽象是非常有用的,而且对于类似的对象增加新功能就无须重新再写这些公用的功能。
比如,当扩展一个类,子类就会继承父类所有公有的和受保护的方法。除非子类覆盖了父类的方法,被继承的方法都会保留其原有功能。
继承对于功能的设计和抽象是非常有用的,而且对于类似的对象增加新功能就无须重新再写这些公用的功能。
多态
抽象类 abstract
PHP5支持抽象类和抽象方法。定义为抽象的类不能被实例化。
任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。
static 关键字
范围解析操作符(::)
一对冒号,可以用于访问静态成员,类常量,还可以用于覆盖类中的属性和方法。
static关键字来定义静态方法和属性。static也可用于定义静态变量以及后期静态绑定。
声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
后期静态绑定
基本原理
自PHP5.3.0起,PHP增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。
后期静态绑定工作原理是存储了在上一个"非转发调用"(non-forwardingcall)的类名。
当进行静态方法调用时,该类名即为明确指定的那个(通常在::运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。
所谓的"转发调用"(forwardingcall)指的是通过以下几种方式进行的静态调用:self::,parent::,static::以及forward_static_call()。
可用get_called_class()函数来得到被调用的方法所在的类名,static::则指出了其范围。
该功能从语言内部角度考虑被命名为"后期静态绑定"。
"后期绑定"的意思是说,static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。
也可以称之为"静态绑定",因为它可以用于(但不限于)静态方法的调用。
后期静态绑定工作原理是存储了在上一个"非转发调用"(non-forwardingcall)的类名。
当进行静态方法调用时,该类名即为明确指定的那个(通常在::运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。
所谓的"转发调用"(forwardingcall)指的是通过以下几种方式进行的静态调用:self::,parent::,static::以及forward_static_call()。
可用get_called_class()函数来得到被调用的方法所在的类名,static::则指出了其范围。
该功能从语言内部角度考虑被命名为"后期静态绑定"。
"后期绑定"的意思是说,static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。
也可以称之为"静态绑定",因为它可以用于(但不限于)静态方法的调用。
后期静态绑定的用法
后期静态绑定本想通过引入一个新的关键字表示运行时最初调用的类来绕过限制。简单地说,这个关键字能够让你在上述例子中调用test()时引用的类是B而不是A。最终决定不引入新的关键字,而是使用已经预留的static关键字。
Example#2static::简单用法
Example#3非静态环境下使用static::
Example#4转发和非转发调用
接口 interface
定义
使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
接口就像定义一个标准的类一样,通过interface关键字替换掉class关键字来定义,但其中所有的方法都是空的。
接口中定义的所有方法都必须是公有,这是接口的特性。
接口就像定义一个标准的类一样,通过interface关键字替换掉class关键字来定义,但其中所有的方法都是空的。
接口中定义的所有方法都必须是公有,这是接口的特性。
实现(implements)
类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。
接口继承(extends)
主要用于扩展接口
常量
接口中也可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖。
Trait
定义
自PHP5.4.0起,PHP实现了一种代码复用的方法,称为trait。
Trait是为类似PHP的单继承语言而准备的一种代码复用机制。
Trait为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用method。
Trait和Class组合的语义定义了一种减少复杂性的方式,避免传统多继承和Mixin类相关典型问题。
Trait和Class相似,但仅仅旨在用细粒度和一致的方式来组合功能。无法通过trait自身来实例化。
它为传统继承增加了水平特性的组合;也就是说,应用的几个Class之间不需要继承。
Trait是为类似PHP的单继承语言而准备的一种代码复用机制。
Trait为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用method。
Trait和Class组合的语义定义了一种减少复杂性的方式,避免传统多继承和Mixin类相关典型问题。
Trait和Class相似,但仅仅旨在用细粒度和一致的方式来组合功能。无法通过trait自身来实例化。
它为传统继承增加了水平特性的组合;也就是说,应用的几个Class之间不需要继承。
优先级
从基类继承的成员会被trait插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了trait的方法,而trait则覆盖了被继承的方法。
多个trait
通过逗号分隔,在use声明列出多个trait,可以都插入到一个类中。
冲突的解决
如果两个trait都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。
为了解决多个trait在同一个类中的命名冲突,需要使用insteadof操作符来明确指定使用冲突方法中的哪一个。
以上方式仅允许排除掉其它方法,as操作符可以为某个方法引入别名。注意,as操作符不会对方法进行重命名,也不会影响其方法。
为了解决多个trait在同一个类中的命名冲突,需要使用insteadof操作符来明确指定使用冲突方法中的哪一个。
以上方式仅允许排除掉其它方法,as操作符可以为某个方法引入别名。注意,as操作符不会对方法进行重命名,也不会影响其方法。
修改方法的访问控制
使用as语法还可以用来调整方法的访问控制。
组合trait
正如class能够使用trait一样,其它trait也能够使用trait。在trait定义时通过使用一个或多个trait,能够组合其它trait中的部分或全部成员。
魔术方法
__construct(),__destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__wakeup(),__serialize(),__unserialize(),__toString(),__invoke(),__set_state(),__clone()和__debugInfo()等方法在PHP中被称为“魔术方法”(Magic methods)。
在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。
所有的魔术方法必须声明为public
在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。
所有的魔术方法必须声明为public
Final 关键字
Note:属性不能被定义为final,只有类和方法才能被定义为final。
PHP5新增了一个final关键字。如果父类中的方法被声明为final,则子类无法覆盖该方法。如果一个类被声明为final,则不能被继承。
垃圾回收机制
详情见 官方文档:
PHPManual › 垃圾回收机制 › 引用计数基本知识
PHPManual › 垃圾回收机制 › 引用计数基本知识
循环引用问题
GC性能问题
PHP命令行(CLI)模式:
安装
CLISAPI模块会通过默认的--enable-cli参数设置启用,也可以在运行./configure时用参数--disable-cli来屏蔽。
Note:如何得知自己使用的是哪个SAPI?
在命令行下,运行php-v便能得知该php是CGI还是CLI。请参考函数php_sapi_name()以及常量PHP_SAPI。
Note:如何得知自己使用的是哪个SAPI?
在命令行下,运行php-v便能得知该php是CGI还是CLI。请参考函数php_sapi_name()以及常量PHP_SAPI。
使用
CLISAPI模块有以下三种不同的方法来获取要运行的PHP代码:
1、让PHP运行指定文件。 php my_script.php
2、在命令行直接运行PHP代码。
php-r'print_r(get_defined_constants());'
在使用这种方法时,请注意外壳变量的替代及引号的使用。
3、通过标准输入(stdin)提供需要运行的PHP代码。
1、让PHP运行指定文件。 php my_script.php
2、在命令行直接运行PHP代码。
php-r'print_r(get_defined_constants());'
在使用这种方法时,请注意外壳变量的替代及引号的使用。
3、通过标准输入(stdin)提供需要运行的PHP代码。
内置WEB Server
php -S localhost:8000 -t foo/
PHP专题
Mysqli & PDO
数据库支持
Cookie&Session
会话管理
文件上传
PHPManual › 特点 › 文件上传处理
PHP扩展
编写一个php扩展
加密和安全
open_ssl & mcrypt
jwt (json web token )
PHP框架
源码类框架
speedphp
thinkphp
yii1 & 2
codeigniter
laravel
feed
C扩展框架
phalcon
yaf yar yac
常驻内存类型框架
swoole
hyperf
swoft
easyswoole
mixphp
one
workerman
webman
amphp
reactphp
写一个框框
MVC
composer
github & packagist
annotation
di
nikic/fastRoute
设计模式 26
工厂模式
单例模式
适配器模式
等等........
面向对象基本原则
1.单一职责原则(SingleResponsibilityPrinciple)
每一个类应该专注于做一件事情。
每一个类应该专注于做一件事情。
2.里氏替换原则(LiskovSubstitutionPrinciple)
超类存在的地方,子类是可以替换的。
超类存在的地方,子类是可以替换的。
3.依赖倒置原则(DependenceInversionPrinciple)
实现尽量依赖抽象,不依赖具体实现。
实现尽量依赖抽象,不依赖具体实现。
4.接口隔离原则(InterfaceSegregationPrinciple)
应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口。
应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口。
5.迪米特法则(LawOfDemeter)
又叫最少知识原则,一个软件实体应当尽可能少的与其他实体发生相互作用。
又叫最少知识原则,一个软件实体应当尽可能少的与其他实体发生相互作用。
6.开闭原则(OpenClosePrinciple)
面向扩展开放,面向修改关闭。
面向扩展开放,面向修改关闭。
7.组合/聚合复用原则(Composite/AggregateReusePrincipleCARP)
尽量使用合成/聚合达到复用,尽量少用继承。原则:一个类中有另一个类的对象。
尽量使用合成/聚合达到复用,尽量少用继承。原则:一个类中有另一个类的对象。
0 条评论
下一页