• <day5>函数之术——封装法术的"神通"之术

    修炼心法:函数的奥秘

    在修真世界中,神通是将一系列法术动作封装成一个可重复使用的技能。而在 PHP 修炼中,函数正是实现这一目标的核心工具。

    一、函数基础:定义与调用

    1. 函数定义:创建你的第一个神通

    // 定义一个简单的函数
    function greet() {
        echo "欢迎来到 PHP 修真世界!\n";
    }
    
    // 调用函数
    greet(); // 输出:欢迎来到 PHP 修真世界!
    

    修真比喻:就像创造一个法术技能,定义好后可以随时施展。

    2. 带参数的函数:定制化的神通

    // 带参数的函数
    function greetWithName($name) {
        echo "你好,$name!欢迎来到 PHP 修真世界!\n";
    }
    
    // 调用函数并传入参数
    greetWithName("小明"); // 输出:你好,小明!欢迎来到 PHP 修真世界!
    greetWithName("小红"); // 输出:你好,小红!欢迎来到 PHP 修真世界!
    

    修真比喻:就像根据不同的对手施展不同的法术变体。

    3. 带返回值的函数:获取神通的结果

    // 带返回值的函数
    function calculateDamage($baseDamage, $multiplier) {
        $totalDamage = $baseDamage * $multiplier;
        return $totalDamage;
    }
    
    // 调用函数并获取结果
    $damage = calculateDamage(50, 1.5);
    echo "造成 $damage 点伤害!\n"; // 输出:造成 75 点伤害!
    

    修真比喻:就像施展法术后获得的效果数值。

    二、函数进阶:参数与作用域

    1. 默认参数:可选的神通参数

    // 带默认参数的函数
    function castSpell($spellName, $cost = 20) {
        echo "施展 $spellName,消耗 $cost 点气值\n";
    }
    
    // 调用函数
    castSpell("火球术"); // 使用默认气值 20
    castSpell("冰锥术", 25); // 指定气值 25
    

    修真比喻:就像法术有默认消耗,但可以调整。

    2. 可变参数:灵活的神通参数

    // 可变参数函数
    function calculateTotalDamage(...$damages) {
        $total = 0;
        foreach ($damages as $damage) {
            $total += $damage;
        }
        return $total;
    }
    
    // 调用函数
    $totalDamage = calculateTotalDamage(30, 45, 25, 60);
    echo "总伤害值:$totalDamage\n"; // 输出:总伤害值:160
    

    修真比喻:就像一次施展多个法术,计算总效果。

    3. 变量作用域:神通的施展范围

    // 全局变量 vs 局部变量
    $globalQi = 100; // 全局气值
    
    function practiceCultivation() {
        $localQi = 50; // 局部气值
        echo "函数内局部气值:$localQi\n";
        echo "函数内访问全局气值:$globalQi\n";
    }
    
    practiceCultivation();
    echo "函数外全局气值:$globalQi\n";
    // echo "函数外局部气值:$localQi"; // 错误!局部变量无法在函数外访问
    

    修真比喻:就像在修炼室内修炼(局部),与外界灵气(全局)的关系。

    三、高级函数技巧

    1. 匿名函数:即兴施展的神通

    // 匿名函数(闭包)
    $healFunction = function($health) {
        return $health + 20;
    };
    
    $currentHealth = 80;
    $newHealth = $healFunction($currentHealth);
    echo "治疗后生命值:$newHealth\n"; // 输出:治疗后生命值:100
    

    修真比喻:就像即兴施展的治疗法术,不需要命名。

    2. 回调函数:神通的组合技

    // 回调函数示例
    function applyEffect($value, $callback) {
        return $callback($value);
    }
    
    // 定义回调函数
    $double = function($x) { return $x * 2; };
    $increment = function($x) { return $x + 1; };
    
    $result = applyEffect(10, $double);
    echo "双倍效果:$result\n"; // 输出:双倍效果:20
    
    $result = applyEffect(10, $increment);
    echo "增加效果:$result\n"; // 输出:增加效果:11
    

    修真比喻:就像将多个法术组合成连招。

    3. 递归函数:自我循环的神通

    // 递归计算阶乘
    function factorial($n) {
        if ($n <= 1) {
            return 1;
        }
        return $n * factorial($n - 1);
    }
    
    $result = factorial(5);
    echo "5的阶乘是:$result\n"; // 输出:5的阶乘是:120
    

    修真比喻:就像法术自我循环增强,层层叠加。

    四、实战演练:修真技能系统

    让我们创建一个完整的修真技能系统:

    <?php
    // 修真技能系统
    class CultivationSkill {
        private $name;
        private $cost;
        private $damage;
        private $description;
        
        public function __construct($name, $cost, $damage, $description) {
            $this->name = $name;
            $this->cost = $cost;
            $this->damage = $damage;
            $this->description = $description;
        }
        
        public function cast($target) {
            echo "施展 {$this->name}!\n";
            echo "消耗 {$this->cost} 点气值\n";
            echo "对 $target 造成 {$this->damage} 点伤害\n";
            echo "效果:{$this->description}\n";
            return $this->damage;
        }
        
        public function getName() {
            return $this->name;
        }
    }
    
    // 创建技能实例
    $fireball = new CultivationSkill("火球术", 20, 50, "造成火焰伤害");
    $iceSpear = new CultivationSkill("冰矛术", 25, 60, "造成冰冻伤害并减速");
    $lightning = new CultivationSkill("雷电术", 30, 80, "造成雷电伤害");
    
    // 技能库
    $skillLibrary = [
        "火球术" => $fireball,
        "冰矛术" => $iceSpear,
        "雷电术" => $lightning
    ];
    
    // 使用技能函数
    function useSkill($skillName, $target, $skillLibrary) {
        if (isset($skillLibrary[$skillName])) {
            $skill = $skillLibrary[$skillName];
            return $skill->cast($target);
        } else {
            echo "未知技能:$skillName\n";
            return 0;
        }
    }
    
    // 战斗演示
    echo "=== 修真技能战斗演示 ===\n";
    useSkill("火球术", "妖兽", $skillLibrary);
    echo "---\n";
    useSkill("冰矛术", "妖兽", $skillLibrary);
    echo "---\n";
    useSkill("雷电术", "妖兽", $skillLibrary);
    
    // 技能组合函数
    function comboAttack($skills, $target, $skillLibrary) {
        $totalDamage = 0;
        echo "=== 连招攻击 ===\n";
        foreach ($skills as $skillName) {
            $damage = useSkill($skillName, $target, $skillLibrary);
            $totalDamage += $damage;
            echo "---\n";
        }
        echo "总伤害值:$totalDamage\n";
        return $totalDamage;
    }
    
    // 执行连招
    comboAttack(["火球术", "冰矛术", "雷电术"], "大妖兽", $skillLibrary);
    ?>
    

    五、函数使用要点总结

    1. 函数定义

      • 使用 function 关键字定义函数
      • 函数名应该有意义,描述函数的功能
      • 参数列表用括号包围,多个参数用逗号分隔
    2. 参数传递

      • 值传递:默认方式,函数内修改参数不影响外部变量
      • 引用传递:使用 & 符号,函数内修改会影响外部变量
    3. 返回值

      • 使用 return 语句返回结果
      • 函数可以返回任何类型的数据
      • 没有 return 语句的函数返回 null
    4. 作用域

      • 全局变量:在函数外定义,可以在函数内访问
      • 局部变量:在函数内定义,只能在函数内访问
      • 使用 global 关键字可以在函数内访问全局变量
    5. 高级技巧

      • 匿名函数:适合一次性使用的简单逻辑
      • 回调函数:实现灵活的函数组合
      • 递归函数:处理具有递归结构的问题

    六、今日修炼任务

    1. 创建一个计算伤害的函数,接受基础伤害和暴击倍率作为参数
    2. 创建一个治疗函数,返回治疗后的生命值(不能超过最大生命值)
    3. 创建一个技能类,包含名称、消耗、伤害和描述属性
    4. 使用回调函数实现一个技能冷却系统

    记住:函数是 PHP 修炼中的"神通"之术,熟练掌握它们,你就能构建更强大的修真系统!