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

Форум PHP

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

 

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

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

тема: Аксессор __get()
 
 автор: Фоат   (04.11.2011 в 18:58)   письмо автору
 
 

toString.php


<?php

class emp
{


public function  
__construct($surname$name$oth$age 18)
{

    
$this->surname $surname;
    
$this->name $name;
    
$this->oth $oth;
    
$this->age $age;

}


public function 
__toString()
{
    return 
"{$this->surname}  {$this->name[0]}{$this->oth[0]}.";
}



public function  
__get($index)
{
    return 
$this->$index;
}

public 
$surname;
public 
$name;

private 
$oth;


}

?>


Для чего нужен в данном случае аксессор get()

toString1.php


<?php
require_once("toString.php");

$obj = new emp("Хаббатуллин",  "Фоат""Эдуардович");

echo 
"<pre>";
print_r($obj);

echo 
"</pre>";

?>

  Ответить  
 
 автор: sl1p   (04.11.2011 в 19:33)   письмо автору
 
   для: Фоат   (04.11.2011 в 18:58)
 

ну вообще для того чтобы можно было прочитать свойство но нельзя было его переписать.

но в данном случае это акутально только к свойству
private $oth; 

  Ответить  
 
 автор: Фоат   (04.11.2011 в 19:45)   письмо автору
 
   для: sl1p   (04.11.2011 в 19:33)
 

Все бы хорошо, НО , если удалить метод get(). и поставить член , например, name в спецификатор доступа private и в попробывать его вызвать явно

$obj->name = $name = "Вадим";
print_r($obj);


блокирует и без аксессора

  Ответить  
 
 автор: cheops   (04.11.2011 в 20:29)   письмо автору
 
   для: Фоат   (04.11.2011 в 18:58)
 

Бич программного обеспечения, которое живет больше года - изменяющиеся к нему требования (чем больше система, тем труднее и дороже её модифицировать). Допустим (по-моему схожий пример чуть попозже описывается), вы забиваете возраст age обычной числом 40 лет. Через несколько лет выясняется, что это не совсем удачный способ хранения возраста работника, так как года идут а количество лет не меняется. Т.е. нужно было с самого начала забивать дату рождения или хотя бы дату регистрации возраста, тогда можно было бы организовать автоматическое приращение возраста age по мере увеличения срока хранения данных. За годы работы и развития системы у вас уже тысячи обращений $obj->age, поправить их на новое поле не представляется возможным, даже если поправите потребуются недели или месяцы отладки, так как где-то ситуация все-равно забудут исправить. Вот тут аксессоры и пригождаются, если обращение к $obj->age идет через аксессор, вы можете изменить логику обработки поля age внутри __get() в одном месте и она автоматически распространится на все остальные участки программы. Это довольно простой пример, но такие ситуации возникают довольно часто в больших программах с длительным сопровождением.

PS Возможности ООП обычно очень трудно демонстрировать, так как они в полную силу проявляются только в очень больших программных комплексах. На компактных и коротких приложениях эффективность и преимущества ООП продемонстрировать затруднительно, более того, в случае небольших приложений ООП-подход наоборот приводит к избыточному коду и неэффективности. Поэтому все ООП-приемы следует примерять на большие и гигантские системы.

  Ответить  
 
 автор: Фоат   (04.11.2011 в 20:36)   письмо автору
 
   для: cheops   (04.11.2011 в 20:29)
 

пример этот помню, да действительно, там его надобность есть. Спасибо Всем ! :)

  Ответить  
Rambler's Top100
вверх

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