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.
Bu kod hakkında iyi bir nokta Person
bakış bir cepten noktasında daha iyi sıralama yöntemi sağlamak için sınıf olmasıdır. Sadece sınıf Person
Diğer Person
sıralamak için nasıl biri olmalıdır. Ne People
veya başka indepent işlev gerekir.
Not: parametresi bir işlev olarak adlandırılan olabilir eğer sadece doğrular gibi, is_callable()
kullanarak değil, ancak mevcut görünürlük ile aslında çağrılabilir olmadığını kontrol etmez (kamu, özel, korumalı)
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();