【问题标题】:my php code runs, loads, but no outputs我的 php 代码运行,加载,但没有输出
【发布时间】:2018-08-06 18:00:49
【问题描述】:

我试图创建一个只生成许可证密钥的程序。这里是:

<?php

function gen_code_alpha()
{
    $alpha = '';

    for ($i = 0; $i <= 9; $i++) {
        $alpha .= $i;
    }

    // This attaches alphabets from 'a' to 'z' to our $alpha
    for ($i = 65; $i <= 122; $i++) {
        $alpha .= chr($i);
    }
}

function gen_code($len = 1)
{
    gen_code_alpha();
    global $alpha;

    $strlen = strlen($alpha);

    $code = '';
    for ($k = 0; $k < $len; $k++) {
        $i = $rand(0, $strlen -1);// now wanna randomly generate the code
        $code .= substr($alpha, $i, 1);
    }

    return $code;
}

function gen_license_key()
{
    $licenseKey = gen_code(4) . '-' .
                  gen_code(4) . '-' .
                  gen_code(4) . '-' .
                  gen_code(4) . '-' .
                  gen_code(2);
}

gen_license_key();
echo $licenseKey;

但是当我尝试运行它时,它没有显示任何输出。我是 PHP 新手,对调试不太了解,但我尝试了一些。我在代码中放了一些回声,我知道我的 $alpha 是在 gen_code_alpha() 函数中成功生成的。我还尝试在没有帮助的 gen_license_key() 函数中回显 $licenseKey。我没有发现更多。

那你怎么看?

【问题讨论】:

  • $licenseKey 是全局变量吗?
  • $licenseKey 不是正确的scoped
  • gen_license_key() 不返回任何内容。
  • 我还尝试在 gen_license_key() 函数中回显 $licenseKey,但没有帮助。
  • gen_license_key();不在变量中

标签: php debugging output modular-design


【解决方案1】:

你快到了,只需改变这个:

function gen_license_key()
{
    // return the result instead of assigning it to a local variable
    return gen_code(4) . '-' .
           gen_code(4) . '-' .
           gen_code(4) . '-' .
           gen_code(4) . '-' .
           gen_code(2);
}

然后你可以:

// show the key, do nothing else
echo gen_license_key();

// OR

// store the key in $licenseKey so you can do other stuff with it if needed
$licenseKey = gen_license_key();

// Now show the key
echo $licenseKey;

此外,在 gen_code_alpha() 函数中设置 global $alpha = '';,或者我强烈建议您遵循“返回”模式来编写函数。

【讨论】:

  • gen_license_key 在您的第二个解决方案中是否仍需要返回值?
  • 这个解决方案很棒,因为你想尽量避免污染global namespace
  • @BojanSrbinoski 很抱歉造成混乱。两种输出方法都需要将函数更改为使用return。查看我的更新。
  • @MonkeyZeus 这更有意义,但他的 gen_code_alpha() 函数没有返回值,所以这仍然不起作用。编辑:没关系,我只是注意到 global 关键字
  • @Amirali 使用我的回答作为修复其他功能的指南。不惜一切代价避免使用全局变量,因为它们是 PHP 的毒瘤。这不是代码审查;如果您犯了一次错误,请验证其余代码不会导致相同的问题。我不是你妈妈。
【解决方案2】:

这是完整的工作代码

请注意,您有一个错字(rand,而不是 $rand)

我还建议您更改代码以避免使用全局变量,这是一种不好的做法。

<?php

function gen_code_alpha()
{
    global $alpha;

    $alpha = '';

    for ($i = 0; $i <= 9; $i++) {
        $alpha .= $i;
    }

    // This attaches alphabets from 'a' to 'z' to our $alpha
    for ($i = 65; $i <= 122; $i++) {
        $alpha .= chr($i);
    }
}

function gen_code($len = 1)
{
    gen_code_alpha();
    global $alpha;

    $strlen = strlen($alpha);

    $code = '';
    for ($k = 0; $k < $len; $k++) {
        $i = rand(0, $strlen -1);// now wanna randomly generate the code
        $code .= substr($alpha, $i, 1);
    }

    return $code;
}

