Расширение PHP статические классы

Я изучил все те, которые в Университете. Возможно, это зависит от курсов, которые Вы выбираете? Мои курсы были очень разнообразны (Разработка программного обеспечения, Дизайн UI, электронная коммерция, AI, Функциональное программирование, и т.д.). Разработка программного обеспечения имела воздействие шаблонам разработки и поблочному тестированию (один крупный проект, который включил различные вещи). Дизайн UI... мы были тремя группами человека, работающими над проектом. Мы ничего не могли сделать без управления версиями, таким образом, мы получили это. И гибкая разработка была чем-то, о чем наши преподаватели непрерывно говорили нам, но они оставили ее до каждой группы для использования ее.

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

19
задан treznik 14 August 2009 в 22:25
поделиться

3 ответа

Опять же, это было невозможно до PHP 5.3.0.

Позднее статическое связывание было введено в PHP 5.3.0 и позволяет вам делать именно то, что вы хотите, через static ключевое слово.

class Super {
    protected static $title = 'super';
    public static function get_class_name()        
    {
        echo __CLASS__;
    }
    public static function get_title()
    {
        echo static::$title;
    }
}
class Sub extends Super {
    protected static $title = 'sub';
}

get_class_name () по-прежнему будет возвращать Super , хотя имеет __ CLASS __ всегда возвращает текущий класс, в котором объявлен запускаемый метод ( вроде __ FILE __ , который всегда возвращает текущий файл, независимо от того, включили вы его или нет).

Для этого у вас нет другого выбора, кроме как повторно объявить функцию в Подкласс .

class Super {
    protected static $title = 'super';
    public static function get_class_name()        
    {
        echo __CLASS__;
    }
    public static function get_title()
    {
        echo static::$title;
    }
}
class Sub extends Super {
    protected static $title = 'sub';

    public static function get_class_name()        
    {
        echo __CLASS__;
    }
}
31
ответ дан 30 November 2019 в 03:48
поделиться

Вы можете использовать get_called_class () , чтобы получить имя класса вызываемого вами класса, даже если оно статическое. Вам не нужно его нигде объявлять.

Из примера Эндрю:

class Super {
    public static function get_class1_name()        
    {
        echo __CLASS__;
    }
    public static function get_title()
    {
        echo get_called_class();
    }

}
class Sub extends Super {    
    public static function get_class2_name()        
    {
        echo __CLASS__;
    }

}
Sub::get_title(); // Echos Sub.
Sub::get_class1_Name(); // echos super
Sub::get_class2_Name(); // echos sub

Следовательно, вам не нужно объявлять никакие переменные.

3
ответ дан 30 November 2019 в 03:48
поделиться

К счастью, я кое-что делаю для себя, поэтому сказал: «К черту, я использую PHP5.3». Но даже в этом случае мне не нравится, что я должен повторно объявлять "get _class _name" в каждом классе, возможно, я расширяю примерно 10 классов. Итак, я придумал следующее решение:

class Super {
    protected static $classname = __CLASS__;
    public static function get_classname($name)
    {
        static::$classname = $name;
    }
    public static function get_classname()
    {
        return static::$classname;
    }
}
class Sub1 extends Super { }
class Sub2 extends Super { }
class Sub3 extends Super { }

$classes = get_declared_classes();
foreach($classes as $k => $v)
{
    if (is_subclass_of($v, 'Super'))
    {
        $v::set_classname($v);
    }
}

echo Sub1::get_classname(); // Sub1
echo Sub2::get_classname(); // Sub2
echo Sub3::get_classname(); // Sub3

Это может показаться немного грязным, но я не думаю, что это так уж плохо. После этого вы, наконец, можете расширить статические методы без повторного объявления методов.

0
ответ дан 30 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: