GKLBB

当你经历了暴风雨,你也就成为了暴风雨

导航

软件研发 --- hello world 项目 之 web始皇 php

PHP 安装运行完整指南

目录

  1. PHP 简介
  2. 安装 PHP
  3. 验证安装
  4. 运行 Hello World 程序
  5. PHP 程序结构详解
  6. 包管理器 Composer
  7. Web 服务器配置
  8. 常见问题解决
  9. 开发工具推荐
  10. 进阶学习建议
  11. 与其他语言对比

PHP 简介

PHP(PHP: Hypertext Preprocessor)是一种广泛使用的开源脚本语言,特别适用于Web开发。PHP可以嵌入到HTML中,也可以用于命令行脚本和桌面应用程序开发。

PHP 的特点

  • 易学易用:语法简单,学习曲线平缓
  • 跨平台:支持Windows、Linux、macOS等操作系统
  • 开源免费:完全免费,拥有活跃的开源社区
  • Web优化:专为Web开发设计,内置丰富的Web功能
  • 数据库支持:支持多种数据库(MySQL、PostgreSQL、SQLite等)
  • 丰富的扩展:拥有大量的内置函数和第三方扩展
  • 动态类型:变量类型在运行时确定
  • 服务器端执行:在服务器端执行,客户端只接收结果

PHP 的应用领域

  • Web 开发:动态网站、Web应用程序
  • 内容管理系统:WordPress、Drupal、Joomla
  • 电商平台:Magento、OpenCart
  • 框架开发:Laravel、Symfony、CodeIgniter
  • API 开发:RESTful API、Web服务
  • 命令行脚本:系统管理、数据处理

安装 PHP

方法一:集成环境安装(推荐新手)

XAMPP(跨平台)

  1. 下载 XAMPP

  2. 安装过程

    • Windows:双击 .exe 文件,按向导安装
    • macOS:双击 .dmg 文件,拖拽到应用程序文件夹
    • Linux:下载 .run 文件,给予执行权限后运行
  3. 启动服务

    • 打开 XAMPP 控制面板
    • 启动 Apache 和 MySQL 服务
    • 访问 http://localhost 验证安装

WAMP(Windows)

  1. 下载安装

  2. 使用方法

    • 启动 WAMP 服务
    • 系统托盘图标变绿表示服务正常
    • 访问 http://localhost

MAMP(macOS)

  1. 下载安装

    • 访问:https://www.mamp.info/
    • 下载 MAMP(免费版)或 MAMP PRO(付费版)
    • 安装到应用程序文件夹
  2. 配置使用

方法二:独立安装 PHP

Windows

  1. 下载 PHP

  2. 安装配置

    # 解压到 C:\php
    # 复制 php.ini-development 为 php.ini
    copy C:\php\php.ini-development C:\php\php.ini
    
    # 添加到系统PATH环境变量
    # 系统属性 -> 高级 -> 环境变量 -> PATH -> 添加 C:\php
    
  3. 配置 php.ini

    ; 启用常用扩展
    extension=curl
    extension=gd
    extension=mbstring
    extension=mysqli
    extension=pdo_mysql
    extension=openssl
    
    ; 设置时区
    date.timezone = Asia/Shanghai
    
    ; 错误报告
    display_errors = On
    error_reporting = E_ALL
    

macOS

  1. 使用 Homebrew(推荐)

    # 安装 Homebrew(如果未安装)
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    
    # 安装 PHP
    brew install php
    
    # 启动 PHP-FPM
    brew services start php
    
  2. 使用 MacPorts

    # 安装 MacPorts 后
    sudo port install php82 +apache2 +mysql8
    

Linux

Ubuntu/Debian:

# 更新包列表
sudo apt update

# 安装 PHP 和常用扩展
sudo apt install php php-cli php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip

# 安装 Apache(可选)
sudo apt install apache2 libapache2-mod-php

# 启动服务
sudo systemctl start apache2
sudo systemctl enable apache2

CentOS/RHEL/Fedora:

# CentOS/RHEL 8+
sudo dnf install php php-cli php-fpm php-mysqlnd php-curl php-gd php-mbstring php-xml php-zip

# 或者使用 Remi 仓库获取最新版本
sudo dnf install epel-release
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
sudo dnf module enable php:remi-8.2
sudo dnf install php php-cli php-fpm

# Fedora
sudo dnf install php php-cli php-fpm php-mysqlnd

Arch Linux:

sudo pacman -S php php-apache php-fpm

方法三:使用 Docker

# 拉取 PHP 镜像
docker pull php:8.2-cli

# 运行 PHP 容器
docker run -it --rm -v $(pwd):/app -w /app php:8.2-cli php hello.php

# 或者使用 PHP-FPM + Nginx
docker-compose.yml:
version: '3.8'
services:
  php:
    image: php:8.2-fpm
    volumes:
      - ./:/var/www/html
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./:/var/www/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php

