这是 PHP 开发的根基,也是最容易踩坑的地方,先从几个高频问题说起:
新手常混淆这两个比较运算符,导致逻辑错误:
php
运行
<?php
// 松散比较(==):只比较值,不比较类型
$a = 0;
$b = '0';
var_dump($a == $b); // 输出 bool(true)
// 严格比较(===):既比较值,也比较类型
var_dump($a === $b); // 输出 bool(false)
// 实战建议:判断用户输入、状态值时,优先用===,避免类型转换导致的bug
?>
超全局变量(如$_GET、$_POST、$_SESSION)是 PHP 内置的全局数组,新手容易忽略安全过滤:
php
运行
<?php
// 错误示例:直接使用$_GET参数,存在XSS风险
$username = $_GET['username'];
echo "欢迎你:{$username}";
// 正确示例:过滤用户输入
$username = isset($_GET['username']) ? htmlspecialchars($_GET['username'], ENT_QUOTES) : '';
echo "欢迎你:{$username}";
?>
纯原生 PHP 开发大型项目效率低,主流框架能大幅提升开发效率,推荐两个新手友好的框架:
最核心的 MVC 结构示例(以 ThinkPHP 6 为例):
php
运行
// 控制器(app/controller/Index.php)
namespace app\controller;
use app\model\User;
class Index
{
public function index()
{
// 调用模型查询数据
$user = User::where('id', 1)->find();
// 渲染视图并传递数据
return view('index', ['user' => $user]);
}
}
// 模型(app/model/User.php)
namespace app\model;
use think\Model;
class User extends Model
{
// 模型关联数据表(默认是表名复数,可自定义)
protected $table = 'user';
}
Laravel 的路由 + 控制器基础示例:
php
运行
// 路由(routes/web.php)
Route::get('/user/{id}', [UserController::class, 'show']);
// 控制器(app/Http/Controllers/UserController.php)
namespace App\Http\Controllers;
use App\Models\User;
class UserController extends Controller
{
public function show($id)
{
$user = User::findOrFail($id);
return view('user.show', ['user' => $user]);
}
}
php
运行
<?php
// 正确示例:PDO预处理
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '123456');
$stmt = $pdo->prepare("SELECT * FROM user WHERE id = :id");
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();
$user = $stmt->fetch(PDO::FETCH_ASSOC);
?>
php
运行
<?php
$allowedExts = ['jpg', 'png', 'gif'];
$fileExt = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
// 检查文件类型
if (!in_array($fileExt, $allowedExts)) {
die('仅允许上传jpg/png/gif文件');
}
// 检查文件大小(限制2M以内)
if ($_FILES['file']['size'] > 2 * 1024 * 1024) {
die('文件大小不能超过2M');
}
// 重命名文件,避免覆盖和安全问题
$newFileName = uniqid() . '.' . $fileExt;
move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $newFileName);
?>