PHP基础二
1. PHP变量
1. 我们来看一个实例:
<?php
$x = 5;
$y = 6;
$z = $x + $y;
echo $z; // echo 是输出,先照着敲
?>
我们把5赋值给变量x,把6赋值给变量6,把x+y的值,赋值给变量z,最后输出z的值。
在PHP中,变量用$开头创建,表示这个$后的东西是变量。
2. PHP变量规则:
- 1)变量以 $ 符号开始,后面跟着变量的名称。
- 2)变量名必须以字母或者下划线字符开始。
- 3)变量名只能包含字母、数字以及下划线(A-z、0-9 和 _ )。
- 4)变量名不能包含空格。
- 5)变量名是区分大小写的(y 和 Y 是两个不同的变量)。
3. 创建PHP变量:
PHP没有声明变量的命令,变量在第一次给它赋值时即被创建。就是不能单写
$x;
而不给x赋值,要写就写$x = 7
给它一个值(7只是随便一个数)。将字符串内容赋值给变量时,请加上双引号:
<?php
$x = "hello world";
?>
4. PHP是一门弱类型语言:
在上面的例子中,我们不难发现,在给变量赋值时,不需要指定变量的数据类型,编译器会根据所给的值自行判断。
在强类型的编程语言中,我们必须在使用变量前先声明(定义)变量的类型和名称。例C语言:
int main()
{
int x = 12; // 给变量x赋值时必须指定变量x的数据类型为int
return 0;
}
5. PHP变量作用域:
作用域是指变量在脚本中可被引用,使用的范围。
PHP有4中不同的作用域:
local
,global
,static
,parameter
。
1)局部和全局作用域:
在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问(先创建,再访问),要在一个函数中访问一个全局变量,需要使用
global
关键字。在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问。
测试代码:
<?php
$x=5; // 全局变量
function myTest()
{
$y=10; // 局部变量
global $x; // 加关键字global
echo "<p>测试函数内变量:<p>";
echo "变量 x 为: $x"; // 可以访问,需要加关键字global
echo "<br>";
echo "变量 y 为: $y";
}
myTest();
echo "<p>测试函数外变量:<p>";
echo "变量 x 为: $x"; // 可以访问
echo "<br>";
echo "变量 y 为: $y"; // 无法访问
?>
- 显示结果:
测试函数内变量:
变量 x 为: 5
变量 y 为: 10
测试函数外变量:
变量 x 为: 5
变量 y 为:
上面的代码中,
x
在所有函数外部定义,是全局变量。在函数内部访问x
时,需要加关键字global
声明。y
是局部变量,可以在myTest
函数里使用,而不能在函数外使用。你可以在不同函数中使用相同的变量名称,因为这些函数内定义的变量名是局部变量,只作用于该函数内。
global
关键字用于函数内访问全局变量。在函数内调用函数外定义的全局变量,我们需要在函数中的变量前加上global
关键字:
<?php
$x=5;
$y=10;
function myTest()
{
global $x,$y;
$y=$x+$y;
}
myTest();
echo $y; // 输出 15
?>
PHP 将所有全局变量存储在一个名为
$GLOBALS[index]
的数组中。index
保存变量的名称。这个数组可以在函数内部访问,也可以直接用来更新全局变量。上面的例子也可以这样写:
<?php
$x=5;
$y=10;
echo $GLOBALS['y']; // 输出10
echo "<br>";
function myTest()
{
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
}
myTest();
echo $y; // 输出15
echo "<br>";
$GLOBALS['y'] = 9; // 改变y
echo $y;
?>
- 显示结果:
10
15
9
2)static
作用域:
- 局部变量在出函数时需要被销毁,但是有时候我们不想让这个变量销毁,就需要使用
static
关键字,在第一次声明时使用这个关键字:
<?php
function myTest()
{
static $x=0; // static修饰
echo $x;
$x++;
echo "<br>"; // 换行符
}
myTest();
myTest();
myTest();
?>
- 显示结果:
0
1
2
x
不断++
,没有被销毁。每一次使用x
时,x
仍然保持原来的值。注意:
x
仍然是局部变量,不能在作用域之外使用。
5. 参数作用域:
- 跟C语言中的传参差不多,但是不用写明形参的数据类型:
<?php
function myTest($x)
{
echo $x;
}
myTest(5);
?>
2. PHP输出
1. echo和print的区别:
echo
可以输出一个或多个字符串。print
只能输出一个字符串。
注意:
echo
的输出速度比echo
没有返回值,而
2. echo语句:
echo
在使用时可以加上括号,也可以不加:
<?php
echo "1111"; // 加括号
echo("18290"); // 不加括号
?>
echo
可以输出多个不同类型的参数:(并且输出多个参数时不能使用括号)
<?php
echo("127".".0."."0.1"); // 中间用 . 隔开
echo "<br>";
echo "hello "."world"; // 中间用 . 隔开
echo "<br>";
$a = 1;
$b = 2;
// 也可以用,隔开
echo $a," ",$b; // 可以跑,有整型类型和字符串类型
echo($a, $b); // 报错
?>
- 显示结果:
127.0.0.1
hello world
1 2
- 输出变量:
<head>
<meta charset="UTF-8"> // HTML标签部分
</head>
<?php
// 创建变量
$txt1="学习 PHP";
$txt2="我的博客";
$cars=array("Volvo","BMW","Toyota"); // 数组,后面介绍
echo $txt1;
echo "<br>";
echo "在 $txt2 学习 PHP ";
echo "<br>";
echo "我车的品牌是 {$cars[0]}";
?>
- 显示结果:
学习 PHP
在 我的博客 学习 PHP
我车的品牌是 Volvo
3. print语句:
print
在使用时和echo
相似,加不加括号都可以:
<head>
<meta charset="UTF-8">
</head>
<?php
print "<h2>PHP 很有趣!</h2>"; // 可以不加括号
print "Hello world!<br>";
print "我要学习 PHP!";
//或者
print("PHP是全世界最好的语言"); // 可以加括号
?>
print
不能一次输出多个参数:
<?php
$a = "1";
$b = "2";
print $a,$b; // 报错
?>
print
显示变量:
<?php
$txt1="hello world";
$txt2="CSDN";
$cars=array("zhangsan","lisi","wangwu");
print $txt1;
print "<br>";
print "在 $txt2 学习 PHP ";
print "<br>";
print "人 {$cars[0]}";
print "<br>";
print "hello "."world"; // 这不叫多个类型参数,. 是字符串连接符
?>
- 显示结果:
hello world
在 CSDN 学习 PHP
人 zhangsan
hello world
3. EOF使用说明:
PHP EOF(heredoc)
是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字符串的方法。- 必须最后接分号,否则编译通不过。
EOF
可以用任意其它字符代替,只需保证结束标识与开始标识一致。- 结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和字符)。
- 开始标识可以不带引号或带单双引号,不带引号与带双引号效果一致,解释内嵌的变量和转义符号;带单引号则不解释内嵌的变量和转义符号。
- 当内容需要内嵌引号(单引号或双引号)时,不需要加转义符,本身对单双引号转义。
<head>
<meta charset="UTF-8">
</head>
<?php
$a = 1;
echo <<<EOF
"$a""hello"<br>
我的第一个标题<br>
我的第一个段落
EOF;
// 结束需要独立一行且前后不能空格
?>
- 显示结果:
"1""hello"
我的第一个标题
我的第一个段落
- 注意:
- 以
<<<EOF
开始标记开始,以EOF
结束标记结束,结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号。 - 开始标记和结束标记相同,比如常用大写的
EOT、EOD、EOF
来表示,但是不只限于那几个,只要保证开始标记和结束标记不在正文中出现即可。 - 位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。在
heredoc
中,变量不需要用连接符.
或,
来拼接。
- 以
4. 其他输出函数
print_r
:打印关于变量的易于理解的信息,如果给出的是string、integer
或float
,将打印变量值本身。如果给出的是array
,将会按照一定格式显示键和元素。var_dump
:此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。var_dump
和print_r
的区别:var_dump
返回表达式的类型与值,而print_r
仅返回结果,相比调试代码使用var_dump
更便于阅读。
<head>
<meta charset="UTF-8">
</head>
<?php
$n = 10;
$a=array("Volvo", $n,"Toyota");
echo $a;
echo "</br>";
print $a;
echo "</br>";
print_r($a); // 必须带()
echo "</br>";
var_dump($a); // 必须带()
?>
- 显示结果
Array
Array
Array ( [0] => Volvo [1] => 10 [2] => Toyota )
array(3) { [0]=> string(5) "Volvo" [1]=> int(10) [2]=> string(6) "Toyota" }
3. 数据类型
PHP 支持以下几种数据类型:
- String(字符串)
- Integer(整型)
- Float(浮点型)
- Boolean(布尔型)
- Array(数组)
- Object(对象)
- NULL(空值)(“”、0、NULL)
- Resource(资源类型)(图片、文件)
3.1 字符串
1. 定义字符串
- 可以将任何文本放在单引号和双引号中,表示一个字符串
<?php
$x = "Hello world!";
var_dump($x);
echo "<br>";
$x = 'Hello world!';
var_dump($x);
?>
- 显示结果:
string(12) "Hello world!"
string(12) "Hello world!"
2. 字符串并置运算符 .
- 并置运算符
.
用于把两个字符串值连接起来:
<?php
$txt1="Hello world!";
$txt2="What a nice day!";
echo $txt1." ".$txt2;
?>
- 显示结果:
Hello world! What a nice day!
3.2 整型
1. 整型规则
- 整型必须至少有一个数字(0~9);
- 整型不能包含逗号或空格;
- 整型是没有小数点的;
- 整型可以是正数或负数;
- 整型可以用三种格式来指定:十进制, 十六进制(以
0x
为前缀)或八进制(前缀为0
)。
2. 代码示例
<?php
$x = 5985;
var_dump($x);
echo "<br>";
$x = -345; // 负数
var_dump($x);
echo "<br>";
$x = 0x8C; // 十六进制数
var_dump($x);
echo "<br>";
$x = 047; // 八进制数
var_dump($x);
?>
- 显示结果:
int(5985)
int(-345)
int(140)
int(39)
3.3 浮点型
浮点数是带小数部分的数字,或是指数形式
<?php
$x = 10.365;
var_dump($x);
echo "<br>";
$x = 2.4e3; // 2.4 * 10^3
var_dump($x);
echo "<br>";
$x = 8E-5; // 8 * 10^-5
var_dump($x);
?>
显示结果:
float(10.365)
float(2400)
float(8.0E-5)
3.4 布尔型
布尔型可以是true
或false
,通常用于条件判断。
<?php
$x=true;
$y=false;
var_dump($x,$y);
?>
显示结果:
bool(true) bool(false)
3.5 数组
数组可以在一个变量中存储多个值。和其他语言一样,可以通过下标访问。
1. 索引数组
<?php
// 创建索引数组
$fruits = array("Apple", "Banana", "Orange");
// 或简写形式(PHP 5.4+)
$fruits = ["Apple", "Banana", "Orange"];
// 访问元素
echo $fruits[0]."</br>"; // 输出: Apple
// 添加元素
$fruits[] = "Mango"; // 自动添加到最后
$fruits[3] = "Grape"; // 指定索引
// 遍历数组
foreach ($fruits as $fruit) {
echo $fruit . "</br>";
}
?>
- 显示结果:
string(5) "Apple"
string(5) "Apple"
string(6) "Banana"
bool(true)
string(5) "Grape"
2. 关联数组
<?php
// 创建关联数组
$person = array(
"name" => "John",
"age" => 30,
"city" => "New York"
);
// 或简写形式
$person = [
"name" => "John",
"age" => 30,
"city" => "New York"
];
// 访问元素
var_dump($person["name"]); // 输出: John
echo "</br>";
// 添加/修改元素
$person["email"] = "john@example.com";
// 遍历数组
foreach ($person as $key => $value) {
echo "$key: $value"."</br>";
}
?>
- 显示结果:
string(4) "John"
name: John
age: 30
city: New York
email: john@example.com
这里数组的遍历方式后面会讲到。
3.6 对象
首先,你必须使用class
关键字声明类对象。我们在类中定义属性和方法,在实例化的类中使用属性和方法:
<?php
class Car
{
public $name;
// 构造函数
public function __construct()
{
$this->name = "宝马";
}
public function what_color($color)
{
return $color;
}
public function what_name()
{
return $this->name;
}
// 析构函数
public function __destruct()
{}
}
$color = new Car();
echo $color->what_color("red");
echo "</br>";
echo $color->what_name();
?>
- 显示结果:
red
宝马
这里不做过多解释了,毕竟是PHP的基础课。如果有其他语言基础的同学,很容易理解构造函数和析构函数是什么,以及他们在干什么。
3.7 NULL
NULL
值指明一个变量是否为空值。可以通过设置变量值为 NULL
来清空变量数据:
<?php
$x="Hello world!";
$x=null;
var_dump($x);
?>
显示结果:
NULL
3.8 资源类型
一个打开文件资源的例子
example.txt
是我们提前准备好的文件,放在和该php
文件的同级目录下:
<?php
// 打开文件(创建文件资源)
$file = fopen("example.txt", "r");
if ($file === false) {
die("无法打开文件!");
}
// 检查变量类型
echo gettype($file)."</br>"; // 输出: resource
// 读取文件内容
while (!feof($file)) {
echo fgets($file); // 逐行读取
}
// 必须手动关闭资源
fclose($file);
?>
- 显示结果:
resource
hello I am here!
- 读出了文件中的内容,为
hello I am here!
。
3.9 类型比较
1. 虽然 PHP 是弱类型语言,但也需要明白变量类型及它们的意义,因为我们经常需要对 PHP 变量进行比较,包含松散和严格比较。
- 松散比较:使用两个等号
==
比较,只比较值,不比较类型; - 严格比较:用三个等号
===
比较,除了比较值,也比较类型。
2. 例如,“42” 是一个字符串而 42 是一个整数。FALSE 是一个布尔值而 “FALSE” 是一个字符串。
<?php
header("content-type:text/html;charset=utf-8"); //保持中文不乱码
if(42 == "42") {
echo '1、值相等'."</br>";
}
if(42 === "42") {
echo '2、类型相等'."</br>";
}
else {
echo '3、类型不相等'."</br>";
}
?>
- 显示结果:
1、值相等
3、类型不相等
3. 比较 0、false、null
<?php
echo '0 == false: ';
var_dump(0 == false);
echo '0 === false: ';
var_dump(0 === false);
echo "</br>";
echo '0 == null: ';
var_dump(0 == null);
echo '0 === null: ';
var_dump(0 === null);
echo "</br>";
echo 'false == null: ';
var_dump(false == null);
echo 'false === null: ';
var_dump(false === null);
echo "</br>";
echo '"0" == false: ';
var_dump("0" == false);
echo '"0" === false: ';
var_dump("0" === false);
echo "</br>";
echo '"0" == null: ';
var_dump("0" == null);
echo '"0" === null: ';
var_dump("0" === null);
echo "</br>";
echo '"" == false: ';
var_dump("" == false);
echo '"" === false: ';
var_dump("" === false);
echo "</br>";
echo '"" == null: ';
var_dump("" == null);
echo '"" === null: ';
var_dump("" === null);
?>
- 显示结果:
0 == false: bool(true) 0 === false: bool(false)
0 == null: bool(true) 0 === null: bool(false)
false == null: bool(true) false === null: bool(false)
"0" == false: bool(true) "0" === false: bool(false)
"0" == null: bool(false) "0" === null: bool(false)
"" == false: bool(true) "" === false: bool(false)
"" == null: bool(true) "" === null: bool(false)
4. 常量
一个常量由英文字母、下划线、和数字组成,但数字不能作为首字母出现。 (常量名不需要加 $
修饰符)。注意: 常量在整个脚本中都可以使用。
1. 设置常量
- 设置常量,使用
define()
函数,函数语法如下:
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
- 该函数有三个参数:
name
:必选参数,常量名称,即标志符。value
:必选参数,常量的值。case_insensitive
:可选参数,如果设置为true
,该常量大小写不敏感。默认是大小写敏感的。
十分不建议定义不区分大小写的常量,该用法已在PHP8.0+中完全移除。
2. 代码实例
<?php
header("content-type:text/html;charset=utf-8"); //保持中文不乱码
// 区分大小写的常量名
define("GREETING", "欢迎访问 baidu.com");
echo GREETING; // 输出 "欢迎访问 百度.com"
echo '<br>';
// echo greeting; // 报错
?>
- 显示结果:
欢迎访问 baidu.com
3. 常量是全局的,可以在脚本任何地方使用
5. 运算符
1. 算数运算符
<?php
$x=10;
$y=6;
echo ($x + $y); // 输出16
echo '<br>'; // 换行
echo ($x - $y); // 输出4
echo '<br>'; // 换行
echo ($x * $y); // 输出60
echo '<br>'; // 换行
echo ($x / $y); // 输出1.6666666666667
echo '<br>'; // 换行
echo ($x % $y); // 输出4
echo '<br>'; // 换行
echo -$x; // -10
?>
2. 赋值运算符
<?php
$x=10;
echo $x."</br>"; // 输出10
$y=20;
$y += 100;
echo $y."</br>"; // 输出120
$z=50;
$z -= 25;
echo $z."</br>"; // 输出25
$i=5;
$i *= 6;
echo $i."</br>"; // 输出30
$j=10;
$j /= 5;
echo $j."</br>"; // 输出2
$k=15;
$k %= 4;
echo $k."</br>"; // 输出3
?>
- 支持字符串的
.=
:
<?php
$a = "Hello";
$b = $a . " world!";
echo $b; // 输出Hello world!
$x="Hello";
$x .= " world!";
echo $x; // 输出Hello world!
?>
3. 递增/递减运算符
<?php
$x=10;
echo ++$x; // 输出11
$y=10;
echo $y++; // 输出10
$z=5;
echo --$z; // 输出4
$i=5;
echo $i--; // 输出5
?>
4. 比较运算符
<?php
$x=100;
$y="100";
var_dump($x == $y);
echo "<br>";
var_dump($x === $y);
echo "<br>";
var_dump($x != $y);
echo "<br>";
var_dump($x !== $y);
echo "<br>";
$a=50;
$b=90;
var_dump($a > $b);
echo "<br>";
var_dump($a < $b);
?>
- 显示结果:
bool(true)
bool(false)
bool(false)
bool(true)
bool(false)
bool(true)
5. 数组运算符
<?php
$x = array("a" => "red", "b" => "green");
$y = array("c" => "blue", "d" => "yellow");
$d = array("b" => "green","a" => "red" );
$z = $x + $y; // $x 和 $y 数组合并
var_dump($z); // array(4) { ["a"]=> string(3) "red" ["b"]=> string(5) "green" ["c"]=> string(4) "blue" ["d"]=> string(6) "yellow" }
echo "</br>";
var_dump($x == $y); // false
echo "</br>";
var_dump($x === $y); // false
echo "</br>";
var_dump($x != $y); // true
echo "</br>";
var_dump($x <> $y); // 这个也是不等于 true
echo "</br>";
var_dump($x !== $y); // true
echo "</br>";
var_dump($x == $d); // true
echo "</br>";
var_dump($x === $d); // 识别顺序 false
echo "</br>";
?>