验证安装

命令行验证

# 检查 PHP 版本
php --version
# 或者
php -v

# 检查 PHP 配置
php --ini

# 查看已安装的扩展
php -m

# 查看 PHP 信息
php -i

预期输出示例:

C:\> php --version
PHP 8.2.0 (cli) (built: Dec  6 2022 15:31:23) (ZTS Visual C++ 2019 x64)
Copyright (c) The PHP Group
Zend Engine v4.2.0, Copyright (c) Zend Technologies

Web 环境验证

创建 phpinfo.php 文件:

<?php
// 显示 PHP 配置信息
phpinfo();
?>

将文件放在Web服务器根目录,访问 http://localhost/phpinfo.php

运行 Hello World 程序

<?php
// PHP Hello World 程序
// PHP(PHP: Hypertext Preprocessor)是一种广泛使用的开源脚本语言
// 特别适用于Web开发,可以嵌入到HTML中

// PHP脚本必须以 <?php 开始标签开头
// 如果文件只包含PHP代码,建议省略结束标签 ?>

// 使用 echo 语句输出文本到浏览器或命令行
// echo 是PHP中最常用的输出语句之一
echo "Hello, World!\n";

// 输出PHP相关信息
echo "欢迎使用PHP编程语言!\n";
echo "PHP版本: " . PHP_VERSION . "\n";
echo "操作系统: " . PHP_OS . "\n";
echo "服务器API: " . php_sapi_name() . "\n";

// PHP_VERSION, PHP_OS 是PHP的预定义常量
// php_sapi_name() 返回当前PHP的服务器API类型
// . 是PHP中的字符串连接操作符
// \n 是换行符,在命令行中显示换行

// 演示PHP的一些基本特性

// 1. 变量声明和使用
// PHP变量以$符号开头,是动态类型语言
$message = "PHP让Web开发变得简单!";
$current_time = date('Y-m-d H:i:s');
$author = "PHP开发者";
$version = 8.2;
$is_web_language = true;

echo "\n=== 变量演示 ===\n";
echo "消息: {$message}\n";
echo "当前时间: {$current_time}\n";
echo "作者: {$author}\n";
echo "版本: {$version}\n";
echo "是否为Web语言: " . ($is_web_language ? '' : '') . "\n";

// {} 是变量插值语法,用于在双引号字符串中嵌入变量
// ?: 是三元操作符

// 2. 函数定义和调用
// 使用 function 关键字定义函数
function greetUser($name) {
    return "你好, {$name}! 欢迎学习PHP!";
}

// 带默认参数的函数
function calculateSum($a, $b = 0) {
    return $a + $b;
}

// 可变参数函数(PHP 5.6+)
function sumAll(...$numbers) {
    return array_sum($numbers);
}

echo "\n=== 函数演示 ===\n";
echo greetUser("开发者") . "\n";
echo "计算结果 5 + 3 = " . calculateSum(5, 3) . "\n";
echo "多个数字求和 1+2+3+4+5 = " . sumAll(1, 2, 3, 4, 5) . "\n";

// 3. 数组操作
// PHP支持索引数组和关联数组
$technologies = ["PHP", "Laravel", "Symfony", "CodeIgniter"];
$project_info = [
    'name' => 'Hello World项目',
    'language' => 'PHP',
    'difficulty' => '初级',
    'web_ready' => true
];

echo "\n=== 数组演示 ===\n";
echo "技术栈: " . implode(', ', $technologies) . "\n";
echo "项目信息:\n";
foreach ($project_info as $key => $value) {
    $display_value = is_bool($value) ? ($value ? '' : '') : $value;
    echo "  {$key}: {$display_value}\n";
}

// implode() 将数组元素连接成字符串
// foreach 是PHP中遍历数组的常用方法
// is_bool() 检查变量是否为布尔类型

// 4. 面向对象编程
// PHP支持完整的面向对象编程
class Person {
    // 属性(成员变量)
    private $name;
    private $age;
    public static $count = 0;
    
    // 构造函数
    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
        self::$count++;
    }
    
    // 公共方法
    public function introduce() {
        return "我是{$this->name},今年{$this->age}岁。";
    }
    
    // Getter方法
    public function getName() {
        return $this->name;
    }
    
    public function getAge() {
        return $this->age;
    }
    
    // 静态方法
    public static function getCount() {
        return self::$count;
    }
}

// 继承示例
class Student extends Person {
    private $school;
    
    public function __construct($name, $age, $school) {
        parent::__construct($name, $age); // 调用父类构造函数
        $this->school = $school;
    }
    
    public function introduce() {
        return parent::introduce() . "我在{$this->school}学习。";
    }
    
    public function getSchool() {
        return $this->school;
    }
}

echo "\n=== 面向对象演示 ===\n";
$person = new Person("小明", 25);
$student = new Student("小红", 20, "北京大学");

