PHP无法看到我的函数被重新声明的位置

时间:2014-01-13 16:15:03

标签: php

我收到此错误,无法找到重新声明该函数的位置。

  

致命错误:无法在C:\ Users \ Secret \ SkyDrive \ Sites e Projetos中重新声明gera_array()(之前在C:\ Users \ Secret \ SkyDrive \ Sites e Projetos \ Rede Aranha \ t4.php:12中声明) \ Rede Aranha \ t4.php在第10行

代码:

function gera_ecards() {

// Funcao gera array de 5 numeros de 1 a 50 (com duplicados)                
function gera_array() {
    $ecard_rand = array();
    for ($leo = 0; $leo < 5; $leo ++) {
        $ecard_random = mt_rand(1,50);
        array_push($ecard_rand, $ecard_random);
    }
    return $ecard_rand;
}                   
// Funcao remove duplicados da array            
function array_has_dupes($ecard_rand) {
       return count($ecard_rand) !== count(array_unique($ecard_rand));
}

do {
    $ecard_rand = gera_array();
} while (array_has_dupes($ecard_rand));     
sort($ecard_rand);  
$ecard_rand = implode(",", $ecard_rand);    
return $ecard_rand; 
}

for ($leo = 0; $leo < 5; $leo ++) {
 echo gera_ecards(); 
 echo "<br>";
}

5 个答案:

答案 0 :(得分:7)

你在函数内声明一个函数(为什么???):

function gera_ecards() {

  // Funcao gera array de 5 numeros de 1 a 50 (com duplicados)                
  function gera_array() {

    // ...

因此,每次调用gera_ecards()函数时,都会再次声明函数gera_array()

你不应该在函数中声明函数。

答案 1 :(得分:3)

根据the manualgera_ecards()中的函数声明在全局范围内执行,可以看作是conditional declaration

因此,两次调用gera_ecards()会尝试两次声明内部函数。

如果您不希望外部代码调用内部函数,您可以选择匿名函数:

$gera_array = function() {
    // ...
};

// Funcao remove duplicados da array            
$array_has_dupes = function($ecard_rand) {
    // ...
};

// etc.

否则,只需在gera_ecards()之外声明这两个内部函数。

<强>更新

考虑使用shuffle(),例如:

,而不是确保生成的数组没有任何重复项。
$heap = range(1, 50);
shuffle($heap);
foreach (array_chunk($heap, 5) as $block) {
    sort($block);
    echo join(",", $block), "\n";
}

答案 2 :(得分:1)

function gera_ecards() {

    function gera_array() { }
    function array_has_dupes() { }

}

每次致电gera_ecards()gera_array()时,都会尝试申报。对函数中声明的函数没有专用的私有作用域。它们都共享相同的命名空间。

  • 您可以将函数移到封闭函数之外,

    function gera_array() { }
    function gera_has_dupes() { }
    function gera_ecards() { }
    
  • 或开始编程object orientated并声明这两个函数private

    class Gera {
        private function has_dupes() { }
        private function geraArray() { }
        public function ecards() { }
    }
    
  • 或使用Closures(又名anonymous functions)。

    function gera_ecards() { 
    
        $has_dupes = function() { }
        $geraArray = function() { }
    
        $has_dupes();
        $geraArray();
    
    }
    

答案 3 :(得分:1)

jeroen

清楚地概述了错误的解释

要解决这个问题,请将这些功能分解为自己的功能并执行此操作:

<?php

// Funcao gera array de 5 numeros de 1 a 50 (com duplicados)                
function gera_array()
{
    $ecard_rand = array();
    for ($leo = 0; $leo < 5; $leo++) {
        $ecard_random = mt_rand(1, 50);
        array_push($ecard_rand, $ecard_random);
    }
    return $ecard_rand;
}

// Funcao remove duplicados da array            
function array_has_dupes($ecard_rand) {
    return count($ecard_rand) !== count(array_unique($ecard_rand));
}

function gera_ecards() {
    do {
        $ecard_rand = gera_array();
    } while (array_has_dupes($ecard_rand));
    sort($ecard_rand);
    $ecard_rand = implode(",", $ecard_rand);
    return $ecard_rand;
}

for ($leo = 0; $leo < 5; $leo++) {
    echo gera_ecards();
    echo "<br>";
}

?>

输出:

3,10,12,30,35
9,13,24,26,30
15,27,38,39,42
25,35,44,45,49
12,18,21,40,42

答案 4 :(得分:1)

不嵌套功能,开始编程OOP ...... 您可能有多个包含在同一个文件中。

同时

if (!function_exists('gera_array')) {
    function gera_array() { ... }
}