Тестовое задание на большой кусок времени

Nelius

кипарис во дворе
Вариант без Reflection... вроде работает
PHP:
function baseinhert($classname) {
    $classes = array_reverse(class_parents($classname));
    $classes[] = $classname;
    $base_methods = array_reverse(get_class_methods(array_shift($classes)));
    foreach ($classes as $key => $val) {
        $son_methods = array_reverse(get_class_methods($val));
        for ($i=0; $i<count($base_methods); $i++) {
            if (array_search($base_methods[$i], $son_methods) < count($base_methods)) { $me[] = $base_methods[$i]; }
        }
        $base_methods = $me; unset($me);
    }
    return $base_methods;
}

print '<pre>';
print_r(baseinhert('base_3'));
Вот мой тестовый скрипт полностью

PHP:
class base { 
    function a() {}
    function c() {}
    function d() {}
    function z() {}
} 

class base_1 extends base { 
    function a() {}
    function b() {}
    function g() {}
}

class base_2 extends base_1 { 
    function b() {}
    function z() {}
    function c() {}

} 

class base_3 extends base_2 { 
    function c() {}
    function z() {}
}


function baseinhert($classname) {
    $classes = array_reverse(class_parents($classname));
    $classes[] = $classname;
    $base_methods = array_reverse(get_class_methods(array_shift($classes)));
    print 'BASE METHODS<br>';
    print_r($base_methods);
    foreach ($classes as $key => $val) {
        $son_methods = array_reverse(get_class_methods($val));
        print  $val.' METHODS<br>';
        print_r($son_methods);
        for ($i=0; $i<count($base_methods); $i++) {
            if (array_search($base_methods[$i], $son_methods) < count($base_methods)) { $me[] = $base_methods[$i]; }
        }
        $base_methods = $me; unset($me);
        print  '!OVERLOADED METHODS<br>';
        print_r($base_methods);
    }
    return $base_methods;
}

print '<pre>';
print_r(baseinhert('base_3'));
 

Фанат

oncle terrible
Команда форума
Nelius, так это и есть один из факторов, проверяемых при поступлении на работу.
 

Nelius

кипарис во дворе
Да, в спешке скрипт еще и не доработал, щас поправлю. Он выводит щас все не переопределенные методы вместо переопределенных.
 

HraKK

Мудак
Команда форума
Почему я думаю он переделает скрипт, так чтоб он возвращал все перепределенные методы, даже которые не существуют в base?
 

Nelius

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

Алгоритм основан на том как функция get_class_methods обрабатывает классы.
get_class_methods('base_1');
Поместит в конец массива методы класса base которые не были переопределены в классе base_1. На основании этого я и пытался реализовать алгоритм.
Попробую сделать нормальную рабочую версию и выложу здесь.
 

weregod

unserializer
Автор оригинала: Nelius
Алгоритм основан на том как функция get_class_methods обрабатывает классы.
get_class_methods('base_1');
Поместит в конец массива методы класса base которые не были переопределены в классе base_1.
Опасно пользоваться недокументированными фичами.
 

Nelius

кипарис во дворе
weregod
Ну не знаю... Просто когда копался понял как работает функция get_class_methods(), кстати вполне логично работает, подумал что это можно использовать. Хотелось просто понять какие есть еще возможности решить задачу.
Как оказалось есть... и есть еще как минимум одна идея которую пока не проверил... :)
 

nerezus

Вселенский отказник
Nelius
а если метод не добавлен, а переопределен, как ты это определишь?
 

Nelius

кипарис во дворе
nerezus
Не добавлен куда? Недопонял высказывания.
А вообще я ничего не утверждаю, просто пробую, ищу пути.
Я выложу свой алгоритм когда доделаю. На работе нет возможности этим заниматься, постараюсь сегодня ночью дописать, если выйдет конечно :)
 
Сверху