php 基础
php 基础
PHP 支持 9 种原始数据类型
四种标量类型:
boolean(布尔型)
integer(整型)
float(浮点型,也称作 double)
string(字符串)
三种复合类型:
array(数组)
object(对象)
callable(可调用) (新增)
最后是两种特殊类型:
resource(资源)
NULL(无类型)
浮点型不能作精确相等判断
被当做 false 处理的情况 7 种
0,0.0,'','0',false,array(),null
常量
const、define
const 更快是语言结构,define 是函数
define 不能定义类的常量 const 可以
常量一经定义不能修改、删除
两者之间最大的区别在于 const 是在编译时定义常量,而 define()方法是在运行时定义常量。
const 不能用在 if 语句中, defne()能用在 if 语句中。
if(...) {
const FOO = 'BAR';//错误
}
if(...) {
define('FOO', 'BAR');//正确
}
define()的一个常用场景是先判断常量是否已经定义再定义常量:
if(defined('FOO)) {
define('FOO', 'BAR')
}
const 定义常量时,值只能是静态标量(数字, 字符串, true,false, null), 而 define()方法可以把任意表达式的值用作常量的值。从 PHP5.6 开始 const 也允许把表达式用作常量的值了。
const BIT_5 = 1 << 5; //PHP5.6 后支持,之前的 PHP 版本不支持
define('BIT_5', 1 << 5);// 所有 PHP 版本都支持
const 只允许简单的常量名,而 define()可以把任何表达式的值用作常量名
for ($i = 0; $i < 32; $i++) {
define('BIT_' . $i, 1 << $i);
}
const 定义的常量常量名是大小写敏感的,而传递 true 给 define()方法的第三个参数时可以定义大小写不敏感的常量。
define('FOO', 'BAR', true);
echo FOO; //BAR
echo foo; //BAR
上面列举的都是 const 相较 define()而言的一些缺点或者不灵活的地方,下面我们看一下为什么我个人推荐用 const 而不是 define()来定义常量(除非要在上述列举的场景中定义常量)。
const 具有更好的可读性,const 是语言结构而不是函数,而且与在类中定义类常量的形式保持一致。
const 在当前的命名空间中定义常量, 而 define()要实现类似效果必须在定义时传递完整的命名空间名称:
namespace A\B\C;//To define the constant A\B\C\FOO:
const FOO = 'BAR';
define('A\B\C\FOO', 'BAR');
const 从 PHP5.6 版本开始可以把数组用作常量值,而 define()在 PHP7.0 版本开始才支持把数组用作常量值。
const FOO = [1, 2, 3];// valid in PHP 5.6
define('FOO', [1, 2, 3]);// invalid in PHP 5.6, valid in PHP 7.0
因为 const 是语言结构并且在编译时定义常量所以 const 会比 define() 稍稍快一些。
众所周知 PHP 在用 define()定义了大量的常量后会影响效率。 人们设置发明了 apc_load_constants()和 hidef 来绕过 define()导致的效率问题。
最后,const 还能被用于在类和接口中定义常量,define()只能被用于在全局命名空间中定义常量:
class FOO{
const BAR = 2;// 正确
}
class Baz{
define('QUX', 2)// 错误
}
魔术常量
LINE :返回文件中的当前行号。也可写成line。
FILE:返回当前文件的绝对路径(包含文件名)。
DIR:返回当前文件的绝对路径(不包含文件名),等价于 dirname(FILE)。
FUNCTION:返回当前函数(或方法)的名称。
CLASS:返回当前的类名(包括该类的作用区域或命名空间)。
TRAIT:返回当前的 trait 名称(包括该 trait 的作用区域或命名空间)。
METHOD:返回当前的方法名(包括类名)。
NAMESPACE:返回当前文件的命名空间的名称。
超全局变量
$GLOBALS:global全局变量,是一个包含了所有全局变量的组合数组,全局变量的名称就是该组合数组的键。
$\_GET:HTTP GET 变量,通过 URL 参数传递给当前脚本的变量的数组。
$_POST:HTTP POST 变量,通过 HTTP POST 方式传递给当前脚本的变量的数组。
$\_COOKIE:HTTP Cookies 变量,通过 HTTP Cookies 方式传递给当前脚本的变量的数组。
$_SESSION:session 变量,当前脚本可用的 SESSION 变量的数组。
$\_REQUEST:HTTP Request 变量,默认情况下包含了 $_GET,$\_POST 和 $_COOKIE 的数组。
$\_FILES:HTTP 文件上传变量,通过 HTTP POST 方式上传到当前脚本的项目的数组。
$_SERVER:服务器信息变量,包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等信息的数组。这个数组中的项目由 Web 服务器创建。
$\_ENV:环境变量,通过环境方式传递给当前脚本的变量的数组。
$_SERVER["SERVER_ADDR"] //当前运行脚本的服务器的ip地址
$_SERVER["SERVER_PORT"] //服务器端口
$_SERVER["REMOTE_ADDR"] //浏览网页的用户ip
预定义常量
常量名 | 常量值 | 说明 |
---|---|---|
PHP_VERSION | 5.5 | 当前 php 服务器的版本 |
TRUE | TRUE | 代表布尔值,真 |
FALSE | FALSE | 代表布尔值,假 |
NULL | NULL | 代表空值 |
DIRECTORY_SEPARATOR | \或/ | 根据操作系统决定目录的分隔符 |
PATH_SEPARATOR | :或; | 在 linux 上是一个":"号,WIN 上是一个";"号 |
E_ERROR | 1 | 错误,导致 php 脚本运行终止 |
E_WARNING | 2 | |
E_PARSE | 4 | 解析错误,由程序解析器报告 |
E_NOTICE | 8 | 非关键的错误,例如变量未初始化 |
M_PI | 3.141592653 | π 圆周率 |
PHP_EOL | Windows 是(\r\n),Linux 是(\n),MAC 是(\r) | 系统换行符 |
运算符
http://www.runoob.com/php/php-operators.html
@运算符
@是可以屏蔽函数执行过程中遇到问题而产生的一些错误、警告信息,这样用户就看不到程序的出错信息。这样除了用户界面会友好一些外,更重要的是安全性,因为屏蔽了出错文件的路径等信息。
流程控制
If...elseif
在 elseif 语句中只能有一个表达式为 true,即在 elseif 语句中只能有一个语句块被执行,多个 elseif 从句是排斥关系。使用 elseif 语句有一个基本原则,总把优先范围小的条件放在前面处理
switch...case...
和 if 不同的是,switch 的作用类似于 break 跳出 switch 外的循环,可以使用 continue