управление видимостью __get

  • Автор темы Автор темы gonza
  • Дата начала Дата начала

gonza

Новичок
управление видимостью __get

Правильно ли я понимаю что все свойства, отрабатываемые __get, являются публичными?
 
Наоборот, свойства, которые видны в месте обращения, отдаются как есть, невидимые идут в __get().
 
свойства, отрабатываемые __get

ps. то что они отрабатываются __get, подразумевает их "мнимость". Речь идет о управлении видимостью. То есть о невозможности сделать их protected...
 
Это в каком смысле ?

Код:
class oo
{
 public $a;
 private $b;
 protected $c;

 public function __construct()
 {
  $this->a = 'value of a';
  $this->b = 'value of b';
  $this->c = 'value of c';
 }

 public function __get($arg)
 {
   return $arg;
 }
}

class foo extends oo
{
  public function __get($arg)
  {
        return 'fake value '.$arg;
  }

  public function getc()
  {
     return $this->c;
  }

}

$z = new oo();
echo "Parent class: \r\n";
echo 'a='.$z->a."\r\nb=".$z->b."\r\nc=".$z->c."\r\n";

echo "Child class: \r\n";
$q = new foo();
echo 'a='.$q->a."\r\nb=".$q->b."\r\nc=".$q->c."\r\n";
echo 'c from function: '.$q->getc()."\r\n";
 
мда...

Конкретно... Имеется класс обработки текстовых файлов.
файл загоняется в привате $sc
Длина sc в private $sc_len
текущая позиция private $pos

Во время обработки этой строки($this->sc) во многих методах приходится проверять не настал ли конец строки
($this->sc_len == $this->pos)

Я объявил метод

protected function _EOF(){
return $this->sc_len == $this->pos;
}

и соответственно использую типа такого:
if($this->_EOF()) bla.. bla..

Тут мне подумалось оформить это свойством

__get($name){

if($name == 'EOF') return $this->sc_len == $this->pos;

}

и соответственно использовать так:
if($this->EOF) bla.. bla..

Но тут возникает вопрос - свойство видимо снаружи, то есть оно
public
Чтение мануала привело к предположению о невозможности управления видимостью из __get
Но прямых указаний на это я не нашел, вот и решил уточнить...
 
if($this->_EOF()) bla.. bla..
if($this->EOF) bla.. bla..
не пойму, чем второе лучше первого (разве только нет _ - ну да вы его сами придумали).
к тому же метод от свойства отличается не только синтаксисом, и смешивать эти понятия нельзя.
 
Я не пойму чем рид-онли свойство, торчащее как паблик может помешать. Эстетические проблемы ?

А так да, гет всегда публичный.
 
Автор оригинала: Skubent
Я не пойму чем рид-онли свойство, торчащее как паблик может помешать. Эстетические проблемы ?

А так да, гет всегда публичный.
А если нет, то он поведет себя по другому?

ps. У меня нет проблем или какого либо беспокойства. Я сделал вывод и хочу убедится в его правильности...
Спасибо за помощь...

-~{}~ 06.02.07 12:41:

Автор оригинала: hermit_refined
к тому же метод от свойства отличается не только синтаксисом, и смешивать эти понятия нельзя.
я в шоке...
 
gonza,
All overloading methods must not be defined as static. In PHP 5.0.x, all overloading methods must be defined as public. (c) мануал.
 
Автор оригинала: Skubent
gonza,
All overloading methods must not be defined as static. In PHP 5.0.x, all overloading methods must be defined as public. (c) мануал.
При чем здесь видимость методов, если речь идет о видимости свойств, этими методами эмулируемых?

В общем нашел как спрятать свойство, отрабатываемое __get, способ не идеальный, никому не навязываю, искал чисто в рамках мною же заданного вопроса.
PHP:
class some_parser{

		protected $public = 0;

		function __construct(){

			$this->public++;

			...

			$this->public--;
		}

		function __call($name, $argv){

			if(method_exists($this, $method = 'hidden_'.$name)){
				++$this->public;
				$ret_val = $this->$method($argv);
				--$this->public;
				return $ret_val;
			}
			else $this->err("Unknown method $name called");

		}

		function __get($name){

			if( $this->public && ($name == 'EOF') ) return $this->pos == $this->sc_len;
			else trigger_error("undefined property $name", E_USER_NOTICE);

		}

}
Все публичные методы оформляются protected prefix_name(в данном случае префикс hidden_), снаружи видны как public name
В конструкторах этого класса и наследников либо используются строго вызовы пабликов либо код обрамляется

$this->public++; ... $this->public--;

Изврат в общем... Люблю извраты...
 
gonza, чем возвращаемое значение от переменной отличается знаешь ?

А по второй части... Можно еще гвозди микроскопом заколачивать...
 
Автор оригинала: Skubent
gonza, чем возвращаемое значение от переменной отличается знаешь ?
Готов выслушать...
Автор оригинала: Skubent
А по второй части... Можно еще гвозди микроскопом заколачивать...
Можно... А можно читать повнимательнее. Тоже никто не запрещает...
 
gonza
нешуточная пессимизация + нечитабельность.
а извращенность прежде всего в вашем понимании ООП.
 
Автор оригинала: hermit_refined
нешуточная пессимизация + нечитабельность.
Эээ... Ничего что я сам указал на то что это не решение а костыль? И нужно было оно лишь для того что бы ответить на мой вопрос. Который был задан как раз для того что бы посмотреть, возможно ли это, как возможно и "должен ли я этого хотеть" ?

Автор оригинала: hermit_refined
а извращенность прежде всего в вашем понимании ООП.
напомни когда я рассказывал про свое понимание ООП. Откуда такие глубокие выводы?
 
Сверху