1.0.0 简介
PHP(Hypertext Preprocessor)是一种开源的服务器端脚本语言,主要用于开发动态网站和Web应用程序,PHP可以直接嵌入到HTML文件中,方便开发。同时PHP文件中也可以包含HTML,javaScript和本身PHP代码
1.1.0 基本知识
1.1.1 语法
(1)基本格式
PHP语言基本格式为
<?php .... ?>
中间写入PHP代码
(2)注释
单行注释
<?php echo"123" ?> //这是一个单行注释
多行注释
<?php echo"123" ?>
/*
这是
一个多行
注释
*/
1.1.2 变量
在PHP中,变量的命名方法为 $a=...
,规则为
- 变量以 $ 符号开始,后面跟着变量的名称
- 变量名必须以字母或者下划线字符开始
- 变量名只能包含字母、数字以及下划线(A-z、0-9 和 _ )
- 变量名不能包含空格
- 变量名是区分大小写的($y 和 $Y 是两个不同的变量)
PHP是弱类型语言,不必声明每个变量的类型
(1)PHP 变量作用域
在PHP中,有以下几种变量作用域
- local
- global
- static
- parameter
在PHP中,变量的作用域决定了变量在程序中的可访问范围。
1.Local(局部变量)
定义:局部变量是在函数内部定义的变量,仅在该函数内部有效。
特点:
局部变量在函数调用时被创建,在函数执行结束时被销毁。
局部变量不能在函数外部访问。
每次调用函数时,局部变量都会重新初始化。和Python中的函数内变量相同
示例:
function myFunction() {
$localVar = 10; // 局部变量
echo $localVar; // 输出 10
}
myFunction();
// echo $localVar; // 错误:$localVar 在函数外部不可访问
2.Global(全局变量)
定义:全局变量是在函数外部定义的变量,可以在整个脚本中访问,包括函数内部(需要通过global
关键字声明)。
特点:
全局变量在脚本开始时被创建,在脚本结束时被销毁。
在函数内部访问全局变量时,需要使用global
关键字。这点和Python也相同
全局变量的生命周期贯穿整个脚本运行过程。
示例:
$globalVar = 20; // 全局变量
function myFunction() {
global $globalVar; // 声明使用全局变量
echo $globalVar; // 输出 20
}
myFunction();
echo $globalVar; // 输出 20
3.Static(静态变量)
定义:静态变量是在函数内部定义的,但它的值在函数调用之间不会被销毁,而是保持其值。
特点:
静态变量仅在函数内部可见。
静态变量在第一次调用函数时被初始化,后续调用函数时,其值不会重新初始化。
静态变量通常用于实现计数器或保持某些状态。
示例:
function myFunction() {
static $staticVar = 0; // 静态变量
$staticVar++;
echo $staticVar; // 每次调用输出递增的值
}
myFunction(); // 输出 1
myFunction(); // 输出 2
myFunction(); // 输出 3
4.Parameter(参数变量)
定义:参数变量是函数的输入参数,用于在函数调用时传递值。
特点:
参数变量的作用域是函数内部。
参数变量的值在函数调用时由调用者提供,函数执行结束后,参数变量被销毁。
参数变量可以是值传递(默认),也可以是引用传递(通过&
符号)。
示例:
function myFunction($param) { // 参数变量
echo $param; // 输出参数值
}
myFunction(30); // 输出 30
// echo $param; // 错误:$param 在函数外部不可访问
总结
- Local:仅在函数内部有效,每次调用函数时重新初始化。
- Global:在脚本全局范围内有效,需在函数内部用
global
声明。 - Static:在函数内部有效,但值在函数调用之间保持不变。
- Parameter:在函数内部有效,由调用者提供值,函数执行结束后销毁。
(2)$_GET与$_POST变量
$_GET与$_POST变量分别用于接受页面中以GET和POST方式提交的值,也就是 method
的值,GET以?变量名=
的形式在URL后,POST传递的参数不直接可见,用法
$_GET(POST)["变量名"]
(3)超级全局变量
PHP中预定义了几个超级全局变量(superglobals) ,它们在一个脚本的全部作用域中都可用。 你不需要特别说明,就可以在函数及类中使用。
PHP 超级全局变量列表:
- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
(4)魔术常量
魔术常量是PHP自带的变量,会随其在代码中的位置二改变其值
__LINE__
文件中的当前行号。
<?php echo '这是第 " ' . __LINE__ . ' " 行'; ?>
输出:这是第 “2” 行
__FILE__
当前文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。在PHP 4.0.2后,该变量返回的是绝对路径,但是之前版本可能是返回相对路径
<?php
echo '该文件位于 " ' . __FILE__ . ' " ';
?>
输出:该文件位于 “C:\test\index.php”
__DIR__
文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增)
<?php
echo '该文件位于 " ' . __DIR__ . ' " ';
?>
输出:该文件位于 “ C:\test ”
__FUNCTION__
函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的
<?php
function test() {
echo '函数名为:' . __FUNCTION__ ;
}
test();
?>
输出:函数名为:test
__CLASS__
类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。
在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 __CLASS__ 对 trait 也起作用。当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字。
<?php
class test {
function _print() {
echo '类名为:' . __CLASS__ . "<br>";
}
}
$t = new test();
$t->_print();
?>
输出:类名为:test
在PHP中,Trait是一种代码复用的机制,用于在类中引入一些方法,而不需要通过继承来实现。它类似于其他语言中的“mixin”(混入)功能。Trait可以包含方法和属性,但不能实例化,只能被类使用。
Trait的定义语法类似于类,但使用
trait
关键字。trait MyTrait { public function myMethod() { echo "This is a method from MyTrait."; } }
使用
use
关键字将Trait引入到类中。class MyClass { use MyTrait; // 引入Trait } $obj = new MyClass(); $obj->myMethod(); // 输出:This is a method from MyTrait.
__METHOD__
类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
<?php
function test() {
echo '函数名为:' . __METHOD__ ;
}
test();
?>
输出:函数名为:test
__NAMESPACE__
为了在一个大型项目中使用同名变量时不会冲突,所以使用命名空间,不同空间之间可以存在同名变量,改常量返回当前命名空间的名称(区分大小写),此常量是在编译时定义的(PHP 5.3.0 新增)
<?php
namespace MyProject;
echo '命名空间为:"', __NAMESPACE__, '"'; // 输出 "MyProject"
?>
输出:命名空间为:”MyProject”
1.1.3 常用函数
(1)echo/print 函数
- echo:可以一次性输出多个变量,并用逗号隔开,记得结尾分号
echo "这是一个", "字符串,", "使用了", "多个", "参数。";
- print:一次只能输出一个变量
print "我要学习 PHP!";
(2)if…else
PHP中的判断语句和Python基本相同,只是写法稍有不同,不需要冒号和缩进,采用大括号包裹执行内容
if (条件)
{
条件成立时执行的代码;
}
else
{
条件不成立时执行的代码;
}
(3)Switch语句
switch可以根据条件选择性的执行一个分支(Python没有)
<?php
switch (expression) {
case value1:
// 代码块1
break;
case value2:
// 代码块2
break;
// 更多的 case 语句
default:
// 如果没有匹配的值
}
?>
在括号中写入判断式,这个式子生成一个值来匹配下方的value值,一旦匹配就执行那个分支。若没有匹配值,执行default分支。
(4)While 循环
普通while循环
while (条件)
{
要执行的代码;
}
当括号内条件为真,则会执行大括号中代码,和Pytohn相同
do…while 语句
do
{
要执行的代码;
}
while (条件);
do…while 语句会至少执行一次代码,然后检查条件,只要条件成立,就会重复进行循环。举个实际例子就容易明白
int num;
do {
printf("请输入一个正数:");
scanf("%d", &num);
if (num <= 0) {
printf("输入无效,请重新输入!\n");
}
} while (num <= 0);
这里是一个判断用户输入是否为正数的代码,虽然里面有判断,但是不管怎样,要先把提示信息给出来。这种多用于菜单类的
1.2.0 实际操作
一个简单的留言板网页,文件结构
PHP
├─ .htaccess
├─ index.html
├─ post.php
├─ passages
└─ list.php
post.php负责接受由网页传来的留言数据,并将其按照顺序放在passages文件夹中,每个留言一个文档。
<?php
$content = $_POST['content'];
$content = htmlspecialchars($content, ENT_QUOTES, 'UTF-8');
$directory = 'passages/';
$files = scandir($directory);
$files = count($files) - 2;
$new_files = $directory.($files+1) . '.txt';
$file = fopen($new_files,'a');
fwrite($file, $content);
fclose($file);
?>
list.php负责读取passage文件夹中的文档并将其显示在index.html中
<?php
$directory = 'passages/';
$files = glob($directory . '*.txt');
$count = count($files);
for ($i = 1; $i <= $count; $i++) {
$content = file_get_contents('passages/'.$i.'.txt');
echo $content.'<br>';
}
?>
index.html中使用Javascript的Ajax请求提交数据和查询数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>留言板</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function() {
$('#submitForm').on('submit', function(event) {
event.preventDefault(); // 阻止表单默认提交行为
var formData = $(this).serialize(); // 获取表单数据
$.ajax({
type: 'POST',
url: 'post.php', // 确保这个文件存在并正确处理POST请求
data: formData,
success: function(response) {
$('#status').html('<p>提交成功。');
},
error: function() {
$('#status').html('<p>提交失败。</p>');
}
});
});
});
</script>
</head>
<body>
<div>
<h1>这是测试留言板</h1>
<p>在下方留言</p>
</div>
<div>
<form id="submitForm" action="post.php" method="post">
<label for="name">请输入你的留言</label>
<textarea id="content" name="content" rows="4" cols="50" required></textarea><br><br>
<button type="submit">提交</button>
</form>
</div>
<div>
<div id="status">
</div>
</div>
<script>
$(document).ready(function() {
$('#submitForm').on('submit', function(event) {
event.preventDefault(); // 阻止表单默认提交行为
var formData = $(this).serialize(); // 获取表单数据
$.ajax({
type: 'POST',
url: 'list.php', // 确保这个文件存在并正确处理POST请求
data: formData,
success: function(response) {
$('#result').html(response); // 将结果显示在<div>中
},
error: function() {
$('#result').html('<p>提交失败。</p>');
}
});
});
});
</script>
<div>
<h2>留言列表</h2>
<div id="result">
</div>
</div>
</body>
</html>
虽然不懂Ajax的原理,但是会用😁,最终效果