echo $person->introduce() . "\n";
echo $student->introduce() . "\n";
echo "总共创建了 " . Person::getCount() . " 个人员对象\n";

// 5. 条件语句和循环
echo "\n=== 控制结构演示 ===\n";

$random_number = rand(1, 10);
echo "随机数: {$random_number}\n";

// if-elseif-else 语句
if ($random_number > 7) {
    echo "这是一个大数字!\n";
} elseif ($random_number > 4) {
    echo "这是一个中等数字。\n";
} else {
    echo "这是一个小数字。\n";
}

// switch 语句
switch ($random_number % 2) {
    case 0:
        echo "这是偶数\n";
        break;
    case 1:
        echo "这是奇数\n";
        break;
}

// for 循环
echo "数字1到5: ";
for ($i = 1; $i <= 5; $i++) {
    echo $i . " ";
}
echo "\n";

// while 循环
echo "倒计时: ";
$countdown = 5;
while ($countdown > 0) {
    echo $countdown . " ";
    $countdown--;
}
echo "发射!\n";

// 6. 字符串操作
echo "\n=== 字符串操作演示 ===\n";
$original_string = "  PHP Programming  ";
echo "原始字符串: '{$original_string}'\n";
echo "去除空格: '" . trim($original_string) . "'\n";
echo "转大写: '" . strtoupper(trim($original_string)) . "'\n";
echo "转小写: '" . strtolower(trim($original_string)) . "'\n";
echo "字符串长度: " . strlen(trim($original_string)) . "\n";
echo "替换字符串: '" . str_replace('PHP', 'Python', $original_string) . "'\n";

// 7. 数组高级操作
echo "\n=== 数组高级操作演示 ===\n";
$numbers = [1, 2, 3, 4, 5];

// array_map - 对数组每个元素应用函数
$squared = array_map(function($n) { return $n * $n; }, $numbers);
echo "平方数: " . implode(', ', $squared) . "\n";

// array_filter - 过滤数组元素
$even_numbers = array_filter($numbers, function($n) { return $n % 2 == 0; });
echo "偶数: " . implode(', ', $even_numbers) . "\n";

// array_reduce - 将数组归约为单个值
$sum = array_reduce($numbers, function($carry, $item) { return $carry + $item; }, 0);
echo "数组求和: {$sum}\n";

// 8. 异常处理
echo "\n=== 异常处理演示 ===\n";
try {
    $result = 10 / 2;
    echo "计算结果: {$result}\n";
    
    // 抛出自定义异常
    if ($result < 10) {
        throw new Exception("结果太小了!");
    }
} catch (DivisionByZeroError $e) {
    echo "除零错误: " . $e->getMessage() . "\n";
} catch (Exception $e) {
    echo "捕获异常: " . $e->getMessage() . "\n";
} finally {
    echo "计算完成(无论是否出错都会执行)\n";
}

// 9. 文件操作
echo "\n=== 文件操作演示 ===\n";
$filename = "temp_php_demo.txt";

try {
    // 写入文件
    $content = "这是PHP创建的临时文件\n当前时间: " . date('Y-m-d H:i:s') . "\n";
    file_put_contents($filename, $content);
    echo "文件已创建\n";
    
    // 读取文件
    if (file_exists($filename)) {
        $file_content = file_get_contents($filename);
        echo "文件内容:\n{$file_content}";
        
        // 删除文件
        unlink($filename);
        echo "临时文件已删除\n";
    }
} catch (Exception $e) {
    echo "文件操作出错: " . $e->getMessage() . "\n";
}

// 10. 正则表达式
echo "\n=== 正则表达式演示 ===\n";
$email = "user@example.com";
$pattern = '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';

if (preg_match($pattern, $email)) {
    echo "{$email} 是有效的邮箱地址\n";
} else {
    echo "{$email} 不是有效的邮箱地址\n";
}

// 11. JSON操作
echo "\n=== JSON操作演示 ===\n";
$data = [
    'name' => 'PHP项目',
    'version' => '1.0.0',
    'features' => ['Web开发', '数据库操作', 'API开发']
];

$json_string = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo "JSON编码:\n{$json_string}\n";

$decoded_data = json_decode($json_string, true);
echo "JSON解码 - 项目名称: " . $decoded_data['name'] . "\n";

// 12. 日期和时间操作
echo "\n=== 日期时间演示 ===\n";
$now = new DateTime();
echo "当前时间: " . $now->format('Y-m-d H:i:s') . "\n";

$future = new DateTime('+1 week');
echo "一周后: " . $future->format('Y-m-d H:i:s') . "\n";

$interval = $now->diff($future);
echo "时间差: " . $interval->days . " 天\n";

// 13. 超全局变量演示(在Web环境中更有意义)
echo "\n=== 超全局变量演示 ===\n";
echo "脚本名称: " . $_SERVER['SCRIPT_NAME'] . "\n";
echo "PHP版本: " . $_SERVER['PHP_SELF'] . "\n";

