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

gonza

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

Правильно ли я понимаю что все свойства, отрабатываемые __get, являются публичными?
 

Skubent

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

gonza

Новичок
свойства, отрабатываемые __get

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

Skubent

Новичок
Это в каком смысле ?

Код:
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";
 

gonza

Новичок
мда...

Конкретно... Имеется класс обработки текстовых файлов.
файл загоняется в привате $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
Но прямых указаний на это я не нашел, вот и решил уточнить...
 

hermit_refined

Отшельник
if($this->_EOF()) bla.. bla..
if($this->EOF) bla.. bla..
не пойму, чем второе лучше первого (разве только нет _ - ну да вы его сами придумали).
к тому же метод от свойства отличается не только синтаксисом, и смешивать эти понятия нельзя.
 

Skubent

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

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

gonza

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

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

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

-~{}~ 06.02.07 12:41:

Автор оригинала: hermit_refined
к тому же метод от свойства отличается не только синтаксисом, и смешивать эти понятия нельзя.
я в шоке...
 

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) мануал.
 

gonza

Новичок
Автор оригинала: 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--;

Изврат в общем... Люблю извраты...
 

Skubent

Новичок
gonza, чем возвращаемое значение от переменной отличается знаешь ?

А по второй части... Можно еще гвозди микроскопом заколачивать...
 

gonza

Новичок
Автор оригинала: Skubent
gonza, чем возвращаемое значение от переменной отличается знаешь ?
Готов выслушать...
Автор оригинала: Skubent
А по второй части... Можно еще гвозди микроскопом заколачивать...
Можно... А можно читать повнимательнее. Тоже никто не запрещает...
 

hermit_refined

Отшельник
gonza
нешуточная пессимизация + нечитабельность.
а извращенность прежде всего в вашем понимании ООП.
 

gonza

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

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