以.php作为后缀结尾的文件,由服务器解析和运行的语言。
一、语法
PHP 脚本可以放在文档中的任何位置。
PHP 脚本以 <?php 开始,以 ?> 结束。
<!DOCTYPE html>
<html>
<body>
<h1>My first PHP page</h1>
<?php
echo "Hello World!";
?>
</body>
</html>
二、变量
PHP中无声明变量,$+变量名即为PHP的变量,在赋值的时候,自动创建变量。
<?php
$txt="Hello world!";
$x=5;
$y=10.5;
?>
PHP 变量规则:
- 变量以 $ 符号开始,后面跟着变量的名称
- 变量名必须以字母或者下划线字符开始
- 变量名只能包含字母、数字以及下划线(A-z、0-9 和 _ )
- 变量名不能包含空格
- 变量名是区分大小写的($y 和 $Y 是两个不同的变量)
三、数据类型
1.String字符串
单行字符串
由双引号包裹的字符组成的序列。
<?php
$x = "Hello world!";
echo $x;
echo "<br>";
$x = 'Hello world!';
echo $x;
?>
字符串连接(并置运算符)
字符串的连接用并置运算符的' . '连接。
<?php
$txt1="Hello world!";
$txt2="What a nice day!";
echo $txt1 . " " . $txt2;
?>
字符串查找(strpos()函数)
用来在目标字符串里查找子串,第一个参数是目标字符串,第二个参数是要查找的子串,返回子串第一次出现的位置。
<?php
echo strpos("Hello world!","world");
?>
//返回6
字符串长度(strlen()函数)
返回字符串的长度。
<?php
echo strlen("Hello world!");
?>
多行字符串EOF
定义多行字符串的方法,可以用来输出html代码块。
<?php
$x= <<<EOF
<h1>我的第一个标题</h1>
<p>我的第一个段落。</p>
EOF;
// 结束需要独立一行且前后不能空格
echo $x
?>
注意事项:
- EOF可以用任意大写字符代替,但要保证开始字符和结束字符相同。
- 结束字符需要独立一行且前后不能空格
- 位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。在EOF中,变量不需要用连接符 . 或 , 来拼接。
2.Integer整型
整型可以用三种格式来指定:十进制, 十六进制( 以 0x 为前缀)或八进制(前缀为 0)。
<?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);
?>
var_dump(变量名):可以输出变量的数据类型和值,还可以显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
<?php
$a = array(1, 2, array("a", "b", "c"));
var_dump($a);
?>
3.Float浮点型
浮点数是带小数部分的数字,或是指数形式。
<?php
$x = 10.365;
var_dump($x);
echo "<br>";
$x = 2.4e3;
var_dump($x);
echo "<br>";
$x = 8E-5;
var_dump($x);
?>
4.Boolean布尔型
布尔型可以是 TRUE 或 FALSE,布尔型通常用于条件判断。
$x=true;
$y=false;
5.Array数组
创建数组
使用函数 array()创建数组。
<?php
$cars=array("Volvo","BMW","Toyota");
var_dump($cars);
?>
数值数组
数值数组就是普通的一维数组。
<?php
$cars=array("Volvo","BMW","Toyota");
echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
?>
关联数组
关联数组更像映射map数组,需要指定键值和键名,键名要用符号 " => " 与键值连接。
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
echo "Peter is " . $age['Peter'] . " years old.";
?>
多维数组
语法
array (
array (elements...),
array (elements...),
...
)
多维数组就是一维数组里的元素还是一维数组。
<?php
// 二维数组:
$cars = array
(
array("Volvo",100,96),
array("BMW",60,59),
array("Toyota",110,100)
);
?>
<?php
$sites = array
(
"runoob"=>array
(
"菜鸟教程",
"http://www.runoob.com"
),
"google"=>array
(
"Google 搜索",
"http://www.google.com"
),
"taobao"=>array
(
"淘宝",
"http://www.taobao.com"
)
);
print("<pre>"); // 格式化输出数组
print_r($sites);
print("</pre>");
?>
遍历数组
count()函数:返回数组的长度
<?php
$cars=array("Volvo","BMW","Toyota");
$arrlength=count($cars);
for($x=0;$x<$arrlength;$x++)
{
echo $cars[$x];
echo "<br>";
}
?>
数组排序
- sort() - 对数组进行升序排列
- rsort() - 对数组进行降序排列
- asort() - 根据关联数组的值,对数组进行升序排列
- ksort() - 根据关联数组的键,对数组进行升序排列
- arsort() - 根据关联数组的值,对数组进行降序排列
- krsort() - 根据关联数组的键,对数组进行降序排列
<?php
$cars=array("Volvo","BMW","Toyota");
sort($cars);
?>
6.Object对象
使用class声明对象,内部要定义一个构造函数,在新建对象时候自动调用。
<?php
class Car
{
var $color;
function __construct($color="green") {
//构造函数
$this->color = $color;
}
function what_color() {
return $this->color;
}
}
?>
7.Resource资源类型
resource 是一种特殊变量,保存了到外部资源的一个引用。常见资源数据类型有打开文件、数据库连接、图形画布区域等。
由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此将其它类型的值转换为资源没有意义。
使用 get_resource_type() 函数可以返回资源(resource)类型。
<?php
$c = mysql_connect();
echo get_resource_type($c)."\n";
// 打印:mysql link
$fp = fopen("foo","w");
echo get_resource_type($fp)."\n";
// 打印:file
$doc = new_xmldoc("1.0");
echo get_resource_type($doc->doc)."\n";
// 打印:domxml document
?>
七、条件判断语句
if.......else条件语句
<?php
$t=date("H");
if ($t<"10")
{
echo "Have a good morning!";
}
elseif ($t<"20")
{
echo "Have a good day!";
}
else
{
echo "Have a good night!";
}
?>
switch条件语句
<?php
$favcolor="red";
switch ($favcolor)
{
case "red":
echo "你喜欢的颜色是红色!";
break;
case "blue":
echo "你喜欢的颜色是蓝色!";
break;
case "green":
echo "你喜欢的颜色是绿色!";
break;
default:
echo "你喜欢的颜色不是 红, 蓝, 或绿色!";
}
?>
八、循环
1.while循环
<html>
<body>
<?php
$i=1;
while($i<=5)
{
echo "The number is " . $i . "<br>";
$i++;
}
?>
</body>
</html>
2.do....while循环
<html>
<body>
<?php
$i=1;
do
{
$i++;
echo "The number is " . $i . "<br>";
}
while ($i<=5);
?>
</body>
</html>
3.for循环
<?php
for ($i=1; $i<=5; $i++)
{
echo "数字为 " . $i . PHP_EOL;
}
?>
4.foreach循环
语法:数值数组
每进行一次循环,当前数组元素的值就会被赋值给 $value 变量(数组指针会逐一地移动),在进行下一次循环时,您将看到数组中的下一个值。
foreach ($array as $value)
{
要执行代码;
}
案例:
<?php
$x=array("Google","Runoob","Taobao");
foreach ($x as $value)
{
echo $value . PHP_EOL;
//PHP_EOL: 这是一个 PHP 内置的常量,表示特定操作系统下的换行符。
}
?>
语法:关联数组
每一次循环,当前数组元素的键与值就都会被赋值给 $key 和 $value 变量(数字指针会逐一地移动),在进行下一次循环时,你将看到数组中的下一个键与值
foreach ($array as $key => $value)
{
要执行代码;
}
案例:
<?php
$x=array(1=>"Google", 2=>"Runoob", 3=>"Taobao");
foreach ($x as $key => $value)
{
echo "key 为 " . $key . ",对应的 value 为 ". $value . PHP_EOL;
}
?>
九、函数
1.自定义函数
语法:
<?php
function functionName()
{
// 要执行的代码
return 返回值
}
?>
案例:
<?php
function add($x,$y)
{
$total=$x+$y;
return $total;
}
echo "1 + 16 = " . add(1,16);
?>
2.isset函数
语法:
bool isset( $var )
返回值:
isset() 返回一个布尔类型的值。
- true :变量「已定义」
- false:变量「未定义」或变量为 NULL 或 变量被 unset()
3.include函数和require函数
二者的作用都是在一个php文件插入另一个文件并执行,但二者有区别。
- require 一般放在 PHP 文件的最前面,程序在执行前就会先导入要引用的文件;
- include 一般放在程序的流程控制中,当程序执行时碰到才会引用,简化程序的执行流程。
- require 引入的文件有错误时,执行会中断,并返回一个致命错误;
- include 引入的文件有错误时,会继续执行,并返回一个警告。
- 对于include() 语句来说,在执行文件时每次都要进行读取和评估;
- 对于 require() 来说,文件只处理一次(实际上,文件内容替换 require() 语句)
案例:
<?php
include 'test-nothing.php';
echo 'abc';
?>
十、常量
定义常量define
语法:
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
case_insensitive :可选参数,如果设置为 TRUE,该常量则大小写不敏感,默认是大小写敏感的。
案例:
<?php
// 区分大小写的常量名
define("GREETING", "欢迎访问 Runoob.com");
echo GREETING; // 输出 "欢迎访问 Runoob.com"
echo '<br>';
echo greeting; // 输出 "greeting",但是有警告信息,表示该常量未定义
?>
定义常量const
语法:
const CONSTANT_NAME = "value";
案例:
const SITE_URL = "https://www.runoob.com";
echo SITE_URL; // 输出 "https://www.runoob.com"
总结
这两种常量的定义方法在引用时候无需加$,因为其为常量不是变量。
十一、超级全局变量
超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。 你不需要特别说明,就可以在函数及类中使用。
变量名 | 解释 |
---|---|
$_COOKIE | 存储客户端的 Cookie 数据的全局数组 |
$_GET | 接受所有以 get 方式发送的请求的全局数组 |
$_POST | 接受所有以 post 方式发送请求的全局数组 |
$_REQUEST | 用于收集来自 HTTP 请求的数据 |
1.$_GET
获取url问号后面的数据,在url里#是锚定位符,GET方法无法获取锚定位符后面的内容。
案例:
<?php
$name = $_GET['name']; // "John"
$age = $_GET['age']; // "25"
echo "姓名: " . htmlspecialchars($name) . "<br>";
echo "年龄: " . htmlspecialchars($age);
//htmlspecialchars() 或 filter_input()可以避免SQL 注入和 XSS(跨站脚本攻击)
?>
<?php
$q = isset($_GET['q'])? htmlspecialchars($_GET['q']) : '';
if($q) {
if($q =='RUNOOB') {
echo '菜鸟教程<br>http://www.runoob.com';
} else if($q =='GOOGLE') {
echo 'Google 搜索<br>http://www.google.com';
} else if($q =='TAOBAO') {
echo '淘宝<br>http://www.taobao.com';
}
} else {?><form action="" method="get">
<input type="radio" name="q" value="RUNOOB" />Runoob
<input type="radio" name="q" value="GOOGLE" />Google
<input type="radio" name="q" value="TAOBAO" />Taobao
<input type="submit" value="提交">
</form><?php
}
?>
2.$_POST
获取由POST方法提交的参数。
案例:
<?php
$q = isset($_POST['q'])? $_POST['q'] : '';
if(is_array($q)) {
$sites = array(
'RUNOOB' => '菜鸟教程: http://www.runoob.com',
'GOOGLE' => 'Google 搜索: http://www.google.com',
'TAOBAO' => '淘宝: http://www.taobao.com',
);
foreach($q as $val) {
// PHP_EOL 为常量,用于换行
echo $sites[$val] . PHP_EOL;
}
} else {?><form action="" method="post">
<input type="checkbox" name="q[]" value="RUNOOB"> Runoob<br>
<input type="checkbox" name="q[]" value="GOOGLE"> Google<br>
<input type="checkbox" name="q[]" value="TAOBAO"> Taobao<br>
<input type="submit" value="提交">
</form><?php
}
?>
3.$_COOKIE
设置Cookie
语法:
setcookie(name, value, expire, path, domain);
参数说明:
name(必需):
这是 cookie 的名称。它是一个字符串,必须符合变量命名规则。
value(必需):
这是与 cookie 关联的值。它是一个字符串,表示你要存储在客户端的内容。
expire(可选):
这是 cookie 过期的时间。它是一个 Unix 时间戳(即从1970年1月1日到现在的秒
数),可以通过
time()
函数来获取当前的时间戳。如果设置为 0,cookie 会在浏览器会话结束时过期;如果设置为将来的时间,则 cookie 会在指定的时间到期。
path(可选):
- 这是 cookie 可用的路径。默认值是当前脚本的路径。设置此参数可以限制 cookie 的可用范围。例如,如果设置为
/
,那么该 cookie 可以在整个域名下的所有路径中使用。domain(可选):
- 这是 cookie 可用的域名。可以用来设置 cookie 的作用域。默认情况下,cookie 将只在所发出的域名下有效。如果指定了子域名(例如
example.com
),则 cookie 也可以在子域名(如www.example.com
和sub.example.com
)下使用。
案例:
setcookie() 函数用于设置 cookie,且setcookie() 函数必须位于 <html> 标签之前。
<?php
$expire=time()+60*60*24*30;
setcookie("user", "runoob", $expire);
?>
<html>
.....
获取Cookie的值
使用$_COOKIE超级全局数组来获取前面设定的Cookie值。
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<?php
if (isset($_COOKIE["user"]))
echo "欢迎 " . $_COOKIE["user"] . "!<br>";
else
echo "普通访客!<br>";
?>
</body>
</html>
案例使用了isset函数来判断是否设置了Cookie
4.$_REQUEST
$_REQUEST
是 PHP 中的一个超全局数组,用于收集来自 HTTP 请求的数据。它包含了$_GET
、$_POST
两个数组中传递的数据。使用$_REQUEST
时,可以方便地获取这两种方式发送的请求参数。
案例:
// 假设用户通过 GET 或 POST 请求传递了一个名为 "username" 的参数
$username = $_REQUEST['username'];
// 处理参数...
echo "Hello, " . htmlspecialchars($username);
十二、面向对象(类)
十三、命名空间
1.定义命名空间
语法:
<?php
// 定义代码在 'MyProject' 命名空间中
namespace MyProject;
// ... 代码 ...
案例: 单个文件多个命名空间(不推荐)
<?php
namespace MyProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
namespace AnotherProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
?>
案例: 单个文件多个命名空间(推荐)
<?php
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace AnotherProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
?>
当使用全局代码和命名空间代码混用时候,必须使用花括号{},并且HTML页面代码应该另写在一个不包含命名空间的文件里,通过require和include函数来引入。
<?php
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace { // 全局代码
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>
2.子命名空间
相当于目录与子目录的关系
<?php
namespace MyProject\Sub\Level{ //声明分层次的单个命名空间
const CONNECT_OK = 1;
class Connection { /* ... */ }
function Connect() { /* ... */ }
}
?>
十四、文件操作
1.fopen()函数
用于在php打开文件。
语法:
fopen("文件名","参数")
案例:
<html>
<body>
<?php
$file=fopen("welcome.txt","r");
?>
</body>
</html>
2.fwrite()函数
用来向文件写入信息。
语法:
fwrite(file,string,length)
//file 必需。规定要写入的打开文件。
//string 必需。规定要写入文件的字符串。
//length 可选。规定要写入的最大字节数。
案例:
<?php
$file = fopen("test.txt","w");
echo fwrite($file,"Hello World. Testing!");
fclose($file);
?>
3.fclose()函数
用来关闭文件。
案例:
<?php
$file = fopen("test.txt","r");
//执行一些代码
fclose($file);
?>
4.feof() 函数
检测是否已到达文件末尾(EOF),返回值为bool类型。
注意:在 w 、a 和 x 模式下,您无法读取打开的文件!
案例:
if (feof($file)) echo "文件结尾";
5.fgets() 函数
从文件中逐行读取文件。
注意:在读取完一行后,指针会移动到新的一行。
案例:
<?php
$file = fopen("welcome.txt", "r") or exit("无法打开文件!");
// 读取文件每一行,直到文件结尾
while(!feof($file))
{
echo fgets($file). "<br>";
}
fclose($file);
?>
6.fgetc() 函数
从文件中逐字符地读取文件。
注意:在调用该函数之后,文件指针会移动到下一个字符。
案例:
<?php
$file=fopen("welcome.txt","r") or exit("无法打开文件!");
while (!feof($file))
{
echo fgetc($file);
}
fclose($file);
?>
参考资料
PHP 教程 | 菜鸟教程 (runoob.com)