// 在命令行环境中,$_GET, $_POST, $_COOKIE 等Web相关的超全局变量为空
if (php_sapi_name() === 'cli') {
    echo "当前运行在命令行模式\n";
} else {
    echo "当前运行在Web服务器模式\n";
}

// 程序结束
echo "\n=== 程序执行完成 ===\n";
echo "恭喜!你已经成功运行了第一个PHP程序!\n";
echo "PHP的优势:简单易学、功能强大、社区活跃!\n";

// 14. PHP特色功能演示
echo "\n=== PHP特色功能演示 ===\n";

// 变量变量(Variable variables)
$var_name = 'message';
$$var_name = 'Hello from variable variable!';
echo "变量变量: {$message}\n";

// 魔术方法示例
class MagicExample {
    private $data = [];
    
    public function __set($name, $value) {
        $this->data[$name] = $value;
        echo "设置属性 {$name} = {$value}\n";
    }
    
    public function __get($name) {
        return $this->data[$name] ?? "属性 {$name} 不存在";
    }
    
    public function __toString() {
        return "MagicExample对象: " . json_encode($this->data);
    }
}

$magic = new MagicExample();
$magic->test = "魔术方法测试";
echo "获取属性: " . $magic->test . "\n";
echo "对象字符串: {$magic}\n";

// 匿名函数(闭包)
$multiplier = function($factor) {
    return function($number) use ($factor) {
        return $number * $factor;
    };
};

$double = $multiplier(2);
$triple = $multiplier(3);

echo "闭包演示: 5 * 2 = " . $double(5) . "\n";
echo "闭包演示: 5 * 3 = " . $triple(5) . "\n";

echo "\n" . str_repeat("=", 50) . "\n";
echo str_pad("PHP让Web开发变得简单!", 50, " ", STR_PAD_BOTH) . "\n";
echo str_repeat("=", 50) . "\n";

// 注意:在实际的Web开发中,通常不需要结束标签 ?>
// 如果文件末尾只有PHP代码,省略结束标签可以避免意外的空白输出

 

 

方法一:命令行运行

  1. 打开命令行

    • Windows:按 Win + R,输入 cmd 或 powershell
    • macOS:按 Cmd + Space,搜索 "Terminal"
    • Linux:按 Ctrl + Alt + T
  2. 导航到文件目录

    cd "C:\Users\21558\Documents\WeChat Files\wxid_nwercn4twf1c22\FileStorage\File\2025-06\cxx"
    
  3. 运行程序

    php hello.php
    

方法二:Web 服务器运行

  1. 启动内置Web服务器

    # 在项目目录中启动
    php -S localhost:8000
    
    # 指定文档根目录
    php -S localhost:8000 -t /path/to/your/project
    
  2. 访问程序

    • 在浏览器中访问:http://localhost:8000/hello.php

方法三:使用集成环境

  1. XAMPP/WAMP/MAMP
    • 将 hello.php 复制到 htdocs 目录
    • 启动 Apache 服务
    • 访问:http://localhost/hello.php

方法四:交互式运行

# 启动 PHP 交互式 shell
php -a

# 在交互式环境中执行代码
php > echo "Hello, World!";
Hello, World!
php > $name = "PHP";
php > echo "Hello, {$name}!";
Hello, PHP!
php > exit

PHP 程序结构详解

基本语法

<?php
// 1. PHP 开始和结束标签
// 标准标签:<?php ... ?>
// 短标签:<? ... ?>(不推荐)
// echo 标签:<?= $variable ?>(等同于 <?php echo $variable; ?>)

// 2. 注释
// 单行注释
# 也是单行注释
/* 多行注释
   可以跨越多行 */

// 3. 变量
$local_var = "局部变量";           // 局部变量
$GLOBALS['global_var'] = "全局变量"; // 全局变量
static $static_var = "静态变量";     // 静态变量

// 4. 常量
define('CONSTANT_NAME', 'constant value');
const ANOTHER_CONSTANT = 'another value';

// 5. 数据类型
$integer = 42;                    // 整数
$float = 3.14;                   // 浮点数
$string = "Hello World";         // 字符串
$boolean = true;                 // 布尔值
$array = [1, 2, 3];             // 数组
$object = new stdClass();        // 对象
$null = null;                    // NULL
$resource = fopen('file.txt', 'r'); // 资源

// 6. 字符串操作
$name = "PHP";
$version = 8.2;

// 字符串连接
$message = "Hello, " . $name . "!";
$message .= " Version: " . $version;

// 字符串插值(双引号)
$interpolated = "Hello, {$name}! Version: {$version}";
$simple_interpolation = "Hello, $name!";

// Heredoc 语法
$heredoc = <<<EOT
这是一个 Heredoc 字符串
可以包含变量:$name
可以跨越多行
EOT;

