PHP ?
什么是PHP
定义:即”PHP: Hypertext Preprocessor”,是一种被广泛应用的开源通用脚本语言,尤其适用于 Web 开发并可嵌入 HTML 中去。它的语法利用了 C、Java 和 Perl,易于学习。该语言的主要目标是允许 web 开发人员快速编写动态生成的 web 页面,但 PHP 的用途远不只于此。
怎么用在HTML页面上
html中一旦出现了php标签,那么文档的扩展名必须是php
- php代码就像css,js一样可以使用“标签方式”直接嵌入到html文档中
- php代码使用的标签:<?php ?>
- web 服务器只会将php标签的代码发送给php引擎(php.exe)处理
- html文档中嵌入的php代码段的“数量”和位置不受限制
- html文档存在php代码段时,扩展名必须是PHP才可以激活PHP引擎
将php写到html文档中
<!-- 输出html文本 -->
<?php
echo '<h3 style="color:red">Hello PHP</h3>';
?>
<!-- 短标签 -->
<?
// 如果只是输出一段动态文本或变量值
// 如果只有一行语句或者最后一行语句,分号可选
// 如果没有开启,到服务器PHP配置文件中 设置 short_open_tag = On
echo '<h3 style="color:green">短标签输出内容</h3>'
?>
<?= '<h3 style="color:red">短标签输出内容 省略echo</h3>' ?>
<?php $str = '<h3 style="color:red">短标签输出内容 使用变量</h3>' ?>
<?= $str ?>
<!-- 自定义输出格式 -->
<?php
echo '<p>echo 输出无返回值</p>';
// printf(模板,要输出的数据)
printf('%d + %d = %d', 1, 2, (1 + 2));
echo '<br>';
// %d :整数;%s : 字符串 ;%f :浮点数
// pdo:dsn,'mysql:host=localhost;dbname=phpedu;'
$type = 'mysql';
$host = 'localhost';
$dbname = 'phpedu';
echo 'printf()';
echo '<br>';
printf('%s:host=%s;dbname=%s;', $type, $host, $dbname);
// 有时会把参数保存到数据表或者在网络上传输
// sprintf(模板,要输出的数据),内容不输出只返回字符串,可保存和传递
echo '<br>';
echo '<hr>';
echo 'sprintf()';
echo '<br>';
$dsn = sprintf('%s:host=%s;dbname=%s;', $type, $host, $dbname);
echo '<br>';
echo $dsn;
echo '<hr>';
// vprintf():支持数组参数
echo '<br>';
echo 'vprintf()';
echo '<br>';
$linkParams = [$type, $host, $dbname];
$dsn = vprintf('%s:host=%s;dbname=%s;', $linkParams);
echo '<br>';
echo $dsn;
echo '<hr>';
// vsprintf():支持数组参数
echo '<br>';
echo 'vsprintf()';
echo '<br>';
$linkParams = [$type, $host, $dbname];
$dsn = vsprintf('%s:host=%s;dbname=%s;', $linkParams);
echo '<br>';
echo $dsn;
?>
数据类型
PHP 支持 10 种原始数据类型
四种标量类型 | 四种复合类型 | 两种特殊类型 |
---|---|---|
bool (布尔型) | array(数组) | resource(资源) |
int (整形) | object(对象) | NULL(无类型) |
float(浮点型,也称作double) | callable(可调用) | |
string(字符串) | iterable |
伪类型
mixed(混合类型)
void(无类型)
1. Boolean 布尔类型
boolean 表达了真值,可以为 true 或 false
要指定一个布尔值,使用常量 true 或 false。两个都不区分大小写。
通常运算符所返回的 boolean 值结果会被传递给控制流程
// == 是一个操作符,它检测两个变量是否相等,并返回一个布尔值
if ($action == "show_version") {
echo "The version is 1.23";
}
// 这样做是不必要的...
if ($show_separators == TRUE) {
echo "<hr>\n";
}
// ...因为可以使用下面这种简单的方式:
if ($show_separators) {
echo "<hr>\n";
}
转换为布尔值
要明确地将一个值转换成Boolean,用 (bool) 或者 (boolean) 来强制转换。但是很多请客下不需要用强制转换,因为当运算符、函数或者流程控制结构需要一个Boolean参数时,该值会被自动转换。
- 当转换为Boolean时,以下值被默认false:
- 布尔值false本身
- 整型值0(零) 及 -0(零)
- 浮点型值 0.0 (零) -0.0(零)
- 空字符串 ,以及字符串 “0”
- 不包括任何元素的数组
- 特殊类型NULL(包括尚未赋值的变量)
- 从空标记生成的SimpleXML对象
所有其它值都被认为时true (包括任何资源和NAN)
-1 和 其它非零值(不论正负) 一样,被认为是true。
2. Integer整型
整型值可以使用十进制,十六进制,八进制或二进制表示,前面可以加上可选的符号(- 或者 +)。可以用 负运算符来表示一个负的integer
整数溢出
如果给定的一个数超出了 integer 的范围,将会被解释为 float。同样如果执行的运算结果超出了 integer 范围,也会返回 float。
转换成整型
要明确地将一个值转换为 integer,用 (int) 或 (integer) 强制转换。不过大多数情况下都不需要强制转换,因为当运算符,函数或流程控制需要一个 integer 参数时,值会自动转换。还可以通过函数 intval() 来将一个值转换成整型。
将 resource 转换成 integer 时,结果会是 PHP 运行时为 resource 分配的唯一资源号。
- 从布尔值转换
false 将产生出 0(零),true 将产生出 1(壹)。
- 从浮点型转换
当从浮点数转换成整数时,将向下取整。
如果浮点数超出了整数范围(32 位平台下通常为 +/- 2.15e+9 = 2^31,64 位平台下,除了 Windows 且版本低于 PHP 7,通常为 +/- 9.22e+18 = 2^63),则结果为未定义,因为没有足够的精度给出一个确切的整数结果。在此情况下没有警告,甚至没有任何通知!
- 从字符串转换
参见字符串转换为数值。
- 从 NULL 转换
null 会转换为零 (0)。
Float浮点型
浮点型(也叫浮点数 float,双精度数 double 或实数 real)可以用以下任一语法定义
比较浮点数
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。
要测试浮点数是否相等,要使用一个仅比该数值大一丁点的最小误差值。该值也被称为机器极小值(epsilon)或最小单元取整数,是计算中所能接受的最小的差别值。
$a 和 $b 在小数点后五位精度内都是相等的。
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;
if(abs($a-$b) < $epsilon) {
echo "true";
}
NAN
某些数学运算会产生一个由常量 NAN 所代表的结果。此结果代表着一个在浮点数运算中未定义或不可表述的值。任何拿此值与其它任何值(除了 true)进行的松散或严格比较的结果都是 false。
由于 NAN 代表着任何不同值,不应拿 NAN 去和其它值进行比较,包括其自身,应该用 is_nan() 来检查。
String 字符串
一个字符串 string 就是由一系列的字符组成,其中每个字符等同于一个字节。这意味着 PHP 只能支持 256 的字符集,因此不支持 Unicode
- 单引号
- 双引号
- heredoc 语法结构
- nowdoc 语法结构
要表达一个单引号自身,需在它的前面加个反斜线(\)来转义。要表达一个反斜线自身,则用两个反斜线(\)。其它任何方式的反斜线都会被当成反斜线本身:也就是说如果想使用其它转义序列例如 \r 或者 \n,并不代表任何特殊含义,就单纯是这两个字符本身
- 双引号
如果字符串是包围在双引号(”)中, PHP 将对一些特殊的字符进行解析:
\n 换行(ASCII 字符集中的 LF 或 0x0A (10))
\r 回车(ASCII 字符集中的 CR 或 0x0D (13))
\t 水平制表符(ASCII 字符集中的 HT 或 0x09 (9))
\v 垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))(自 PHP 5.2.5 起)
\e Escape(ASCII 字符集中的 ESC 或 0x1B (27))(自 PHP 5.4.0 起)
\f 换页(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起)
\ 反斜线
\$ 美元标记
\” 双引号
[0-7]{1,3} 符合该正则表达式序列的是一个以八进制方式来表达的字符
\x[0-9A-Fa-f]{1,2}
- Heredoc 结构
第三种表达字符串的方法是用 heredoc 句法结构:<<<。在该运算符之后要提供一个标识符,然后换行。接下来是字符串 string 本身,最后要用前面定义的标识符作为结束标志。
结束时所引用的标识符必须在该行的第一列,而且,标识符的命名也要像其它标签一样遵守 PHP 的规则:只能包含字母、数字和下划线,并且必须以字母和下划线作为开头
echo <<<str
这是一个heredoc结构
str;
- Nowdoc 结构
就象 heredoc 结构类似于双引号字符串,Nowdoc 结构是类似于单引号字符串的。Nowdoc 结构很象 heredoc 结构,但是 nowdoc 中不进行解析操作。这种结构很适合用于嵌入 PHP 代码或其它大段文本而无需对其中的特殊字符进行转义。与 SGML 的 <![CDATA[ ]]> 结构是用来声明大段的不用解析的文本类似,nowdoc 结构也有相同的特征。
一个 nowdoc 结构也用和 heredocs 结构一样的标记 <<<, 但是跟在后面的标识符要用单引号括起来,即 <<<’EOT’。Heredoc 结构的所有规则也同样适用于 nowdoc 结构,尤其是结束标识符的规则。
echo <<<'str'
这是一个nowdoc结构
str;
Arry 数组
PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。由于数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的。
//通过array关键字
$array = array("foo" => "bar", "bar" => "foo");
//使用方括号[]
$arr = ["foo" => "bar", "bar" => "foo"];
key 为可选项。如果未指定,PHP 将自动使用之前用过的最大 integer 键名加上 1 作为新的键名。
仅对部分单元指定键名
$array = array(
"a",
"b",
6 => "c",
"d",
);
var_dump($array);
可迭代对象
Iterable是 PHP 7.1 中引入的一个伪类型。它接受任何实现了 Traversable 接口的 array 或对象。这些类型都能用 foreach 迭代,并且可以与 yield from 在一个 generator 中使用。
可迭代对象可以用作参数类型,表示函数需要一组值,但是不会关心值集的形式,因为它将与 foreach 一起使用。如果一个值不是数组或 Traversable 的实例,则会抛出一个 TypeError。
function foo(iterable $iterable)
{
foreach ($iterable as $value) {
//.
}
}
//声明为可迭代的参数可能会使用 null 或者一个数组作为默认值
function bar(iterable $iterable = [])
{
//....
}
//可迭代参数默认值
可迭代类型差异示例
function gen(): iterable {
yield 1;
yield 2;
yield 3;
}
Object对象
要创建一个新的对象 object,使用 new 语句实例化一个类:
class foo
{
function do_foo()
{
echo "dong foo.";
}
}
$bar = new foo;
$bar->do_foo();
如果将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成对象,将会创建一个内置类 stdClass 的实例。如果该值为 null,则新的实例为空。 array 转换成 object 将使键名成为属性名并具有相对应的值。注意:在这个例子里, 使用 PHP 7.2.0 之前的版本,数字键只能通过迭代访问。
$obj = (object) array('1' => 'foo');
var_dump(isset($obj->{'1'})); // PHP 7.2.0 后输出 'bool(true)',之前版本会输出 'bool(false)'
var_dump(key($obj)); // PHP 7.2.0 后输出 'string(1) "1"',之前版本输出 'int(1)'
对于其他值,会包含进成员变量名 scalar。
$obj = (object)'ciao';
echo $obj->scalar;
Resource 资源类型
资源 resource 是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的
NULL
特殊的 null 值表示一个变量没有值。NULL 类型唯一可能的值就是不区分大小写的常量 null。
在下列情况下一个变量被认为是 null:
- 被赋值为 null
- 尚未被赋值。
- 被 unset()。
$var = NULL;
Callback / Callable类型
一些函数如 call_user_func() 或 usort() 可以接受用户自定义的回调函数作为参数。回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。
传递
PHP是将函数以string形式传递的。可以使用任何内置或用户自定义函数,但除了语言结构例如:array(),echo,empty(),eval(),exit(),isset(),list(),print 或 unset()。
一个已实例化的 object 的方法被作为 array 传递,下标 0 包含该 object,下标 1 包含方法名。在同一个类里可以访问 protected 和 private 方法。
静态类方法也可不经实例化该类的对象而传递,只要在下标 0 中包含类名而不是对象。自 PHP 5.2.3 起,也可以传递 ‘ClassName::methodName’。
除了普通的用户自定义函数外,也可传递 匿名函数 给回调参数。
类型转换的判别
PHP 在变量定义中不需要(或不支持)明确的类型定义;变量类型是根据使用该变量的上下文所决定的。也就是说,如果把一个 string 值赋给变量 $var,$var 就成了一个 string。如果又把一个integer 赋给 $var,那它就成了一个integer.
允许的强制转换有:
- (int), (integer) - 转换为整形 integer
- (bool), (boolean) - 转换为布尔类型 boolean
- (float), (double), (real) - 转换为浮点型 float
- (string) - 转换为字符串 string
- (array) - 转换为数组 array
- (object) - 转换为对象 object
- (unset) - 转换为 NULL