忘记写点说明就各种文档开坑了。
如果有初学者看我写的教程学拍断片,那是要被坑的,所以这很不友好。
首先,PHP代码文件需要使用<?php
和?>
作为开头和结尾,这点和jsp有点像。
不过可以不需要,具体视php.ini
中的设置而定。
数据类型
// 此处有部分内容(指说明)是搬运的
数据类型 | 符号名 | 说明 | 注 |
---|---|---|---|
字符串 | string | 字符串是字符序列,可以是引号内的任何文本。 | 就是文本,手写的时候用单/双引号括起来,详见底下的说明:#引号 |
整数 | int | 整数不能有小数点、正负均可,可以用三种格式规定整数:十进制、十六进制(前缀为0x)或八进制(前缀为 0)。 | 前面已经说清楚了,要补充的是,PHP的整数普通情况下是int ,但超出int范围之后,会自动变成long long (印象里的,反正当成long long 用就OK)(long long 的上限好像是91亿亿?) |
逻辑(布尔值) | bool | 逻辑是 真/true 或 假/false , 常用于条件判断 | 部分情况下,其他数据类型值可以转换为逻辑值,如整数不为0时转换为true ,字符串为空时转换为false |
数组 | array | 数组元素是组成数组的基本单元。数组元素也是一种变量, 其标识方法为数组名后跟一个下标。下标表示了元素在数组中的顺序号。数组元素的一般形式为:数组名[下标] | 这段说明的后半句(删除线)是错的,下标还支持文本,具体调用时要看怎么声明这个数组,比如你用json的时候(又跑偏了)。 |
对象 | object | 对象是存储数据和处理数据方式的数据类型,在 PHP 中,必须明确的声明对象,必须声明对象的类(关键词 class)。类是包含属性和方法的结构。在对象中定义数据类型,在该类的实例中使用此数据类型 | 前面说了什么我不是很懂,反正你要写面向对象的代码时就要用class ,这是PHP的关键字,有学c++的同学应该懂,具体展开就太麻烦了,等涉及到的时候再一一说明把,毕竟类本身还是有很多很多很多知识点的,什么继承、多态、访问限制,我想你现在一定不想看到那么长的说明篇幅,就算你想,我也不想。 |
NULL | NULL | NULL值表示变量无值,表示变量是否为空。区别空字符与空值数据库。 | 嗯。。反正区别与0与空文本把,使用检测函数时(isset、asset、is_null等)还会有一点区别 |
- 前三个(
int
、string
、bool
)以及NULL
属于基本数据类型。
举几个栗子(这里先不提字符串):
前提:
php中,每句代码需要使用英文分号(;
)结尾。
使用 var_dump
这个函数输出值,也可以输出数据类型,一般是类型在前,值在后,如:输出整数1 为 int(1)
var_dump(1); // 输出一个正整数:int(1)
var_dump(-999); // 输出一个负整数:int(-999)
然后尝试点别的
比如说,我们已知整数(int)的表示范围在 -2147483648
~ 2147483647
那我们做个小小的尝试,把整数超出这个范围,比如 复读机最爱的 +1
var_dump(2147483648);
然而并没有像想象中那样,输出long long(2147483648),而是输出float(2147483648),
看样子上面的「注」也写错了,但超出表示范围后会自动转换类型是对的,
不过,不知道什么时候变成double?
等等,先输出个普通小数看看,
var_dump(123.456); // 输出 float(123.456)
已知float
能表示6
~7
位小数,那
var_dump(123.01234567891234); //输出:float(123.01234567891)
var_dump(123.01234567896789); //输出:float(123.01234567897)
???,为啥好像有点不对劲,好像可以十几位?
而且意外的都是输出float,不过最后一位会根据下一位选择是否四舍五入进一。
还是查查资料看看有没有希望把,
float(浮点型,也称作 double)
看样子是PHP的自定义路线了,不过不是说好double
可以表示14位吗???
然后是逻辑/布尔,true
和false
都是关键字
true
表示真,可以理解成条件成立,false
表示假。
var_dump(true); // 输出 bool(true)
再尝试下区分大小写
var_dump(True); // 输出同上
说明这个关键字忽略大小写,并且统一小写
接下来是数组,
数组要用array
这个函数构建
先在这里构建个普通数组吧
// 最后两个是字符串,略超纲,可忽略不计
var_dump(array(0, 2, true, 666, '123', "456"));
输出:
array(6) {
[0]=>
int(0)
[1]=>
int(2)
[2]=>
bool(true)
[3]=>
int(666)
[4]=>
string(3) "123"
[5]=>
string(3) "456"
}
我想你大概能看出,数组是这么构建的:
array(值1, 值2, ...);
值可以是任意数据类型,但前提是你得先能表示出来。
值之间用英文逗号分开,要注意的是,最后一个值后面不用加逗号,比如「array(1,2,3,)
」就是错误的写法。
再构建个略微奇怪的数组好了
// 为了方便阅读,这里把代码进行适当换行,另:这也符合PHP语法
var_dump(
array(
"123" => "456",
'456' => 233,
666 => true,
"abc" => 'gg',
true => '?' // 这个没准会报错,尝试下
)
);
输出会是这样的:
array(5) {
[123]=> // 这里本来是字符串"123"
string(3) "456"
[456]=> // 这里本来也是字符串"456",但为什么显示出来是数字呢?
int(233)
[666]=>
bool(true)
["abc"]=> // 那这里的abc怎么就是字符串呢?
string(2) "gg"
[1]=> // 虽然没报错,但我的true呢???
string(1) "?"
}
*/
?>
这个数组的构建方法怎么看起来怪怪的,而且输出的也太???
首先要说下这个数组怎么构建的,
这里指「xx => yy
」xx代表键名,yy代表键值,
既然叫数组,那么肯定有一堆值,(其实蛮迷惑的,数组应该叫 值堆 或者 键堆 才对),
那你想要获取其中某个值的话,肯定要知道这个值的地址,就像你去别人家,要知道他家地址对吧?键名就是用来起这个作用。那么,我想不用说,你应该知道键值代表什么了。
那么,现在说说这个键名,你也看到了,它似乎就支持数字和文本,而且如果文本里只有数字的话,最后还会变成数字。
那你可能会说,「这不是还有个逻辑值true吗?」,但最后还是被转换成数字了对吧?(true
→1
,false
→0
),
所以键名就两种表示方法:整数和文本,更优先用数字表示键名,在文本仅数字时也会转换为数字作为键名。
这里可能还有个疑惑,「键名用小数会怎样?」
var_dump(array(123.45=>666));
于是乎:
array(1) {
[123]=>
int(666)
}
小数部分被舍弃了,所以还是只能用整数和文本。
那么为什么要写这个奇怪数组呢,
是因为还要说明一件事:如果未声明键名,那么键名就会是整数,从0开始。
还有一点要补充,
如果在声明时创建了多个相同的键名,那么最后只会有一个键名,值为最后创建的键值:
var_dump(
array(
1 => 123,
1 => 456,
1 => 789
)
);
输出:
array(1) {
[1]=>
int(789)
}
这里暂时不具体提类, 只需要了解类是这么声明的:
class name {
...
}
以及类是不能拿来输出的。
NULL也是个常量关键词,不区分大小写。
它是一种单独的数据类型,不代表整数0、空文本、逻辑值false
,但是可以互相转换。
这里补充个点:
PHP是个弱类型语言,基本数据类型可以互相转换,一般不需要转换就可以使用,
也可以根据需要进行强制转换:
(目标数据类型)(要转换的数据 / 变量)
- 这里有两对括号,前面的是强制的,后面的可不加,但为了避免混淆,所以尽可能加上。
- 目标数据类型就是前面提到的四种基本数据类型,还有小数/长整数(
float
) - 数据就是手打的,比如
111
、"123"
、true
、null
,变量暂时不解释。
拿来转换null
到其他数据类型看看吧:
var_dump((int)null);
var_dump((bool)null);
var_dump((float)null);
var_dump((string)null);
输出:
int(0)
bool(false)
float(0)
string(0) ""
输出 / 打印
目前了解到以下四个函数:
echo
:输出普通变量print
:输出普通变量,似乎与echo
没什么差别。print_r
:常用于打印数组。- 上面用过的
var_dump
:同print_r
,但会输出数据类型,输出部分类型时会还会输出数据长度,如数组的元素个数,文本的长度。
准确来说,
echo
和
echo
和
使用echo
和
使用echo
和
使用print_r
和var_dump
打印布尔值和NULL
时只会输出一个换行符,
输出换行时需要注意调试环境,如果是网页模式,建议使用<br>
;在命令行或网页源代码模式下建议使用\n
,否则数据会相连在一起。建议使用后者,因为使用print_r
和var_dump
函数时是输出\n
而不是<br>
。
补充:
在其他同学的聊天记录中,我才知道echo
是可以输出多个数据的(用逗号分开)
简单如:echo $a, $b, $c, "\n";
demo:// 这里使用echo "\n";
作为分隔符
echo 1; // 输出1
echo "\n";
echo(1); // 输出1
echo "\n";
print 1; // 输出1
echo "\n";
print(1); // 输出1
echo "\n";
echo "123"; // 输出123
echo "\n";
echo true; // 输出1
echo "\n";
echo false; // 输出空值
echo "\n";
echo array(1,2,3); // 输出array并且产生一个警告
echo "\n";
print array(1,2,3); // 输出array并且产生一个警告
echo "\n";
print_r 123; // 出错
var_dump 123; // 出错
print_r(123); // 输出123
echo "\n";
var_dump(123); // 输出int(123)
echo "\n";
print_r(array(1,2,3));
/*
只会输出数组的键值:
Array
(
[0] => 1
[1] => 2
[2] => 3
)
*/
var_dump(array(1,2,3));
/*
不仅输出数组的键值,还会输出数组大小、值类型:
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
*/
变量
不同于c/c++、java,php的变量名是以$
打头,如$a
,
变量名可由大小写字母、数字和下划线(_
)构成,但首字母不能为数字。
变量名同样对大小写敏感,声明时不需要声明数据类型,直接赋值即可,
「注」php中的赋值与c一样,都是用一个等于号表示,变量在左,值在右
$a = 1;
$A = 0;
var_dump($a);
var_dump($A);
输出
int(1)
int(0)
说明虽然都是a
,但是$a
≠ $A
。
在循环里使用变量时需要提前声明,否则会产生警告(虽然并不影响使用):
for($i = 0; $i < 3; ++$i) {
$n += $i; //等同于 $n = $n + $i;
}
var_dump($n);
输出:
int(3)
未声明的变量默认为null
,即整数类型下为0
,文本类型下为""
:
引号
- php中使用两种英文引号用来表示单字符或字符文本。
- 单引号
'
- 双引号
"
- 如果要表示引号,前面加个反斜杠即可,如:
'\''
表示'
、"\""
表示"
。
echo '''; // 出现错误,看这部分的代码高亮结果出现混乱就知道了。
echo '\''; // 输出一个单引号
echo "\""; // 输出一个双引号
- 两者可以互相使用,使用时视为纯文本,如
'"'
表示"
,"'"
表示'
,不需要转义。
echo '"'; // 输出一个双引号:"
echo "'"; // 输出一个单引号:'
- 两者都可以使用
\
转义符,但区别在于:
单引号下的\
仅能转义引号,
双引号下可以使用各类转义标志,如\n
表示换行;
echo '\n'; // 仅输出\n
echo "\n"; // 输出一个换行
双引号中可以使用变量:
$a = 123;
echo "\$a = $a";
输出:$a = 123
注释
分为单行和多行注释,
- 单行注释使用
//
开头,没有结尾,或者说文本中的换行符就是结尾。 - 多行注释使用
/*
打头,*/
结尾,要注意的是,已注释中的内容不能有*/
。
这里拿单行注释做例子:
$a = 0;
// $a = 1;
var_dump($a);
本来按正常操作,a
要被赋值为1
,但是因为使用了注释符,所以a
未发生任何变化,还是0
。
常量
和变量一样,常量名可由大小写字母、数字和下划线(
_
)构成,首字母同样不能为数字。
不同的是,常量名不需要$
作为开头,而且一旦定义,就不能改变其值,也不能像变量那样可以手动删除。并且,常量定义后,可以在后续执行的脚本中任意位置使用其值。
常量不像变量那样使用一个=
赋值定义,而是使用函数define
。
函数原型:
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
$name
,即常量名,不限制大小写,但一般使用全大写以区分变量$value
,即常量值,可以为任意类型,可以为空文本。$case_insensitive
,即是否不区分大小写,可空,默认值为false
,即区分大小写。
「例」定义一个名为AAA,值为2的常量:
define('AAA', 2);
echo AAA + 3;
这里的echo
等同于2 + 3
,所以输出5
。
那要怎么检测是否存在这个变量呢?
使用defined
函数:
define('AAA', 2);
var_dump(defined('aaa'));
var_dump(defined('AAA'));
因为define
的时候未标明第三个参数,即常量名区分大小写,
所以第一个var_dump
是false
,第二个才是true
。
需要注意的是,使用这个函数时,AAA
的两头一定要引号:
define('AAA', 2);
var_dump(defined(AAA));
否则AAA
会被替换成2
,相当于执行var_dump(defined(2));
,那一定会是false
的。
常量有个用处:如果你把代码放在很多文件里,那可以在调用入口文件里定义一个常量,在其他文件开头加个检测代码,防止他人未经过入口文件进行直接调用。