Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Модификатор доступа и метод __get()

Сообщения:  [1-7] 

 
 автор: centnerik   (07.11.2009 в 21:04)   письмо автору
 
   для: neadekvat   (07.11.2009 в 20:56)
 

Как всегда, все гениальное - просто и без изобретения колеса... :-) Спасибо.

  Ответить  
 
 автор: neadekvat   (07.11.2009 в 20:56)   письмо автору
 
   для: centnerik   (07.11.2009 в 19:38)
 

К членам класса (переменным, объявленным в классе), имеющим спецификатор доступа public, доступ открыт и никаких методов для их вывода не нужно.
К тем, что имеют доступ private и protected, доступ закрыт и напрямую к ним обратиться нельзя. Для этого и используется __get() (конечно, функция должна иметь доступ public)

<?php
class one {
  public 
$variable "Переменная";
}

$obj = new one;
echo 
$obj->variable// выведет "Переменная"


<?php
class one {
// protected - почти private, но переменная становится доступной и для наследников класса
  
private $variable "Переменная";
}

$obj = new one;
echo 
$obj->variable// такой "маневр" закончится фатальной ошибкой


<?php
class one {
// protected - почти private, но переменная становится доступной и для наследников класса
  
private $variable"Переменная";
  
  public function 
__get($var) {
    return 
$this->variable;
  }
}

$obj = new one;
echo 
$obj->variable// снова выведет "Переменная"

  Ответить  
 
 автор: centnerik   (07.11.2009 в 19:38)   письмо автору
 
   для: neadekvat   (07.11.2009 в 18:56)
 

Примеры с ходу не приведу, особо РНР не увлекаюсь (время...), но я сейчас, отвечая на сообщения, немного разобрался с тем, что Вы говорили выше.

Получается, что
для защищенных переменных функция доступа вызывается автоматически и возвращает либо значение, либо ошибку.
Для public-переменных просто идет проверка на наличие переменной с таким именем в классе, и т.д.... Модификатор доступа не имеет никакого отношения к отображению переменных класса, например, используя echo.
Я Вас правильно понял ?

Насчет примера... Вы можете представить небольшые фрагменты кода, где можно было бы наглядно просмотреть обращение к защищенным и частным переменным экземпляра ?

  Ответить  
 
 автор: neadekvat   (07.11.2009 в 18:56)   письмо автору
 
   для: centnerik   (07.11.2009 в 17:36)
 

Что-то я не совсем вас понимаю.
Приведите примеры кода (как идет обращение к защищенным членам класса)

  Ответить  
 
 автор: centnerik   (07.11.2009 в 17:36)   письмо автору
 
   для: neadekvat   (07.11.2009 в 17:16)
 

>т.е. будет являться рабочим методом класса

Возможно я не в том контексте использую этот метод, но интересен сам факт, что при закомментированном определении метода модификатор работает, а в противном случае обращение к переменной идет без явного указания метода. Или если он определен в классе, то вызывается автоматически ?

  Ответить  
 
 автор: neadekvat   (07.11.2009 в 17:16)   письмо автору
 
   для: centnerik   (07.11.2009 в 16:58)
 

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

  Ответить  
 
 автор: centnerik   (07.11.2009 в 16:58)   письмо автору
724 байт
 
 

Здравствуйте.
Объясните пожалуйста поведение скрипта (на скрепке).
Переменные класса обявлены как protected. Насколько я понимаю, для доступа к таким переменным необходим специальный метод и получить значение переменной можно только через этот метод, т. е. $somevar->__get('varName'). Но, если в приложенном к посту файле раскомментировать определение функции __get(), то, несмотря на модификатор protected, доступ к переменным можно получить обратившись как $somevar->varName.
Возможно это нормально, но есть сомнение, что что-то не так.
Заранее спасибо.

  Ответить  

Сообщения:  [1-7] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования