ZetCode

PHP 代码块

最后修改日期:2025 年 5 月 17 日

PHP 使用花括号 {} 来定义代码块,以组织程序结构。这些代码块为变量和控制流程创建了不同的作用域。正确使用代码块对于编写清晰、可维护的 PHP 代码至关重要。

基本代码块

PHP 代码块使用花括号在函数、条件语句和循环等结构下创建。代码块决定了变量的作用域和代码的执行。

basic_blocks.php
<?php

declare(strict_types=1);

// Function with a code block
function calculateTotal($price, $quantity) {
    $subtotal = $price * $quantity;
    $tax = $subtotal * 0.08;
    return $subtotal + $tax;
}

echo "Total: " . number_format(calculateTotal(25.99, 3), 2) . "\n";

// Conditional with blocks
function checkNumber($n) {
    if ($n > 0) {
        echo "Positive number\n";
        echo "Double: " . ($n * 2) . "\n";
    } else {
        echo "Non-positive number\n";
        echo "Absolute: " . abs($n) . "\n";
    }
}

checkNumber(5);
checkNumber(-3);

这展示了函数和条件语句中的基本 PHP 代码块。花括号内的所有语句都属于同一个代码块。在代码块内声明的变量具有局部作用域。

λ php basic_blocks.php
Total: 84.21
Positive number
Double: 10
Non-positive number
Absolute: 3

嵌套代码块

代码块可以通过将代码块放置在其他代码块内来进行嵌套。每个嵌套级别创建一个新的作用域,同时保持对外部作用域的访问。

nested_blocks.php
<?php

declare(strict_types=1);

function analyzeNumbers($numbers) {
    if (empty($numbers)) {
        echo "No numbers to analyze\n";
    } else {
        echo "Number count: " . count($numbers) . "\n";
        
        $evens = array_filter($numbers, function($x) { 
            return $x % 2 == 0; 
        });
        $odds = array_filter($numbers, function($x) { 
            return $x % 2 != 0; 
        });
        
        echo "Even numbers: " . implode(', ', $evens) . "\n";
        echo "Odd numbers: " . implode(', ', $odds) . "\n";
        
        if (!empty($evens)) {
            echo "Even stats:\n";
            echo "  Min: " . min($evens) . "\n";
            echo "  Max: " . max($evens) . "\n";
        }
        
        if (!empty($odds)) {
            echo "Odd stats:\n";
            echo "  Min: " . min($odds) . "\n";
            echo "  Max: " . max($odds) . "\n";
        }
    }
}

analyzeNumbers(range(1, 10));

此示例展示了多层嵌套的代码块。外部函数代码块包含条件代码块,而条件代码块本身又包含额外的代码块。每个级别都用自己的一组花括号标记。

λ php nested_blocks.php
Number count: 10
Even numbers: 2, 4, 6, 8, 10
Odd numbers: 1, 3, 5, 7, 9
Even stats:
  Min: 2
  Max: 10
Odd stats:
  Min: 1
  Max: 9

代码块中的变量作用域

PHP 具有函数级作用域,用于变量。在代码块中声明的变量可以在整个函数中访问,除非在单独的函数或类方法中。

variable_scope.php
<?php

declare(strict_types=1);

function processUser($user) {
    $isValid = !empty($user['name']) && $user['age'] > 0;
    
    if ($isValid) {
        $greeting = $user['age'] >= 18 
            ? "Hello, " . $user['name'] 
            : "Hi, " . $user['name'] . " (minor)";
        
        echo $greeting . "\n";
        
        $accountType = match(true) {
            $user['age'] >= 65 => "Senior",
            $user['age'] >= 18 => "Adult",
            default => "Junior"
        };
        
        echo "Account type: $accountType\n";
    } else {
        echo "Invalid user data\n";
    }
}

processUser(['name' => 'Alice', 'age' => 30]);
processUser(['name' => '', 'age' => 15]);

这演示了 PHP 代码块中的变量作用域。在代码块中声明的变量可以在整个函数中访问,但不能在函数外部访问。$greeting 和 $accountType 变量在它们的代码块之后可用。

λ php variable_scope.php
Hello, Alice
Account type: Adult
Invalid user data

