이 같은 PHP에서 배열이 ','etc '=>'bla bla '));
"config"필드를 제외한 모든 필드의 변경을 허용하려면 스크립트에 따라이 어레이가 필요합니다. 배열이나 배열의 일부가 클래스 내부에서 private로 선언 된 것처럼 수정되지 않도록 보호하는 방법이 있습니까? 상수로 정의하려고 시도했지만 스크립트 실행 중 값 변경이 있습니다. 클래스로 구현하면 처음부터 전체 응용 프로그램을 다시 빌드해야합니다. S
감사합니다!
이 같은 PHP에서 배열이 ','etc '=>'bla bla '));
"config"필드를 제외한 모든 필드의 변경을 허용하려면 스크립트에 따라이 어레이가 필요합니다. 배열이나 배열의 일부가 클래스 내부에서 private로 선언 된 것처럼 수정되지 않도록 보호하는 방법이 있습니까? 상수로 정의하려고 시도했지만 스크립트 실행 중 값 변경이 있습니다. 클래스로 구현하면 처음부터 전체 응용 프로그램을 다시 빌드해야합니다. S
감사합니다!
난 당신이 사용하는 "순수" "진짜"배열 할 수 있다고 생각하지 않습니다.
은 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
, 그 후에는 배열로 사용할 수 있습니다.
ForbiddenWriteException
같은 새로운
Exception
클래스를 선언하고, 더 나은 것 : 사람들을 잡을 수 있도록 할 구체적으로
:-)
아니요, 불행히도 당신이 설명하는 것을 할 방법이 없습니다. 변수는 객체 내에 캡슐화되지 않는 한 public 또는 private 개념이 없습니다.
최상의 해결책은 유감스럽게도 구성을 개체 형식으로 다시 작업하는 것입니다. 개인 설정이 포함 된 배열 내에서 작은 객체를 사용할 수도 있습니다.이 객체는 배열의 해당 부분이 사용되는 위치에 따라 코드의 일부 위치 만 업데이트하면됩니다.
배열을 비공개로 만들고 누군가가 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 이것이 내가하는 방법입니다. –
+1 매우 똑똑! 나도 뭔가를 배웠다. :) – zombat
나는 애플 리케이션의 구조 조정 때문에 클래스를 사용하는 것을 피하려고했지만 당신의 솔루션 인 파스칼을 받았다. 나는이 클래스를 사용할 때 큰 잠재적 이점을 발견했다. 대단히 감사합니다! – Juank