2009-07-31 2 views
2

이 같은 PHP에서 배열이 ','etc '=>'bla bla '));

"config"필드를 제외한 모든 필드의 변경을 허용하려면 스크립트에 따라이 어레이가 필요합니다. 배열이나 배열의 일부가 클래스 내부에서 private로 선언 된 것처럼 수정되지 않도록 보호하는 방법이 있습니까? 상수로 정의하려고 시도했지만 스크립트 실행 중 값 변경이 있습니다. 클래스로 구현하면 처음부터 전체 응용 프로그램을 다시 빌드해야합니다. S

감사합니다!

답변

5

난 당신이 사용하는 "순수" "진짜"배열 할 수 있다고 생각하지 않습니다.

ArrayInterface을 구현하는 클래스를 사용하고있을 수 있습니다. 당신은 코드를 배열을 사용하는 것처럼 보일 것입니다 ...하지만 그것은 실제로 일부 데이터에 대한 쓰기 액세스를 금지 할 수있는 접근 메소드를 사용하여 객체를 사용하게 될 것입니다 ...

물건(클래스 만들기, 인스턴스화); 하지만 모두는 아닙니다 : 액세스는 여전히 배열과 유사한 구문을 사용합니다. 이 같은


뭔가 (수동에서 적응) 트릭 을 할 수 있습니다

당신은 매우 배열과 같은 ...하지만하지 new을 가진 객체를 실체화해야
class obj implements arrayaccess { 
    private $container = array(); 
    public function __construct() { 
     $this->container = array(
      "one" => 1, 
      "two" => 2, 
      "three" => 3, 
     ); 
    } 
    public function offsetSet($offset, $value) { 
     if ($offset == 'one') { 
      throw new Exception('not allowed : ' . $offset); 
     } 
     $this->container[$offset] = $value; 
    } 
    public function offsetExists($offset) { 
     return isset($this->container[$offset]); 
    } 
    public function offsetUnset($offset) { 
     unset($this->container[$offset]); 
    } 
    public function offsetGet($offset) { 
     return isset($this->container[$offset]) ? $this->container[$offset] : null; 
    } 
} 


$a = new obj(); 

$a['two'] = 'glop'; // OK 
var_dump($a['two']); // string 'glop' (length=4) 

$a['one'] = 'boum'; // Exception: not allowed : one 

, 그 후에는 배열로 사용할 수 있습니다.


하고 "고정"속성에 쓰기를 시도 할 때, 당신은 예외를 던질 수있는, 또는 그런 일 - BTW, ForbiddenWriteException 같은 새로운 Exception 클래스를 선언하고, 더 나은 것 : 사람들을 잡을 수 있도록 할 구체적으로 :-)

+1

+1 이것이 내가하는 방법입니다. –

+0

+1 매우 똑똑! 나도 뭔가를 배웠다. :) – zombat

+0

나는 애플 리케이션의 구조 조정 때문에 클래스를 사용하는 것을 피하려고했지만 당신의 솔루션 인 파스칼을 받았다. 나는이 클래스를 사용할 때 큰 잠재적 이점을 발견했다. 대단히 감사합니다! – Juank

1

아니요, 불행히도 당신이 설명하는 것을 할 방법이 없습니다. 변수는 객체 내에 캡슐화되지 않는 한 public 또는 private 개념이 없습니다.

최상의 해결책은 유감스럽게도 구성을 개체 형식으로 다시 작업하는 것입니다. 개인 설정이 포함 된 배열 내에서 작은 객체를 사용할 수도 있습니다.이 객체는 배열의 해당 부분이 사용되는 위치에 따라 코드의 일부 위치 만 업데이트하면됩니다.

2

배열을 비공개로 만들고 누군가가 config 키를 덮어 쓰지 않는지 확인하는 내용을 수정하는 메서드를 만들 수 있습니다. 당신이 배열을 수정할 때

<?php 
    class MyClass { 
     private static $myArray = array(
      'config' => array(...), 
      'name' => ..., 
      ... 
     ); 

     public static function setMyArray($key, $value) { 
      if ($key != 'config') { 
       $this::myArray[$key] = $value; 
      } 
     } 
    } 

은 그럼 당신은 전화 :

MyClass::setMyArray('foo', 'bar'); // this will work 
MyClass::setMyArray('config', 'bar'); // this will be ignored 
+1

정확히 포스터가 피하려고하는 상황이 아닙니까? 그의 배열을 다시 수업으로 가져 가야하나요? – zombat

+0

그게 유일한 방법 일까 두렵습니다. 5 줄짜리 코드이기 때문에 노력할만한 가치가 있다고 생각합니다. – RaYell