// Nowdoc 语法(类似单引号字符串)
$nowdoc = <<<'EOT'
这是一个 Nowdoc 字符串
不会解析变量:$name
EOT;
?>

数组操作

<?php
// 1. 索引数组
$fruits = ["apple", "banana", "orange"];
$fruits[] = "grape";              // 添加元素
array_push($fruits, "kiwi");      // 添加元素

// 2. 关联数组
$person = [
    'name' => 'John',
    'age' => 30,
    'city' => 'New York'
];
$person['email'] = 'john@example.com'; // 添加键值对

// 3. 多维数组
$matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

// 4. 数组函数
count($fruits);                   // 数组长度
in_array('apple', $fruits);      // 检查元素是否存在
array_key_exists('name', $person); // 检查键是否存在
array_merge($array1, $array2);   // 合并数组
array_slice($fruits, 1, 2);      // 数组切片
sort($fruits);                    // 排序

// 5. 数组遍历
foreach ($fruits as $fruit) {
    echo $fruit . "\n";
}

foreach ($person as $key => $value) {
    echo "{$key}: {$value}\n";
}
?>

函数定义

<?php
// 1. 基本函数
function greet($name) {
    return "Hello, {$name}!";
}

// 2. 默认参数
function greetWithTitle($name, $title = "Mr.") {
    return "Hello, {$title} {$name}!";
}

// 3. 类型声明(PHP 7+)
function add(int $a, int $b): int {
    return $a + $b;
}

// 4. 可变参数
function sum(...$numbers) {
    return array_sum($numbers);
}

// 5. 引用传递
function increment(&$value) {
    $value++;
}

// 6. 匿名函数(闭包)
$multiply = function($a, $b) {
    return $a * $b;
};

// 7. 箭头函数(PHP 7.4+)
$square = fn($x) => $x * $x;

// 8. 回调函数
function processArray($array, $callback) {
    return array_map($callback, $array);
}

$numbers = [1, 2, 3, 4, 5];
$squared = processArray($numbers, $square);
?>

面向对象编程

<?php
// 1. 类定义
class Vehicle {
    // 属性
    protected $brand;
    protected $model;
    private $year;
    public static $count = 0;
    
    // 常量
    const MAX_SPEED = 200;
    
    // 构造函数
    public function __construct($brand, $model, $year) {
        $this->brand = $brand;
        $this->model = $model;
        $this->year = $year;
        self::$count++;
    }
    
    // 公共方法
    public function getInfo() {
        return "{$this->brand} {$this->model} ({$this->year})";
    }
    
    // 受保护方法
    protected function startEngine() {
        return "Engine started";
    }
    
    // 私有方法
    private function validateYear($year) {
        return $year > 1900 && $year <= date('Y');
    }
    
    // 静态方法
    public static function getCount() {
        return self::$count;
    }
    
    // 魔术方法
    public function __toString() {
        return $this->getInfo();
    }
    
    public function __get($property) {
        if (property_exists($this, $property)) {
            return $this->$property;
        }
        return null;
    }
}

// 2. 继承
class Car extends Vehicle {
    private $doors;
    
    public function __construct($brand, $model, $year, $doors) {
        parent::__construct($brand, $model, $year);
        $this->doors = $doors;
    }
    
    public function getInfo() {
        return parent::getInfo() . " - {$this->doors} doors";
    }
    
    public function start() {
        return $this->startEngine() . " - Car is ready";
    }
}

// 3. 接口
interface Drivable {
    public function drive();
    public function stop();
}

// 4. 抽象类
abstract class AbstractVehicle {
    abstract public function move();
    
    public function honk() {
        return "Beep beep!";
    }
}

// 5. 特征(Trait)
trait GPS {
    public function getLocation() {
        return "Current location: 40.7128° N, 74.0060° W";
    }
}

class ModernCar extends Car implements Drivable {
    use GPS;
    
    public function drive() {
        return "Driving the car";
    }
    
    public function stop() {
        return "Car stopped";
    }
}
?>

错误和异常处理

<?php
// 1. 传统错误处理
function customErrorHandler($errno, $errstr, $errfile, $errline) {
    echo "Error: [{$errno}] {$errstr} in {$errfile} on line {$errline}\n";
}

set_error_handler('customErrorHandler');

// 2. 异常处理
try {
    $result = 10 / 0;
} catch (DivisionByZeroError $e) {
    echo "Division by zero: " . $e->getMessage();
} catch (Exception $e) {
    echo "General exception: " . $e->getMessage();
} finally {
    echo "This always executes";
}

// 3. 自定义异常
class CustomException extends Exception {
    public function errorMessage() {
        return "Custom error on line {$this->getLine()} in {$this->getFile()}: {$this->getMessage()}";
    }
}

function validateAge($age) {
    if ($age < 0) {
        throw new CustomException("Age cannot be negative");
    }
    return true;
}

