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

Форум PHP

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

 

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

вид форума:
Линейный форум Структурный форум

тема: Использование методов __get и __set
 
 автор: jeans1986   (20.07.2006 в 22:04)   письмо автору
 
 

Обьясните пожалуйста что они делают. И если не затруднит приведите пример. Заранее благодарю.

   
 
 автор: cheops   (21.07.2006 в 10:02)   письмо автору
 
   для: jeans1986   (20.07.2006 в 22:04)
 

Если переменная класса закрыта, то обращаться к ней из вне можно только через открытые методы, для того, чтобы это выглядело так будто это просто открытая переменная, к которой можно непосредственно обращаться и присваивать значения используются методы __set() и __get() класса, которые перехватывают обращения к переменной. Таким образом, можно регистрировать в объекте не существующие переменные и обращаться к ним. Контроль за этой деятельностью реализуется в методах __set() и __get().
<?php
  
class GetSet
  
{
    
// Объявляем закрытый член класса
    
private $member;
    
// Объявляем метод __set, позволяющий присваивать значение
    // закрытой переменной
    
function __set($name,$value)
    {
      
// Если передаваемое функции значение $value
      // меньше нуля генерируем исключение
      
if($value<0$this->member[$name] = 0;
      
// Если $value больше нуля присваеваем его
      // закрытому члену $member
      
else $this->member[$name] = $value;
    }
    
// Объявляем метод __get, возвращающий значение
    // закрытой переменной
    
function __get($name)
    {
      return isset(
$this->member[$name]) ? 
             
$this->member[$name] : 'not set';
    }
  }
  
// Объявляем объект класса GetSet
  
$obj = new GetSet;
  
// Заносим во внутренние переменные класса значения хитов
  
$obj->path 100;
  echo 
$obj->path;
?>

   
 
 автор: jeans1986   (21.07.2006 в 10:28)   письмо автору
 
   для: cheops   (21.07.2006 в 10:02)
 

Спасибо за ответ. Но исходя из того примера получается что самой переменной $memeber не присваивается никакое значение, а присваевается масиву $memeber c ключом $name. Вот как раз я этот моент не понял. Если не затруднит обьясните пожалуйста

   
 
 автор: cheops   (21.07.2006 в 10:41)   письмо автору
 
   для: jeans1986   (21.07.2006 в 10:28)
 

Да так и есть, в массиве $member мы регистрируем переменные, точнее свойства класса, которые могут менять динамически. Однако методы __set() и __get() позволяют ограничить значения и имена таких динамических свойст. Например в приведённом выше классе, нельзя добавлять переменные меньше 0.

   
 
 автор: jeans1986   (21.07.2006 в 11:13)   письмо автору
 
   для: cheops   (21.07.2006 в 10:41)
 

как я понял у метода __set() - два параметра - одно имя а второе значение. но если у нас например два сккрытых члена например, private $m1,private $m2. КАК работает в этом случае метод __set() и __пуе(). ЕСЛИ НЕ ТРУДНО ПРИМЕР ПРИВЕДИТЕ. зАРАНЕЕ БЛАГОДАРЮ

   
 
 автор: cheops   (21.07.2006 в 23:30)   письмо автору
 
   для: jeans1986   (21.07.2006 в 11:13)
 

А как определите, вы можете регистрировать параметры в $m1, можете в $m2, можете в двух сразу... реализация находится полностью в ведении разработчика.

   
 
 автор: jeans1986   (21.07.2006 в 23:41)   письмо автору
 
   для: cheops   (21.07.2006 в 23:30)
 

А если я хочу одновременно обоим присвоить разные значения. в таком случае как поступить?

   
 
 автор: cheops   (21.07.2006 в 23:53)   письмо автору
 
   для: jeans1986   (21.07.2006 в 23:41)
 

Изменить число параметров не удасться, т.е. одновременно не получиться, но можно так настроить методы __get() и __set(), что они будут реагировать на префикс сохраняемого параметра или его значение. Если они удовлетворяют каким-либо свойством - обращаемся к $m1, если нет - $m2.

   
Rambler's Top100
вверх

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