Here is a working code with a static method. It also uses the fact that the static method can access private ivars :)
It also uses PHP awesome reflexivity <3.
The good point about that code is that Person
is the class to provide the sort method, which is better on an OOP point of view. Only the class Person
should be the one to know how to sort other Person
. Neither People
or another indepent function should.
Note: not using is_callable()
, as it only verifies if the parameter can be called as a function, but does not check if it's actually callable with the current visibility (public, private, protected)
class Person
{
private $name, $sex, $age;
public function Person($name, $sex, $age)
{
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
public static function sortByName(Person $p1, Person $p2)
{
return strcmp($p1->name, $p2->name);
}
public static function sortByAge(Person $p1, Person $p2)
{
return ($p1->age - $p2->age);
}
}
class People
{
private $people = array();
public function addPerson($name, $sex, $age)
{
$this->people[] = new Person($name, $sex, $age);
}
public function display()
{
print_r($this->people);
}
public function sort($attribute = 'name')
{
$sortFct = 'sortBy' . ucfirst(strtolower($attribute));
if (!in_array($sortFct, get_class_methods('Person')))
{
throw new Exception('People->sort(): Can\'t sort by ' . $attribute);
}
usort($this->people, 'Person::' . $sortFct);
}
}
$people = new People;
$people->addPerson('Steve', 'M', 31);
$people->addPerson('John', 'M', 24);
$people->addPerson('Jane', 'F', 26);
$people->addPerson('Sally', 'F', 21);
$people->display();
$people->sort();
$people->display();
$people->sort('age');
$people->display();