try {
    validateAge(-5);
} catch (CustomException $e) {
    echo $e->errorMessage();
}
?>

包管理器 Composer

安装 Composer

Windows

# 下载并运行 Composer-Setup.exe
# 或者手动安装
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"

macOS/Linux

# 全局安装
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

# 或者使用 Homebrew(macOS)
brew install composer

Composer 基本命令

# 初始化项目
composer init

# 安装依赖
composer install

# 添加包
composer require vendor/package
composer require monolog/monolog
composer require --dev phpunit/phpunit

# 更新依赖
composer update
composer update vendor/package

# 移除包
composer remove vendor/package

# 查看已安装的包
composer show
composer show --installed

# 搜索包
composer search keyword

# 验证 composer.json
composer validate

# 优化自动加载
composer dump-autoload --optimize

composer.json 配置

{
    "name": "your-vendor/your-project",
    "description": "项目描述",
    "type": "project",
    "license": "MIT",
    "authors": [
        {
            "name": "Your Name",
            "email": "your.email@example.com"
        }
    ],
    "require": {
        "php": ">=8.0",
        "monolog/monolog": "^3.0",
        "guzzlehttp/guzzle": "^7.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^10.0",
        "squizlabs/php_codesniffer": "^3.7"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        },
        "files": [
            "src/helpers.php"
        ]
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "scripts": {
        "test": "phpunit",
        "cs-check": "phpcs",
        "cs-fix": "phpcbf"
    },
    "config": {
        "optimize-autoloader": true,
        "sort-packages": true
    }
}

常用 PHP 包推荐

# Web 框架
composer require laravel/laravel      # Laravel 框架
composer require symfony/symfony      # Symfony 框架
composer require slim/slim           # Slim 微框架

# 数据库
composer require doctrine/orm        # Doctrine ORM
composer require illuminate/database # Eloquent ORM
composer require cycle/orm          # Cycle ORM

# HTTP 客户端
composer require guzzlehttp/guzzle   # Guzzle HTTP 客户端
composer require symfony/http-client # Symfony HTTP 客户端

# 模板引擎
composer require twig/twig           # Twig 模板引擎
composer require smarty/smarty       # Smarty 模板引擎

# 日志
composer require monolog/monolog     # Monolog 日志库

# 测试
composer require --dev phpunit/phpunit    # PHPUnit 测试框架
composer require --dev pestphp/pest       # Pest 测试框架

# 代码质量
composer require --dev squizlabs/php_codesniffer  # 代码规范检查
composer require --dev phpstan/phpstan            # 静态分析
composer require --dev psalm/psalm                # 静态分析

# 工具库
composer require carbon/carbon       # 日期时间处理
composer require ramsey/uuid         # UUID 生成
composer require vlucas/phpdotenv    # 环境变量管理

Web 服务器配置

Apache 配置

.htaccess 文件

# 启用重写引擎
RewriteEngine On

# 隐藏 .php 扩展名
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^.]+)$ $1.php [NC,L]

# 重定向到 index.php(用于框架)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]

# 安全设置
<Files ".env">
    Order allow,deny
    Deny from all
</Files>

# 缓存设置
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 month"
    ExpiresByType image/png "access plus 1 year"
    ExpiresByType image/jpg "access plus 1 year"
    ExpiresByType image/jpeg "access plus 1 year"
</IfModule>

虚拟主机配置

<VirtualHost *:80>
    ServerName myproject.local
    DocumentRoot /path/to/your/project/public
    
    <Directory /path/to/your/project/public>
        AllowOverride All
        Require all granted
    </Directory>
    
    ErrorLog ${APACHE_LOG_DIR}/myproject_error.log
    CustomLog ${APACHE_LOG_DIR}/myproject_access.log combined
</VirtualHost>

Nginx 配置

server {
    listen 80;
    server_name myproject.local;
    root /path/to/your/project/public;
    index index.php index.html;
    
    # 日志
    access_log /var/log/nginx/myproject_access.log;
    error_log /var/log/nginx/myproject_error.log;
    
    # PHP 处理
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
    
    # 隐藏 .php 扩展名
    location / {
        try_files $uri $uri/ $uri.php?$query_string;
    }
    
    # 安全设置
    location ~ /\. {
        deny all;
    }
    
    location ~* \.(env|log)$ {
        deny all;
    }
    
    # 静态文件缓存
    location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}

PHP-FPM 配置

; /etc/php/8.2/fpm/pool.d/www.conf
[www]
user = www-data
group = www-data
listen = 127.0.0.1:9000
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.process_idle_timeout = 10s
pm.max_requests = 500

常见问题解决

1. 权限问题

问题:文件上传或写入权限不足

解决方案

# Linux/macOS
sudo chown -R www-data:www-data /path/to/project
sudo chmod -R 755 /path/to/project
sudo chmod -R 777 /path/to/project/storage  # 存储目录

