<?php header("Content-type: text/html; Charset= utf-8") ;
define('MAN', "мужик");
define('WOM', "женщина");
class Man
{
protected $name; // имя
protected $age; // возраст
protected $pol; // пол
protected $massa;// вес
public function __construct($nam, $ag, $pol, $mass)
{
$this->name=$nam;
$this->age=$ag;
$this->pol=$pol;
$this->massa=$mass;
}
public function prints($object) //вывод мужчины/женщины
{
return "Имя: ".$object->name."</br>Возраст: ".$object->age."</br>Пол: ".$object->pol."</br>Масса: ".$object->massa;
}
public function edit_name($new_name)//редактирование имени мужчины/женщины
{
$this->name=$new_name;
}
public function edit_age($new_age)//редактирование возраста мужчины/женщины
{
$this->age=$new_age;
}
public function edit_mass($new_mass)//редактирование массы мужчины/женщины
{
$this->massa=$new_mass;
}
}
class Student extends Man
{
protected $god_obych;//год обучения
public function __construct($nam, $ag, $pol, $mass, $god)
{
$this->god_obych=$god;
parent ::__construct($nam, $ag, $pol, $mass);
}
public function prints_st($object) //вывод студента
{
return parent :: prints($object)."</br>Год: ".$object->god_obych;
}
public function edit_god($new_god) //редактровать год обучения студента
{
$this->god_obych=$new_god;
}
public function yvel_na_let($let)//увеличение обучающих лет студента
{
$this->god_obych+=$let;
}
}
$man= new Man('Максим',20, MAN, 89);
$stud= new Student('Сергей',20, MAN, 89, 1990);
echo "<h2>Это мужчина/женщина:</h2>".$man->prints($man);
echo "<h2>Это студент:</h2>".$stud->prints_st($stud) ;
$man->edit_name('Сергей');
$man->edit_age(30);
$man->edit_mass(100);
echo "<h2>Это Отредактированые мужчина/женщина:</h2>".$man->prints($man);
$stud->edit_age(16);
echo "<h2>Это отредактированный студент:</h2>".$stud->prints_st($stud) ;
$stud->yvel_na_let(3);
echo "<h2>Увеличение года обучения студента</h2>".$stud->prints_st($stud) ;
?>
Спустя 4 часа, 21 минута, 55 секунд (16.08.2012 - 00:38) SlavaFr написал(а):
Цитата (lodas @ 15.08.2012 - 18:17) |
Здравствуйте уважаемые форумчане. Есть у меня задание по классу Человек(см. в приложенной картинке). Я ее как мог реализовал, правильно ли у меня получилось? Можно ли как то его упростить?
|
зачем засорять глобальную тереторию константами MAN и WOM
Зделай их лучше константами твоего класса
const MAN = .....
Имена класов, методов и название переменных это единственный способ потом понять код и возможное его переменное
Или по английски или по руски. не надо делать все в перемешку.
так что $name, $age, $sex, $weight
По чему класс назван Man если он может быт также Women?
Может просто назвать его "Person"?
Функции edit_... являются обычными set методами, так что не стесняйся и дай им соотвестственно имена setName, setSex, setAge, setWeight,
создай также соответсвенно 'get' методы.
используй set-методы также и в конструкторе и не инициализируй переменные на прямую.
нет смысла употреблять в методе prints параметер, так как ты все ровно подразумеваеш работать с Person, лучше чтоб каждая персона сaма могла себя печатать. Для этого используй просто в этом методе $this вместо передачи обэкта.
переименнуй метод prints в __toString и это даст тебе возможность просто писать
echo $man;
новая функция print_st имеет плохое название и не каждому прийдет в голову что ты подразумеваеш в "_st"
Kроме того она обсалютно не нужна, не только по тому, что названия print дастаточно но и по тому, что преемущественно переписать __toString ( и так же использовать внутри parent::__toString() )
метод yvel_na_let также не мешало назвать более понятным для всех, например addAcademicYear()
про наименование функции edit_god ты уже наверное догадался сам :)
Спустя 9 часов, 21 минута, 18 секунд (16.08.2012 - 10:00) lodas написал(а):
Спасибо SlavaFr. Так как я еще совсем новичёк в ООП, у меня возникло два вопроса:
1)Как здесь можно использовать set-методы в конструкторе(ведь в конструкторе объекты только создаются и в них еще нет никаких данных) и что ты имел в виду под не "инициализируй переменные на прямую"?
2)Ели я уберу функцию print_st как ее переписать __toString и использовать внутри parent::__toString() ?
1)Как здесь можно использовать set-методы в конструкторе(ведь в конструкторе объекты только создаются и в них еще нет никаких данных) и что ты имел в виду под не "инициализируй переменные на прямую"?
2)Ели я уберу функцию print_st как ее переписать __toString и использовать внутри parent::__toString() ?
Спустя 4 часа, 30 минут, 27 секунд (16.08.2012 - 14:30) SlavaFr написал(а):
Цитата (lodas @ 16.08.2012 - 08:00) |
Спасибо SlavaFr. Так как я еще совсем новичёк в ООП, у меня возникло два вопроса: 1)Как здесь можно использовать set-методы в конструкторе(ведь в конструкторе объекты только создаются и в них еще нет никаких данных) и что ты имел в виду под не "инициализируй переменные на прямую"? 2)Ели я уберу функцию print_st как ее переписать __toString и использовать внутри parent::__toString() ? |
1) при вызове конструктора все переменные и методы класса известны
елси у тебя уже есть set методы то ты можеш их использовать в конструкторе.
public function __construct($namе, $agе, $sex, $weight)
{
$this->setName($name);
$this->setSex($sex);
$this->setAge($age);
$this->setWeight($weight);
}
так делать лучше, так как возможно в будующем тебе прийдется при заполнении определеного свойства производить какие нибудь дополнительные действия и это очень удобно когда ты это можеш делать не в конструкторе или других местах твоего кода, а прямо в пренадлежащей для этого set-методе.
2) да
Спустя 22 часа, 24 минуты, 50 секунд (17.08.2012 - 12:55) lodas написал(а):
По первому пункту круто-не додумался)) А второй я так и не понял как реализовать, не могли бы показать как оно будет?
Спустя 3 часа, 55 минут, 20 секунд (17.08.2012 - 16:50) johniek_comp написал(а):
обычный говнокод, наверно препод не то хотел