PHP의 정적 속성에 대한 Magic __getgetter
public static function __get($value)
작동하지 않으며, 작동했더라도 같은 클래스의 인스턴스 속성에 대한 마법 __getgetter가 이미 필요합니다.
이것은 아마도 예 또는 아니오 질문일 것입니다, 그래서 가능합니까?
아니요, 불가능합니다.
__get의 매뉴얼 페이지를 인용합니다.
멤버 오버로드는 개체 컨텍스트에서만 작동합니다.이러한 마법 방법은 정적 컨텍스트에서 트리거되지 않습니다.따라서 이러한 메서드는 정적으로 선언할 수 없습니다.
PHP 5.3에는 추가되었지만, 이 기능은 없습니다.__getStatic
도 아니다__setStatic
하지만; 비록 그것들을 가지고 있거나 가지고 있다는 생각이 종종 php internal@mailing-list에 다시 오더라도.
의견 요청도 있습니다. PHP용 정적 클래스
그러나 아직 구현되지 않았습니다(아직?).
아마도 누군가는 여전히 이것을 필요로 할 것입니다.
static public function __callStatic($method, $args) {
if (preg_match('/^([gs]et)([A-Z])(.*)$/', $method, $match)) {
$reflector = new \ReflectionClass(__CLASS__);
$property = strtolower($match[2]). $match[3];
if ($reflector->hasProperty($property)) {
$property = $reflector->getProperty($property);
switch($match[1]) {
case 'get': return $property->getValue();
case 'set': return $property->setValue($args[0]);
}
} else throw new InvalidArgumentException("Property {$property} doesn't exist");
}
}
아주 멋진 mbrzuchalski.하지만 그것은 공공 변수에만 효과가 있는 것 같습니다.스위치를 다음으로 변경하여 개인/보호된 스위치에 액세스할 수 있도록 합니다.
switch($match[1]) {
case 'get': return self::${$property->name};
case 'set': return self::${$property->name} = $args[0];
}
그리고 당신은 아마도 그것을 바꾸고 싶을 것입니다.if
접근 가능한 변수를 제한하기 위한 문장, 그렇지 않으면 비공개 또는 보호를 받는 목적을 위반할 수 있습니다.
if ($reflector->hasProperty($property) && in_array($property, array("allowedBVariable1", "allowedVariable2"))) {...)
예를 들어, SSH 모듈을 사용하여 원격 서버에서 다양한 데이터를 추출하도록 설계된 클래스가 있는데, 이 클래스는 대상 디렉토리가 어떤 서버를 참조하도록 요청받는지를 기반으로 특정 가정을 구성하기를 원합니다.mbrzuchalski의 방법을 수정한 것이 그것에 완벽합니다.
static public function __callStatic($method, $args) {
if (preg_match('/^([gs]et)([A-Z])(.*)$/', $method, $match)) {
$reflector = new \ReflectionClass(__CLASS__);
$property = strtolower($match[2]). $match[3];
if ($reflector->hasProperty($property)) {
if ($property == "server") {
$property = $reflector->getProperty($property);
switch($match[1]) {
case 'set':
self::${$property->name} = $args[0];
if ($args[0] == "server1") self::$targetDir = "/mnt/source/";
elseif($args[0] == "server2") self::$targetDir = "/source/";
else self::$targetDir = "/";
case 'get': return self::${$property->name};
}
} else throw new InvalidArgumentException("Property {$property} is not publicly accessible.");
} else throw new InvalidArgumentException("Property {$property} doesn't exist.");
}
}
사용해 보십시오.
class nameClass{
private static $_sData = [];
private static $object = null;
private $_oData = [];
public function __construct($data=[]){
$this->_oData = $data;
}
public static function setData($data=[]){
self::$_sData = $data;
}
public static function Data(){
if( empty( self::$object ) ){
self::$object = new self( self::$_sData );
}
return self::$object;
}
public function __get($key) {
if( isset($this->_oData[$key] ){
return $this->_oData[$key];
}
}
public function __set($key, $value) {
$this->_oData[$key] = $value;
}
}
nameClass::setData([
'data1'=>'val1',
'data2'=>'val2',
'data3'=>'val3',
'datan'=>'valn'
]);
nameClass::Data()->data1 = 'newValue';
echo(nameClass::Data()->data1);
echo(nameClass::Data()->data2);
결합__callStatic
그리고.call_user_func
또는call_user_func_array
PHP 클래스의 정적 속성에 대한 액세스를 제공할 수 있습니다.
예:
class myClass {
private static $instance;
public function __construct() {
if (!self::$instance) {
self::$instance = $this;
}
return self::$instance;
}
public static function __callStatic($method, $args) {
if (!self::$instance) {
new self();
}
if (substr($method, 0, 1) == '$') {
$method = substr($method, 1);
}
if ($method == 'instance') {
return self::$instance;
} elseif ($method == 'not_exist') {
echo "Not implemented\n";
}
}
public function myFunc() {
echo "myFunc()\n";
}
}
// Getting $instance
$instance = call_user_func('myClass::$instance');
$instance->myFunc();
// Access to undeclared
call_user_func('myClass::$not_exist');
또한 __get()을 사용하여 멤버 속성처럼 정적 속성에 액세스할 수 있습니다.
class ClassName {
private static $data = 'smth';
function __get($field){
if (isset($this->$field)){
return $this->$field;
}
if(isset(self::$$field)){
return self::$$field; // here you can get value of static property
}
return NULL;
}
}
$obj = new ClassName();
echo $obj->data; // "smth"
언급URL : https://stackoverflow.com/questions/1279382/magic-get-getter-for-static-properties-in-php
'programing' 카테고리의 다른 글
인쇄 호출을 차단하는 방법 (0) | 2023.07.31 |
---|---|
응답으로 Node.js 파일 전송 (0) | 2023.07.26 |
이 mysql 오류 코드 #1089가 계속 표시됩니다. (0) | 2023.07.26 |
PDO 준비문은 얼마나 안전합니까? (0) | 2023.07.26 |
평판에 기반한 권한 구현 (0) | 2023.07.26 |