간단히 말해서, 아니오.
__get()
및 __set()
은 인스턴스 메소드입니다. 그들은 본질적으로 인스턴스 인 stdClass()
을 구성하는 함수입니다.
정적 콘텐츠를이 방식으로 설정해야하는 경우 클래스에 stdClass 매개 변수와 마술처럼 설정하고 데이터를 가져올 수있는 단일 구조를 제공 할 수 있습니다. 예를 들어
:
class UserData {
protected static $_instance;
protected $_data = array();
public static function get_instance() {
static $initialized = FALSE;
if (! $initialized) {
self::$_instance = new UserData;
$initialized = TRUE;
}
return self::$_instance;
}
public function __get($var) {
$self = self::get_instance();
return isset($self->_data[$var]) ? $self->_data[$var] : NULL;
}
public function __set($var, $val) {
$self = self::get_instance();
$self->_data[$var] = $val;
}
}
그런 다음 당신은 갈 수있다 : 그들은 무의미하기 때문에
$UserData =& UserData::get_instance();
$UserData->var = 'val';
echo $UserData->var; // prints 'val'
그러나 나는 PHP에서 싱글 톤을 사용하지 않는 것이 좋습니다. 왜 Best practice on PHP singleton classes 게시물에 몇 가지 이유를 읽을 수 있습니다.
정적 클래스 또는 인스턴스 클래스를 사용하십시오.
매직 게터 및 설정자는 바로 가기입니다. 일반 setter 및 getter에서 동일한 동작을 구현할 수 있습니다. 아래의 예는 동일한 기능을 제공하지만 의도는 훨씬 더 분명하다 : 위의 코드 $ ID를 쓸 수 없습니다 얼마나
class UserData {
protected $id, $name, $login;
public static function set_name($name) {
self::$name = $name;
}
public static function set_login($login) {
self::$login = $login;
}
public static function get_id() {
return self::$id;
}
public static function get_name() {
return self::$name;
}
public static function get_login() {
return self::login;
}
}
알 수 있습니다. 그것은 읽기만 가능합니다. $ name과 $ login은 읽고 쓸 수 있습니다. 일반 setter 및 getter를 사용하여 읽기 및 쓰기를 제어하는 것이 더 쉽고 덜 버그 있습니다. 매직 방법은 단지 마법이며, 일반적으로 마법은 구체적이지 않으며 코드에서 이해하기 쉽지 않습니다.
내가 원하는 마지막 요소는 왜 UserData가 정적일까요? 코드 전체에서 1 명의 사용자 만있는 경우가 아니라면 정적 인 코드를 사용하는 것이 좋습니다. 아마도 전체 그림을 얻지는 못 하겠지만 ID와 이름이있는 인스턴스를 인스턴스화해야 여러 인스턴스를 가질 수 있습니다. 그렇지 않으면 클래스 자체가 고유하기 때문에 왜 ID를 가지게 되는가?
[PHP 매뉴얼] (http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.members) :'Property 오버로딩은 객체 컨텍스트에서만 작동합니다. (...) 정적 컨텍스트에서 트리거되지 않습니다.'꽤 많이 합계. –
@Alvin 정적 컨텍스트에 대한 컨텍스트가있는 경우 정적 컨텍스트에 액세스 할 수 있습니다. 말도 안되지만 가능합니다. 내 대답 좀 봐. – Ihsan
"'DaneBilingowe :: $ {$ key} = $ val;'"- 실제로 각 사용자에 대한 하위 클래스를 만들었습니까? 그것이 바로 인스턴스입니다. '$ daneBillingowe = 새로운 UserData ('Dane Billingowe'); - 문제가 해결 되었습니까? –