控制结构

PHP 的控制结构,如循环和 switch 语句,使用代码块来组织它们的执行逻辑。这些结构遵循相同的基于花括号的作用域规则。

control_structures.php
<?php

declare(strict_types=1);

function printMultiples($n, $max) {
    $i = 1;
    while ($i <= $max) {
        if ($i % $n == 0) {
            echo "$i is a multiple of $n\n";
            
            switch ($i) {
                case $n:
                    echo "  (first multiple)\n";
                    break;
                case $n * 2:
                    echo "  (second multiple)\n";
                    break;
                default:
                    echo "  (higher multiple)\n";
            }
        }
        $i++;
    }
}

printMultiples(3, 10);

这展示了 while 循环、if 条件和 switch 语句中的代码块。每个控制结构使用花括号来定义其代码块作用域,变量可以在整个函数中访问。

λ php control_structures.php
3 is a multiple of 3
  (first multiple)
6 is a multiple of 3
  (second multiple)
9 is a multiple of 3
  (higher multiple)

类和方法代码块

PHP 类和方法使用代码块来定义它们的结构。类属性和方法在类代码块中限定作用域。

class_blocks.php
<?php

declare(strict_types=1);

class Person {

    private $name;
    private $age;
    
    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }
    
    public function greet() {
        echo "Hello, my name is {$this->name}\n";
    }
    
    public function isAdult() {
        return $this->age >= 18;
    }
}

$p = new Person('Alice', 30);
$p->greet();
echo $p->isAdult() ? "Adult\n" : "Not adult\n";

这演示了 PHP 中的类和方法代码块。类代码块包含属性声明和方法定义,每个都有自己的代码块。$this 变量提供对类成员的访问。

λ php class_blocks.php
Hello, my name is Alice
Adult

匿名函数

PHP 支持匿名函数(闭包),它们创建自己的作用域。它们可以使用 use 关键字从父作用域捕获变量。

anonymous_functions.php
<?php

declare(strict_types=1);

function createMultiplier($factor) {
    return function($n) use ($factor) {
        return $n * $factor;
    };
}

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

echo "Double of 5: " . $double(5) . "\n";
echo "Triple of 5: " . $triple(5) . "\n";

// Immediately-invoked function expression
$result = (function($x, $y) {
    $sum = $x + $y;
    return $sum * 2;
})(3, 4);

echo "IIFE result: $result\n";

这些示例展示了匿名函数创建自己的作用域。 use 关键字从父作用域捕获变量。IIFE(立即调用函数表达式)立即执行它们自己的代码块作用域。

λ php anonymous_functions.php
Double of 5: 10
Triple of 5: 15
IIFE result: 14

最佳实践

一致的花括号风格和缩进可以提高 PHP 代码的可读性。遵循这些实践可以获得清晰、可维护的代码块。

best_practices.php
<?php

declare(strict_types=1);

// Good practices example
class Calculator {
    // Allman style braces
    public static function calculate($x, $y) 
    {
        $intermediate = self::computeIntermediate($x, $y);
        
        if ($intermediate > 100) 
        {
            echo "Large result\n";
            return $intermediate / 10;
        } 
        else 
        {
            echo "Normal result\n";
            return $intermediate;
        }
    }
    
    private static function computeIntermediate($a, $b) 
    {
        return ($a * 2) + ($b * 3);
    }
}

// Keep blocks focused
function processData($data) 
{
    $cleanData = array_filter($data, function($x) {
        return $x > 0;
    });
    
    $processed = array_map(function($x) {
        return $x * 2;
    }, $cleanData);
    
    return [
        'sum' => array_sum($processed),
        'avg' => array_sum($processed) / count($processed)
    ];
}

// Avoid deep nesting
// Use consistent indentation (4 spaces)
// Keep block sizes reasonable

此示例演示了良好的实践:一致的花括号风格、集中的代码块和清晰的组织。该类展示了结构良好的 PHP 代码。

PHP 代码块通过花括号分隔的作用域提供清晰的结构。通过理解代码块作用域并遵循一致的实践,您可以编写既有条理又可维护的 PHP 代码。正确使用代码块使控制流和变量作用域一目了然。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出 所有 PHP 教程