2011-06-11 9 views
0

PHP에서 데이터 캡슐화에 대한 기사를 읽었으며 작성자는 이것이 실제로 가능할 지 궁금해하게 만들었습니다. 여기 그가 말한 것이 있습니다.PHP에서 함수 내부에있는 로컬 변수의 값을 변경할 수 있습니까?

캡슐화 (범위)의 주요 목적은 파괴 할 수없는 코드를 작성할 수 있도록하는 것입니다. 숫자를 통과하고를 반환하려면이 함수의 목적은

function xyz ($x) { 
    $y = 1; 
    while ($y <= 10) { 
    $array[] = $y * $x; 
    $y++; 
    } 
    return $array; 
} 

:이 은 일반적으로 범위를 적용, 그래서 나 함수 내에서 로컬 변수의 간단한 예제를 사용 하자 정렬. 예제 코드는 매우 기본입니다. 함수 xyz()가 신뢰할 수있는 으로 정렬하려면 을 매번 정확하게 똑같은 것을 수행해야합니다. 그래서 누군가 외부에서 의 능력을 가지고 있다면 그 초기의 값은 $ y 또는 $ array로 바뀌었을까요? 심지어 $ x? 외부에서이 작업을 수행 할 수있는 경우 반환 기능을 더 이상 보장 할 수 없습니다.

이제 위의 설명처럼 인수를 사용하지 않고도 함수 내부에 앉아있는 지역 변수의 값을 변경할 수 있습니까? 가능하다면 어떻게해야합니까? 그들은 모든 함수의 내부에 선언하고 있기 때문에

, 당신은 변수를 변경 할 수 없을 것입니다 예를 들어

+0

아니요, 인용 부호로 된 텍스트가 말하는 것과 정확히 같습니다. 그렇게 할 수 있다면 코드를 깨뜨릴 가능성이 높습니다. "그 기능이 무엇을 반환하는지 더 이상 보장 할 수 없습니다." – netcoder

답변

2

.. 감사합니다.

하지만 공개 클래스 변수가있는 클래스가 있다면 원하는 경우 클래스 외부에서 변경할 수 있습니다. (그건 나쁜 형태이고, 많은 것들을 망칠 수 있습니다.)

+0

아아 나는 그 점을 본다. 이것은 클래스 메소드와 속성에 대해 의미가 있습니다. –

0

마술 세터 방법 (__set ($ key, $ value))을 추가하고 그것을 액세스 할 수있는 방법으로 구성하지 않는 한 내부 회원, 그렇다면 아니오. 어떤 형태의 팩토리를 사용하는 경우 함수를 만들 때 키를 변경할 수 있지만 공개하지 않으면 다른 방법이 없습니다.

가시적 인 유일한 예외는 싱글 톤 팩토리가 될 것입니다. 다른 매개 변수 (다른 곳에서는 변경)로 싱글 톤 메소드의 새 인스턴스를 만들 수는 있지만 메서드로 그렇게 할 가능성은 거의 없습니다.

+0

이 클래스는 클래스와는 아무런 관련이 없습니다 (적어도 예제와 함께). 이 경우에도 메서드 내에서 선언 된 지역 변수는 예외없이 외부에서 액세스 할 수 없습니다. – netcoder

+0

Magic Methods __set 및 __get을 사용합니다. 외부의 모든 사람을 수정하여 모든 값에 액세스 할 수 있습니다. 클래스 메서드 및 속성에 대한 직접 액세스를 제한하는 것에 대해 이해합니다. 여기서는 일반적으로 함수를 언급했습니다. 클래스 메소드 나 속성이 아닙니다. 아직도 그 설명을 해줘서 고맙습니다. :) –

+0

Ack, yeah, true @netcoder, 내가 무슨 생각을 한거야? –

관련 문제