2010-05-30 4 views
0

global $a, $b, $c...과 같이 모든 함수의 변수를 모두 입력하지 않고 전역 변수로 만들 수 있습니까?모든 함수의 변수는 전역 변수입니다

+0

아야. 이는 안티 패턴이며, 변수를 함수/클래스에 명시 적으로 전달하는 것을 고려하십시오. – nuqqsa

+1

왜 그리고 어떤 시나리오에서 좀 더 자세한 정보를 제공 할 수 있습니까? 필자는 내 머리 속에서 글로벌 기능을 필요로하는 하나의 중심 기능을 왜 가지고 있는지 이해하려고 노력하고 있습니다. – allnightgrocery

+4

@Inkspeak : 다른 방법으로 http://thedailywtf.com/의 코드를 작성할 수 있습니까? –

답변

1

희망은 도움 등

완벽한 예 방법 기능으로 작동합니다. 물론, 당신이 이것을 필요로한다면, 당신은 그것을 잘못했을 가능성이 큽니다.

3

아니요. 어쨌든 그렇게하는 것이 끔찍한 일입니다.

+0

왜 끔찍한가요? 그것을 증명할 수 있습니까? 내 기능 하나면 이걸 필요해. –

+1

나머지 디자인은 짜증이 나기 때문에 필요합니다. 전역 변수 공간을 오염시키는 대신 개체에 필요한 모든 데이터를 캡슐화하는 방법은 무엇입니까? –

+0

Matti와 관련하여 위의 게시물과 같은 방법을 언급하고 있습니까? – RobertPitt

2

당신은 인수로 전달할 수 있으며, 다음은 global 키워드를 필요로하지 않습니다

function(&$a, &$b, &$c) 
{ 
// your code........ 
} 
+3

참조로 전달해야합니다. – Artefacto

+0

@Artefacto. 잘 했어. 그러나 IMO가 "매개 변수를 벗어나기"를 주장하는 것은 처음부터 전역을 사용하는 것보다 낫지 않습니다. 그리고 함수를 호출하는 행을 읽는다면 매개 변수가 함수에 의해 수정 될 수 있다는 힌트가 없다는 점에서 더 나쁜 것입니다. –

+0

@Juan Pablo Califano :이 점에 동의하고,이를 위해 빠르고 어렵게 글로벌 키워드를 사용해야합니다. – Sarfraz

4

과 같이, 응용 프로그램 내에서 정적 객체를 생성하고 해당 범위에 변수를 할당하는보십시오!

<?php 
/* 
    * Core class thats used to store objects of ease of access within difficult scopes 
*/ 
class Registry 
{ 
    /* 
     * @var array Holds all the main objects in an array a greater scope access 
     * @access private 
    */ 
    private static $objects = array(); 

    /** 
     * Add's an object into the the global 
     * @param string $name 
     * @param string $object 
     * @return bool 
    */ 
    public static function add($name,$object) 
    { 
     self::$objects[$name] = $object; 
     return true; 
    } 

    /* 
     * Get's an object out of the registry 
     * @param string $name 
     * @return object on success, false on failure 
    */ 
    public static function get($name) 
    { if(isset(self::$objects[$name])) 
     { 
      return self::$objects[$name]; 
     } 
     return false; 
    } 

    /** 
     * Removes an object out of Registry (Hardly used) 
     * @param string $name 
     * @return bool 
    */ 
    static function remove($name) 
    { 
     unset(self::$objects[$name]); 
     return true; 
    } 

    /** 
     * Checks if an object is stored within the registry 
     * @param string $name 
     * @return bool 
    */ 
    static function is_set($name) 
    { 
     return isset(self::$objects[$name]); 
    } 
} 
?> 

이 파일이 포함 된 첫 번째 파일 중 하나라는 점을 고려하면 개체/배열/변수/리소스/등을이 범위에 설정할 수 있습니다.

그래서 이것은 당신이 아니 다른 곳에서는 스크립트 내에서

... 
$database = new PDO($dns); 

Registry::add('Database',$database); 

$DBConfig = Registry::get('Database')->query('SELECT * FROM config_table')->fetchAll(PDO::FETCH_CLASS); 
Registry::add('Config',$DBConfig); 

추가하거나 항목을 검색 할 수 있습니다 사용 HWO, 당신은 단지 DB 연결을 만들었습니다 말할 수 있습니다.

Registry::get('ITEM_NEEDED');

으로이

function insertItem($keys,$values) 
{ 
    Registry::get('Database')->query('INSERT INTO items ('.implode(',',$keys).') VALUES ('.implode(',',$values).')'); 
} 

당신은 항상 $GLOBALS["var"] 대신 $var 사용할 수 있습니다

+1

나는 무례하다는 것을 의미하지는 않는다. 그러나 이것은 타이핑이 더 많이 걸리는 것을 제외하고는 전역 적 사용의 거의 모든 문제를 가지고있다. (이것은 OP의 주된 문제인 것 같다.) –

+0

이것은 내가하는 일을 선호하는 방법입니다. 더 좋은 해결책이 있다면 언제든지 자유롭게 게시하십시오. – RobertPitt

+0

괜찮습니다. 귀하의 답변은 완벽하게 유효합니다. 나는 방금 전 세계 국가에 의존하여 데이터를 전달하는 것이 문제가 될 수 있다는 것을 의미했습니다. 오히려 매개 변수와 반환 값을 사용하고 싶습니다. –

관련 문제