2010-07-09 6 views
1

PHP의 전역 선언을 사용하여 스크립트의 여러 함수에서 배열을 사용할 수 있도록하고 있습니다. 변수는 스크립트의 상단에 선언하고 사용하는 기능의 각 지구와 참조, 다음과 같이PHP 전역 선언

<?php 

$myarray = array(1, 2, 3); 

function print_my_array() { 
    global $myarray; 

    print '<ul>'; 
    foreach($myarray as $entry) { 
     print '<li>'.$entry.'</li>'; 
    } 
    print '</ul>'; 

    return 0; 
} 

print_my_array(); 

?> 

을 때때로, 항상은 아니지만, 배열은 함수가 호출 될 때 설정되어 있지 않습니다 foreach가 호출 될 때 오류가 발생합니다. 실제 코드에서 사용 된 배열은 매우 고유 한 이름을 가지므로 다른 것과 충돌을 일으키지 않아야합니다. 글로벌 선언을 잘못 사용하고 있습니까?

+0

배열의 문제를 반환하는 함수를 정의했습니다. 그 기능의 범위 내에서 배열을 보호하지만, 내가 원하는 곳에서 배열을 정의 할 수있었습니다. –

답변

4

아니요, 스 니펫이 정확합니다. 현재 가지고있는 문제는 전역 변수를 사용하는 문제입니다. 어디서나 (실수로) 액세스하고 변경할 수 있기 때문에 찾기 힘든 버그가 발생합니다.

+0

+1 설교, 형제 –

+0

일반적으로 나는 당신과 동의 하겠지만이 '글로벌 변수'는 실제로 한 곳에서 한 스크립트에만 사용되었습니다. 왜 그곳에 정의하는 것이 좋을까요? 그것은 스크립트의 맨 위에 가시적 인 지점에 정의 될 필요가 있었지만, 페이지 아래쪽에 묻힌 자리에서 사용되었습니다. 그것이 다른 곳에서 사용되거나 액세스되는 가능성이 없었기 때문에 여전히 질문에 답을 얻지 못했습니다. –

+0

다시 말하면 스 니펫이 정확합니다. 배열이 null 일 때가있는 유일한 방법은, 정의와 print_my_array의 호출의 사이에 발생하는 일이있는 경우입니다. – Artefacto

0

적어도 foreach를 실행하기 전에 배열이 함수의 맨 위에 null인지 확인하는 것이 좋습니다. 적어도 오류를 방지 할 수 있습니다 :

function print_my_array() { 
    global $myarray; 

    if(!empty($myarray)) { 
     print '<ul>'; 
     foreach($myarray as $entry) { 
      print '<li>'.$entry.'</li>'; 
     } 
     print '</ul>'; 
    } 
} 

또한 나는 그것을 지옥으로 돌려 보내지 않을 것입니다. 배열이 비어 있는지 여부를이 함수에서 반환하는 것에 통합하려고 할 수 있습니다.

+0

이것은 합리적인 일이지만, 나머지 스크립트가 작동하도록 배열을 정의해야합니다. 정의되지 않은 것은 옵션이 아닙니다. –

1

전역을 사용하면 꽤 많은 실수를 피할 수 있고 코드를 재사용 할 필요가 줄어 듭니다.

다음은 사이트에서 여러 번 재사용 할 수있는 기능의 예입니다.

$myarray = array(); 

을하고 값을 채우려면 클래스 생성자에서 그렇게 : (안된)

당신은 한마디로

<?php 
function arrayTags($items, $open = '<li>', $close = '</li>') 
{ 
    if (is_array($items) && count($items) != 0) 
    { 
     $output = null; 

     foreach ($items as $item) { 
      $output .= $open . $item . $close; 
     } 

     return $output; 
    } 
    else 
    { 
     return ''; 
    } 
} 

// Default, <li> 
echo '<ul>' . arrayTags($myarray) . '</ul>'; 

// or, spans: 
echo '<div id="container">' . arrayTags($myarray, '<span>', '</span>') . '</div>'; 
0
$myarray = array(1, 2, 3); 

만과 같이 선언합니다 :

public function __construct(){ 
    $myarray = array(1,2,3); 
} 

전문가,하지만 내 경험에 그것은 PHP는 클래스 내에서 함수 밖에서 함수 호출을 실행하는 것을 좋아하지 않는 것 같습니다.

본은 작동하지 않습니다

class MyClass { 
    public $mystring = myfunction(); 

    public function myFunction(){ 
     return true; //and your function code 
    } 
} 

그래서 당신은 배열을 사용하는 경우() 실제로 모든 함수 호출을 트리거하지 않습니다, 단지 형 배열의 빈 변수를지지합니다. array (1,2,3)를 사용할 때 함수처럼 'create array'를 효과적으로 실행해야합니다.

나는 성가신 것을 알고, 나는 다르다 싶다, 그러나 나는 당신이 PHP에서 원하는 것을하는 방법을 모른다. 내가 듣고 싶어하는 좋은 방법이 있다면 알려줘!

관련 문제