PHP5 наследование статических методов. Перегрузки. Получение названного имени класса - PullRequest
1 голос
/ 26 февраля 2011

У меня хорошее понимание, но плохое понимание его реализации в php ...

У меня есть следующий код, надеюсь, он самодокументирован =).

Мне нужно иметь BB на выходе

class A{
    // I can't copy function::classname() to all my descendant classes

    static function classname(){
        echo __CLASS__;
    }
}

class B extends A{

    static function test(){
        self::classname();
    }

    function test1(){
        self::classname();
    }



    //i have A LOT of static and non-static functions using self::classname() in their code
    // I can't copy all them to base class
    }

    $v = new B();
    B::test();
    $v->test1();

Я застрял с static:: и self:: синтаксисом


PS: еще один безумный вопрос, с которым я столкнулся:

Предположим, у меня есть

function doSomething(){
    echo $this->id;
}

Иногда это попадает в статический контекст. Да, я знаю, это потому, что у меня плохой дизайн приложения. Но возможно ли создать вторую (зеркальную, перегрузочную) функцию

static function doSomething(){
    echo false;
}

Это означает, что использование $obj->doSomething() возвращает id и с использованием Class::doSomething() возвращает false


Вопрос 3:

Можно ли автоматически получить значение по умолчанию свойства в статическом контексте и значение свойства в нестатическом контексте автоматически?

Ответы [ 3 ]

5 голосов
/ 26 февраля 2011

Взгляните на позднюю статическую привязку .

class A {
    static function classname() {
        echo __CLASS__;
    }

    static function test1() {
        static::classname();
    }
}

class B extends A {
    static function classname() { 
        echo __CLASS__;
    }
}

$v = new B();
B::test1();
$v->test1();

Или, как указано Длинными ушами в комментариях, предполагая, что php 5.3.0+ вы можете использовать get_called_class()

class A {
    static function classname() {
        echo get_called_class();
    }

    // this can be defined in either class A or B without affecting the output
    static function test1() {
        static::classname();
    }
}

class B extends A {
}

$v = new B();
B::test1();
$v->test1();

Выходы:

BB
2 голосов
/ 26 февраля 2011

Относительно вашего второго "сумасшедшего" вопроса см. Магические методы .По сути, вам нужно реализовать что-то вроде:

class Foo
{
  public function __call($name, $arguments)
  {
    // call the _$name function
  }

  public static function __callStatic($name, $arguments)
  {
    // call the _{$name}_static function
  }

  private function _bar()
  {
  }

  private static function _bar_static()
  {
  }
}

$foo = new Foo();
$foo->bar();
Foo::bar();
0 голосов
/ 05 февраля 2014

можно добавить статический метод, подобный этому

class Foo {   
public static function __callStatic()   {
// ....     
}
}

// in Other file 

// Call the static method   
Foo-->__callStatic()

и вызвать его в другом файле (в php)?

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