|
|
|
| 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>";
?>
|
| |
|
|
|
|
|
|
|
для: Фоат
(04.11.2011 в 18:58)
| | ну вообще для того чтобы можно было прочитать свойство но нельзя было его переписать.
но в данном случае это акутально только к свойству
| |
|
|
|
|
|
|
|
для: sl1p
(04.11.2011 в 19:33)
| | Все бы хорошо, НО , если удалить метод get(). и поставить член , например, name в спецификатор доступа private и в попробывать его вызвать явно
$obj->name = $name = "Вадим";
print_r($obj);
|
блокирует и без аксессора | |
|
|
|
|
|
|
|
для: Фоат
(04.11.2011 в 18:58)
| | Бич программного обеспечения, которое живет больше года - изменяющиеся к нему требования (чем больше система, тем труднее и дороже её модифицировать). Допустим (по-моему схожий пример чуть попозже описывается), вы забиваете возраст age обычной числом 40 лет. Через несколько лет выясняется, что это не совсем удачный способ хранения возраста работника, так как года идут а количество лет не меняется. Т.е. нужно было с самого начала забивать дату рождения или хотя бы дату регистрации возраста, тогда можно было бы организовать автоматическое приращение возраста age по мере увеличения срока хранения данных. За годы работы и развития системы у вас уже тысячи обращений $obj->age, поправить их на новое поле не представляется возможным, даже если поправите потребуются недели или месяцы отладки, так как где-то ситуация все-равно забудут исправить. Вот тут аксессоры и пригождаются, если обращение к $obj->age идет через аксессор, вы можете изменить логику обработки поля age внутри __get() в одном месте и она автоматически распространится на все остальные участки программы. Это довольно простой пример, но такие ситуации возникают довольно часто в больших программах с длительным сопровождением.
PS Возможности ООП обычно очень трудно демонстрировать, так как они в полную силу проявляются только в очень больших программных комплексах. На компактных и коротких приложениях эффективность и преимущества ООП продемонстрировать затруднительно, более того, в случае небольших приложений ООП-подход наоборот приводит к избыточному коду и неэффективности. Поэтому все ООП-приемы следует примерять на большие и гигантские системы. | |
|
|
|
|
|
|
|
для: cheops
(04.11.2011 в 20:29)
| | пример этот помню, да действительно, там его надобность есть. Спасибо Всем ! :) | |
|
|
|