# 或者使用 ACL
sudo setfacl -R -m u:www-data:rwx /path/to/project
sudo setfacl -R -d -m u:www-data:rwx /path/to/project

2. 内存限制问题

问题:Fatal error: Allowed memory size exhausted

解决方案

; 在 php.ini 中增加内存限制
memory_limit = 256M

; 或者在脚本中临时设置
ini_set('memory_limit', '256M');

3. 执行时间限制

问题:Maximum execution time exceeded

解决方案

; php.ini
max_execution_time = 300

; 或者在脚本中设置
set_time_limit(300);
ini_set('max_execution_time', 300);

4. 文件上传问题

问题:文件上传失败或大小限制

解决方案

; php.ini
file_uploads = On
upload_max_filesize = 50M
post_max_size = 50M
max_file_uploads = 20

5. 数据库连接问题

问题:无法连接到数据库

解决方案

// 检查扩展是否安装
if (!extension_loaded('mysqli')) {
    die('MySQLi extension not loaded');
}

// 使用 PDO 连接
try {
    $pdo = new PDO('mysql:host=localhost;dbname=test', $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die('Connection failed: ' . $e->getMessage());
}

6. 字符编码问题

问题:中文字符显示乱码

解决方案

// 设置字符编码
header('Content-Type: text/html; charset=utf-8');
mb_internal_encoding('UTF-8');

// 数据库连接时指定编码
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', $user, $pass);

7. 会话问题

问题:Session 无法启动或丢失

解决方案

// 检查会话配置
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

// 检查会话保存路径权限
echo session_save_path();

// 在 php.ini 中配置
session.save_path = "/tmp"
session.gc_maxlifetime = 1440

开发工具推荐

1. 集成开发环境(IDE)

PhpStorm(推荐)

  • JetBrains 出品的专业 PHP IDE
  • 强大的代码补全和重构功能
  • 内置调试器和版本控制
  • 支持框架和数据库
  • 付费软件,功能最全面

Visual Studio Code(免费推荐)

  • 免费、开源、轻量级
  • 丰富的 PHP 扩展
  • 内置终端和调试器
  • 强大的插件生态

推荐扩展:

  • PHP Intelephense
  • PHP Debug
  • PHP DocBlocker
  • Bracket Pair Colorizer
  • GitLens

Sublime Text

  • 轻量级、启动快速
  • 丰富的插件
  • 多光标编辑

Vim/Neovim

  • 高效的文本编辑器
  • 丰富的 PHP 插件
  • 适合命令行爱好者

2. 调试工具

Xdebug 配置

; php.ini
zend_extension=xdebug
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=127.0.0.1
xdebug.client_port=9003
xdebug.log=/tmp/xdebug.log

使用 var_dump 和 print_r

// 调试变量
$data = ['name' => 'John', 'age' => 30];
var_dump($data);
print_r($data);

// 格式化输出
echo '<pre>';
print_r($data);
echo '</pre>';

// 使用 Symfony VarDumper
composer require symfony/var-dumper
dump($data); // 更美观的输出

3. 代码质量工具

# PHP_CodeSniffer - 代码规范检查
composer require --dev squizlabs/php_codesniffer
./vendor/bin/phpcs --standard=PSR12 src/
./vendor/bin/phpcbf --standard=PSR12 src/  # 自动修复

# PHPStan - 静态分析
composer require --dev phpstan/phpstan
./vendor/bin/phpstan analyse src/

# Psalm - 静态分析
composer require --dev vimeo/psalm
./vendor/bin/psalm

# PHP-CS-Fixer - 代码格式化
composer require --dev friendsofphp/php-cs-fixer
./vendor/bin/php-cs-fixer fix src/

# PHPMD - 代码复杂度检测
composer require --dev phpmd/phpmd
./vendor/bin/phpmd src/ text cleancode,codesize,controversial,design,naming,unusedcode

4. 测试工具

# PHPUnit - 单元测试
composer require --dev phpunit/phpunit
./vendor/bin/phpunit tests/

# Pest - 现代测试框架
composer require --dev pestphp/pest
./vendor/bin/pest

# Codeception - 全栈测试
composer require --dev codeception/codeception
./vendor/bin/codecept run

5. 性能分析工具

# Blackfire - 性能分析
# 需要注册账号和安装探针

# XHProf - 性能分析
composer require perftools/xhgui

# Tideways - 性能监控
# 商业工具,提供详细的性能分析

进阶学习建议

1. 学习路径

基础阶段:

  1. PHP 基础语法和数据类型
  2. 控制结构和函数
  3. 数组和字符串操作
  4. 文件操作和表单处理

进阶阶段:

  1. 面向对象编程
  2. 数据库操作(PDO、MySQLi)
  3. 会话和 Cookie 管理
  4. 错误处理和调试

高级阶段:

  1. 设计模式在 PHP 中的应用
  2. 框架学习(Laravel、Symfony)
  3. API 开发和 RESTful 服务
  4. 性能优化和缓存策略

2. 实践项目

初级项目:

  • 简单的留言板
  • 用户注册登录系统
  • 文件上传管理器
  • 简单的博客系统

中级项目:

  • 内容管理系统(CMS)
  • 电商网站
  • RESTful API 服务
  • 实时聊天应用

高级项目:

  • 微服务架构应用
  • 高并发系统
  • 数据分析平台
  • 企业级应用

3. 学习资源

官方文档:

在线教程:

  • PHP 教程 - 菜鸟教程
  • W3Schools PHP 教程
  • Laracasts(Laravel 相关)
  • Codecourse

书籍推荐:

  • 《PHP 和 MySQL Web 开发》
  • 《现代 PHP》
  • 《PHP 核心技术与最佳实践》
  • 《Laravel 框架关键技术解析》

社区资源:

与其他语言对比

PHP vs JavaScript

特性PHPJavaScript
运行环境 服务器端 浏览器+服务器
类型系统 动态弱类型 动态弱类型
语法风格 C风格 C风格
Web开发 专为Web设计 全栈开发
学习曲线 平缓 中等
生态系统 Composer/Packagist npm
框架 Laravel/Symfony React/Vue/Angular

PHP vs Python

特性PHPPython
设计目的 Web开发 通用编程
语法 C风格 简洁优雅
Web框架 Laravel/Symfony Django/Flask
数据科学 有限支持 强大生态
部署 简单 中等
性能 中等 中等
学习难度 容易 容易

PHP vs Java

特性PHPJava
类型系统 动态类型 静态类型
编译 解释执行 编译+虚拟机
语法复杂度 简单 复杂
开发速度 快速 中等
性能 中等
企业应用 中小型 大型企业
学习成本

PHP vs Ruby

特性PHPRuby
设计哲学 实用主义 程序员幸福感
语法 C风格 自然语言风格
Web框架 Laravel Rails
性能 中等 中等
社区 庞大 活跃但较小
学习曲线 平缓 中等
元编程 有限 强大

PHP vs C#

特性PHPC#
平台 跨平台 跨平台(.NET)
类型系统 动态类型 静态类型
语法 简单灵活 结构化严格
Web开发 原生支持 ASP.NET
生态系统 Composer NuGet
企业支持 社区驱动 Microsoft支持
开发工具 多样化 Visual Studio

PHP vs Go

特性PHPGo
设计目的 Web开发 系统编程
类型系统 动态类型 静态类型
并发 有限支持 原生支持
编译 解释执行 编译型
部署 需要运行时 单文件部署
开发效率 中等
性能 中等

总结

PHP 是一种优秀的 Web 开发语言,特别适合:

  • Web 应用开发:从简单网站到复杂的Web应用
  • 内容管理系统:WordPress、Drupal等CMS
  • 电商平台:Magento、OpenCart等
  • API 开发:RESTful API、Web服务
  • 快速原型开发:快速验证想法和概念
  • 中小型项目:开发效率高,维护成本低

PHP 的优势

  1. 易学易用:语法简单,学习曲线平缓
  2. Web 优化:专为 Web 开发设计,内置丰富功能
  3. 跨平台:支持所有主流操作系统
  4. 开源免费:完全免费,无授权费用
  5. 丰富生态:大量的框架、库和工具
  6. 活跃社区:庞大的开发者社区和丰富资源
  7. 快速开发:从想法到产品的快速实现
  8. 灵活部署:支持多种部署方式

PHP 的特色

  1. 嵌入式语法:可以直接嵌入到 HTML 中
  2. 动态类型:灵活的变量类型系统
  3. 丰富的内置函数:大量的内置函数和扩展
  4. 数据库支持:原生支持多种数据库
  5. 会话管理:内置的会话和 Cookie 支持
  6. 错误处理:灵活的错误和异常处理机制

完整流程总结

  1. 安装 PHP:选择合适的安装方法(集成环境或独立安装)
  2. 验证安装php --version 和创建 phpinfo() 页面
  3. 编写程序:创建 .php 文件
  4. 运行程序php filename.php 或通过 Web 服务器
  5. 管理依赖:使用 Composer 管理第三方包
  6. 配置服务器:Apache/Nginx + PHP-FPM
  7. 开发调试:使用合适的 IDE 和调试工具
  8. 代码质量:使用 PHPStan、PHPCS 等工具
  9. 测试部署:编写测试并部署到生产环境

通过本指南,你应该能够成功安装 PHP 并开始你的 Web 开发之旅。PHP 的设计理念是让 Web 开发变得简单高效,希望你在学习和使用 PHP 的过程中能够体验到这种便利!

posted on 2025-06-16 07:44  GKLBB  阅读(37)  评论(0)    收藏  举报