2009-05-22 2 views
1

Я создаю функцию __get() для класса для контроля доступа к моим частным переменным-членам. Нужно ли мне создавать функцию для обработки всех возможных значений значений члена или я не могу написать ее для публичных пользователей? Кроме того, я предполагаю, что классы, наследующие этот класс, будут использовать мою функцию __get() для доступа к закрытым членам.Нужно ли перегружать __get управлять всеми переменными-членами?

class ClassA{ 
    private $collection = array(); 
    public $value; 

    function __get($item){ 
    return $collection[$item]; 
    } 

ответ

1

Нет, вы этого не сделаете.


class A { 
    public $foo = 'bar'; 
    private $private = array(); 

    public function __get($key) { 
     echo 'Called __get() at line #' ,__LINE__, ' with key {', $key ,'}',"\n"; 
     return $this->private[$key]; 
    } 

    public function __set($key, $val) { 
     $this->private[$key] = $val; 
    } 
} 


$a = new A(); 

var_dump($a->foo); 
$a->bar = 'baz'; 
var_dump($a->bar); 

И да, это будет:


class B extends A { private $private = array(); } 
$b = new B(); 
var_dump($b->bar); 
0

Ну, ваш код будет терпеть неудачу на частные предметы не установлены в вашем массиве. Но опять же, вы можете использовать это как способ справиться с тем, что входит в ваш массив и из него;

function __get($item){ 
    if (isset ($collection[$item])) 
     return $collection[$item]; 
    else { 
     try { 
      return $this->$item ; // Dynamically try public values 
     } catch (Exception $e) { 
      $collection[$item] = 0 ; // Make it exist 
     } 
    } 
    } 

Классы, которые унаследуют ваши звонки будут использовать эту __get(), но может быть отменено, так что используйте родителю :: __ конструкт() для явной форме. Также обратите внимание, что они не могут быть статическими. Further reading.

+0

Я могу справиться с этим при перегрузке __isset(). –

0

Прежде всего PHP ищет имя свойства в определении класса и пытается вернуть его значение. Если нет свойства - PHP пытается вызвать __get ($ var), и здесь вы можете вернуть все, что захотите. Это немного запутанное поведение для тех, кто знает Java-подобные геттеры/сеттеры, где вы должны определить их для каждого члена класса, к которому вы хотите получить доступ.

Когда это удобно использовать Java-как геттеры/сеттеры - вы можете написать что-то вроде этого:

public function __set($var, $value) 
{ 
    if (method_exists($this, $method = "_set_" . $var)) 
    { 
     call_user_func(array($this, $method), $value); 
    } 
} 
public function __get($var) 
{ 
    if (method_exists($this, $method = "_get_" . $var)) 
    { 
     return call_user_func(array($this, $method), $value); 
    } 
} 

, а затем использовать этот код, определив пользовательские Геттеры/сеттеры

protected function _get_myValue() 
    { 
     return $this->_myValue; 
    } 
protected function _set_myValue($value) 
{ 
    $this->_myValue = $value; 
} 

и получить доступ к к определенным методам таким образом:

$obj->myValue = 'Hello world!'; 
Смежные вопросы