function gen_license_key()
{
    $licenseKey = gen_code(4) . '-' .
                gen_code(4) . '-' .
                gen_code(4) . '-' .
                gen_code(4) . '-' .
                gen_code(2);
    return $licenseKey;
}

$licenseKey = gen_license_key();
echo "l:".$licenseKey;

?>

输出:

 l:3X6D-gnQL-I0zJ-TRQD-Sq

【讨论】:

  • global $alpha 被定义了两次
  • @justadev 谢谢。我错误地将 $ 添加到 rand 函数的第一个。
【解决方案3】:

在函数内部定义的变量只存在于这些函数内部。您应该 return 函数中的值,而不是设置全局变量:

function gen_license_key()
{
    return gen_code(4) . '-' .
        gen_code(4) . '-' .
        gen_code(4) . '-' .
        gen_code(4) . '-' .
        gen_code(2);
}

然后你可以通过为你的函数返回的值分配一个变量来获得一个新值:

$licenseKey = gen_license_key();
echo $licenseKey;

【讨论】:

    【解决方案4】:

    如果你真的想走这条正确使用全局变量的道路,那么你必须先引用它们,如果你要分配它们,则要尽早引用它们。此外,由于您似乎没有在这些函数之外使用$alpha,因此只需返回这些值并避免global namespace 污染。

    您还有一个错字,其中$rand 不是变量名,而是函数rand(),已更正。

    <?php
    function gen_code_alpha()
    {
        $alpha = '';
    
        for ($i = 0; $i <= 9; $i++) {
            $alpha .= $i;
        }
    
        // This attaches alphabets from 'a' to 'z' to our $alpha
        for ($i = 65; $i <= 122; $i++) {
            $alpha .= chr($i);
        }
        return $alpha;
    }
    
    function gen_code($len = 1)
    {
        $alpha = gen_code_alpha();
    
        $strlen = strlen($alpha);
    
        $code = '';
        for ($k = 0; $k < $len; $k++) {
            $i = rand(0, $strlen -1);// now wanna randomly generate the code
            $code .= substr($alpha, $i, 1);
        }
    
        return $code;
    }
    
    function gen_license_key()
    {
        global $licenseKey;
        $licenseKey = gen_code(4) . '-' .
                      gen_code(4) . '-' .
                      gen_code(4) . '-' .
                      gen_code(4) . '-' .
                      gen_code(2);
    }
    
    gen_license_key();
    echo $licenseKey;
    ?>
    

    Try it Online! (Demo)

    【讨论】:

      【解决方案5】:
      <?php
      
      function gen_code_alpha()
      {
          $alpha = '';
      
          for ($i = 0; $i <= 9; $i++) {
              $alpha .= $i;
          }
      
          // This attaches alphabets from 'a' to 'z' to our $alpha
          for ($i = 65; $i <= 122; $i++) {
              $alpha .= chr($i);
          }
      }
      
      function gen_code($len = 1)
      {
          gen_code_alpha();
          global $alpha;
      
          $strlen = strlen($alpha);
      
          $code = '';
          for ($k = 0; $k < $len; $k++) {
              $i = rand(0, $strlen -1);// now wanna randomly generate the code
              $code .= substr($alpha, $i, 1);
          }
      
          return $code;
      }
      
      function gen_license_key()
      {
          $licenseKey = gen_code(4) . '-' .
                          gen_code(4) . '-' .
                          gen_code(4) . '-' .
                          gen_code(4) . '-' .
                          gen_code(2);
      return $licenseKey;
      }
      
      $licenseKey = gen_license_key();
      echo $licenseKey;
      ?>
      

      我们需要在函数中返回一个变量,而且$rand不是一个变量rand()是一个函数。

      【讨论】:

      • 请解释您的代码中的差异。您提供了一个纯代码的答案,这令人沮丧,因为它无助于其他人理解您的思维过程或推理为什么这是一个很好的问题答案。
      • 请检查最后一行,我也会在评论中解释错误
      • 我最初没有向下滚动查看文本,因为我认为代码块中的所有内容都是代码。我修正了你的答案以更准确地反映这一点。
      • 我是堆栈溢出的新手,我会努力提高自己以使 cmets 更易于理解。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多