Как я могу достичь такого рода отношений (наследование, композиция, что-то еще)? - PullRequest
0 голосов
/ 03 апреля 2010

Я хотел бы создать основу классов для приложения, два из которых - человек и студент. Человек может быть или не быть студентом, а студент всегда является человеком. Тот факт, что студент «является» человеком, заставил меня попробовать наследование, но я не понимаю, как заставить его работать в случае, когда у меня есть DAO, который возвращает экземпляр лица, и затем я хочу определить, является ли этот человек является студентом и вызывает для него методы, связанные со студентом.

class Person {
    private $_firstName;

    public function isStudent() {
        // figure out if this person is a student
        return true; // (or false)
    }
}

class Student extends Person {
    private $_gpa;

    public function getGpa() {
        // do something to retrieve this student's gpa
        return 4.0; // (or whatever it is)
    }
}

class SomeDaoThatReturnsPersonInstances {
    public function find() {
        return new Person();
    }
}

$myPerson = SomeDaoThatReturnsPersonInstances::find();

if($myPerson->isStudent()) {
    echo 'My person\'s GPA is: ', $myPerson->getGpa();
}

Это, очевидно, не работает, но как лучше всего достичь этого эффекта? Композиция мне не нравится, потому что у человека нет «ученика». Я не ищу решение обязательно, но, возможно, просто термин или фразу для поиска. Поскольку я не совсем уверен, как назвать то, что я пытаюсь сделать, мне не повезло. Спасибо!

1 Ответ

0 голосов
/ 03 апреля 2010
<?php
class Person {
    #Can check to see if a person is a student outside the class with use of the variable
    #if ($Person->isStudentVar) {}
    #Or with the function
    #if ($Person->isStdentFunc()) {}

    public $isStudentVar = FALSE;  

    public function isStudentFunc() {
        return FALSE;
    }
}

class Student extends Person {
    #This class overrides the default settings set by the Person Class.
    #Also makes use of a private variable that can not be read/modified outside the class

    private $isStudentVar = TRUE;  

    public function isStudentFunc() {
        return $this->isStudentVar;
    }

    public function mymethod() {
        #This method extends the functionality of Student
    }
}

$myPerson1 = new Person;
if($myPerson1->isStudentVar) { echo "Is a Student"; } else { echo "Is not a Student"; }
#Output: Is not a Student

$myPerson2 = new Student;
if($myPerson2->isStudentFunc()) { echo "Is a Student"; } else { echo "Is not a Student"; }
#Output: Is a Student
?>

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

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